commit 11997f8dc79ea37fb501ce3a6214d68baf42d511 Author: Anthony Hughes Date: Fri May 29 19:34:34 2026 +0100 First commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9a5354b --- /dev/null +++ b/LICENSE @@ -0,0 +1,155 @@ +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International + + Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + + Using Creative Commons Public Licenses + + Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. + + Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License + + By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + c. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + d. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + e. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + f. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + g. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + h. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. + + i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and + + B. produce and reproduce, but not Share, Adapted Material for NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. + +Section 3 – License Conditions. + + Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material, You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + For the avoidance of doubt, You do not have permission under this Public License to Share Adapted Material. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + +Section 4 – Sui Generis Database Rights. + + Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only and provided You do not Share Adapted Material; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + + Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. + + Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6abdbba --- /dev/null +++ b/README.md @@ -0,0 +1,116 @@ +# eleventy-base-blog v9 + +A starter repository showing how to build a blog with the [Eleventy](https://www.11ty.dev/) site generator (using the [v3.0 release](https://github.com/11ty/eleventy/releases/tag/v3.0.0)). + +## Getting Started + +* [Want a more generic/detailed getting started guide?](https://www.11ty.dev/docs/getting-started/) + +1. Make a directory and navigate to it: + +``` +mkdir my-blog-name +cd my-blog-name +``` + +2. Clone this Repository + +``` +git clone https://github.com/11ty/eleventy-base-blog.git . +``` + +_Optional:_ Review `eleventy.config.js` and `_data/metadata.js` to configure the site’s options and data. + +3. Install dependencies + +``` +npm install +``` + +4. Run Eleventy + +Generate a production-ready build to the `_site` folder: + +``` +npx @11ty/eleventy +``` + +Or build and host on a local development server: + +``` +npx @11ty/eleventy --serve +``` + +Or you can run [debug mode](https://www.11ty.dev/docs/debugging/) to see all the internals. + +## Features + +- Using [Eleventy v3](https://github.com/11ty/eleventy/releases/tag/v3.0.0) with zero-JavaScript output. + - Content is exclusively pre-rendered (this is a static site). + - Can easily [deploy to a subfolder without changing any content](https://www.11ty.dev/docs/plugins/html-base/) + - All URLs are decoupled from the content’s location on the file system. + - Configure templates via the [Eleventy Data Cascade](https://www.11ty.dev/docs/data-cascade/) +- **Performance focused**: four-hundos Lighthouse score out of the box! + - _0 Cumulative Layout Shift_ + - _0ms Total Blocking Time_ +- Local development live reload provided by [Eleventy Dev Server](https://www.11ty.dev/docs/dev-server/). +- Content-driven [navigation menu](https://www.11ty.dev/docs/plugins/navigation/) +- Fully automated [Image optimization](https://www.11ty.dev/docs/plugins/image/) + - Zero-JavaScript output. + - Support for modern image formats automatically (e.g. AVIF and WebP) + - Processes images on-request during `--serve` for speedy local builds. + - Prefers `` markup if possible (single image format) but switches automatically to `` for multiple image formats. + - Automated `` syntax markup with `srcset` and optional `sizes` + - Includes `width`/`height` attributes to avoid [content layout shift](https://web.dev/cls/). + - Includes `loading="lazy"` for native lazy loading without JavaScript. + - Includes [`decoding="async"`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decoding) + - Images can be co-located with blog post files. +- Per page CSS bundles [via `eleventy-plugin-bundle`](https://github.com/11ty/eleventy-plugin-bundle). +- Built-in [syntax highlighter](https://www.11ty.dev/docs/plugins/syntaxhighlight/) (zero-JavaScript output). +- Draft content: use `draft: true` to mark any template as a draft. Drafts are **only** included during `--serve`/`--watch` and are excluded from full builds. This is driven by the `addPreprocessor` configuration API in `eleventy.config.js`. Schema validator will show an error if non-boolean value is set in data cascade. +- Blog Posts + - Automated next/previous links + - Accessible deep links to headings +- Generated Pages + - Home, Archive, and About pages. + - [Atom feed included (with easy one-line swap to use RSS or JSON)](https://www.11ty.dev/docs/plugins/rss/) + - `sitemap.xml` + - Zero-maintenance tag pages ([View on the Demo](https://eleventy-base-blog.netlify.app/tags/)) + - Content not found (404) page + +## Demos + +- [Netlify](https://eleventy-base-blog.netlify.app/) +- [Vercel](https://demo-base-blog.11ty.dev/) +- [Cloudflare Pages](https://eleventy-base-blog-d2a.pages.dev/) +- [GitHub Pages](https://11ty.github.io/eleventy-base-blog/) + +## Deploy this to your own site + +Deploy this Eleventy site in just a few clicks on these services: + +- Read more about [Deploying an Eleventy project](https://www.11ty.dev/docs/deployment/) to the web. +- [Deploy this to **Netlify**](https://app.netlify.com/start/deploy?repository=https://github.com/11ty/eleventy-base-blog) +- [Deploy this to **Vercel**](https://vercel.com/import/project?template=11ty%2Feleventy-base-blog) +- Look in `.github/workflows/gh-pages.yml.sample` for information on [Deploying to **GitHub Pages**](https://www.11ty.dev/docs/deployment/#deploy-an-eleventy-project-to-git-hub-pages). +- [Try it out on **Stackblitz**](https://stackblitz.com/github/11ty/eleventy-base-blog) + +### Implementation Notes + +- `content/about/index.md` is an example of a content page. +- `content/blog/` has the blog posts but really they can live in any directory. They need only the `posts` tag to be included in the blog posts [collection](https://www.11ty.dev/docs/collections/). +- Use the `eleventyNavigation` key (via the [Eleventy Navigation plugin](https://www.11ty.dev/docs/plugins/navigation/)) in your front matter to add a template to the top level site navigation. This is in use on `content/index.njk` and `content/about/index.md`. +- Content can be in _any template format_ (blog posts needn’t exclusively be markdown, for example). Configure your project’s supported templates in `eleventy.config.js` -> `templateFormats`. +- The `public` folder in your input directory will be copied to the output folder (via `addPassthroughCopy` in the `eleventy.config.js` file). This means `./public/css/*` will live at `./_site/css/*` after your build completes. +- This project uses three [Eleventy Layouts](https://www.11ty.dev/docs/layouts/): + - `_includes/layouts/base.njk`: the top level HTML structure + - `_includes/layouts/home.njk`: the home page template (wrapped into `base.njk`) + - `_includes/layouts/post.njk`: the blog post template (wrapped into `base.njk`) +- `_includes/postslist.njk` is a Nunjucks include and is a reusable component used to display a list of all the posts. `content/index.njk` has an example of how to use it. + +#### Content Security Policy + +If your site enforces a [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (as public-facing sites should), you have a few choices (pick one): + +1. In `base.njk`, remove `` and uncomment `` +2. Configure the server with the CSP directive `style-src: 'unsafe-inline'` (less secure). diff --git a/_config/filters.js b/_config/filters.js new file mode 100644 index 0000000..3f247fb --- /dev/null +++ b/_config/filters.js @@ -0,0 +1,43 @@ +import { DateTime } from "luxon"; + +export default function(eleventyConfig) { + eleventyConfig.addFilter("readableDate", (dateObj, format, zone) => { + // Formatting tokens for Luxon: https://moment.github.io/luxon/#/formatting?id=table-of-tokens + return DateTime.fromJSDate(dateObj, { zone: zone || "utc" }).toFormat(format || "dd LLLL yyyy"); + }); + + eleventyConfig.addFilter("htmlDateString", (dateObj) => { + // dateObj input: https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string + return DateTime.fromJSDate(dateObj, { zone: "utc" }).toFormat('yyyy-LL-dd'); + }); + + // Get the first `n` elements of a collection. + eleventyConfig.addFilter("head", (array, n) => { + if(!Array.isArray(array) || array.length === 0) { + return []; + } + if( n < 0 ) { + return array.slice(n); + } + + return array.slice(0, n); + }); + + // Return the smallest number argument + eleventyConfig.addFilter("min", (...numbers) => { + return Math.min.apply(null, numbers); + }); + + // Return the keys used in an object + eleventyConfig.addFilter("getKeys", target => { + return Object.keys(target); + }); + + eleventyConfig.addFilter("filterTagList", function filterTagList(tags) { + return (tags || []).filter(tag => ["all", "posts"].indexOf(tag) === -1); + }); + + eleventyConfig.addFilter("sortAlphabetically", strings => + (strings || []).sort((b, a) => b.localeCompare(a)) + ); +}; diff --git a/_data/eleventyDataSchema.js b/_data/eleventyDataSchema.js new file mode 100644 index 0000000..bfef5d5 --- /dev/null +++ b/_data/eleventyDataSchema.js @@ -0,0 +1,17 @@ +import { z } from "zod"; +import { fromZodError } from 'zod-validation-error'; + +// Draft content, validate `draft` front matter +export default function() { + return function(data) { + // Note that drafts may be skipped in a preprocessor (see eleventy.config.js) + // when doing a standard build (not --serve or --watch) + let result = z.object({ + draft: z.boolean().or(z.undefined()), + }).safeParse(data); + + if(result.error) { + throw fromZodError(result.error); + } + } +} diff --git a/_data/metadata.js b/_data/metadata.js new file mode 100644 index 0000000..e131c51 --- /dev/null +++ b/_data/metadata.js @@ -0,0 +1,11 @@ +export default { + title: "Web Blog", + url: "https://webblog.anthonyhughes.art", + language: "en", + description: "Musings of a neurodivergent cynic.", + author: { + name: "Anthony Hughes", + email: "anthony@anthonyhughes.art", + url: "https://anthonyhughes.art/about-me/" + } +} diff --git a/_includes/layouts/base.njk b/_includes/layouts/base.njk new file mode 100644 index 0000000..2718dde --- /dev/null +++ b/_includes/layouts/base.njk @@ -0,0 +1,87 @@ + + + + + + {{ title or metadata.title }} ➟ Anthony Hughes . art + + + + + + + + + + {#- Uncomment this if you’d like folks to know that you used Eleventy to build your site! #} + {#- #} + + {#- + Plain-text bundles are provided via the `eleventy-plugin-bundle` plugin: + 1. CSS: + * Add to a per-page bundle using `{% css %}{% endcss %}` + * Retrieve bundle content using `{% getBundle "css" %}` or `{% getBundleFileUrl "css" %}` + 2. Or for JavaScript: + * Add to a per-page bundle using `{% js %}{% endjs %}` + * Retrieve via `{% getBundle "js" %}` or `{% getBundleFileUrl "js" %}` + 3. Learn more: https://github.com/11ty/eleventy-plugin-bundle + #} + + {#- Add CSS to the bundle #} + + + {#- Add the contents of a file to the bundle #} + + + {#- Or you can add from node_modules #} + {# #} + + {#- Render the CSS bundle using inlined CSS (for the fastest site performance in production) #} + + + {#- Renders the CSS bundle using a separate file, if you can't set CSP directive style-src: 'unsafe-inline' #} + {#- #} + + {#- Add the heading-anchors web component to the JavaScript bundle #} + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

{{ metadata.title }}

+ + + {#- Read more about `eleventy-navigation` at https://www.11ty.dev/docs/plugins/navigation/ #} + +
+ +
+ + {{ content | safe }} + +
+ + + + + + + diff --git a/_includes/layouts/home.njk b/_includes/layouts/home.njk new file mode 100644 index 0000000..5b6c8e2 --- /dev/null +++ b/_includes/layouts/home.njk @@ -0,0 +1,17 @@ +--- +layout: layouts/base.njk +--- + + +{{ content | safe }} diff --git a/_includes/layouts/post.njk b/_includes/layouts/post.njk new file mode 100644 index 0000000..a1ee3d6 --- /dev/null +++ b/_includes/layouts/post.njk @@ -0,0 +1,28 @@ +--- +layout: layouts/base.njk +--- +{# Only include the syntax highlighter CSS on blog posts, included with the CSS per-page bundle #} + + +

{{ title }}

+ + + +{{ content | safe }} + +{%- if collections.posts %} +{%- set previousPost = collections.posts | getPreviousCollectionItem %} +{%- set nextPost = collections.posts | getNextCollectionItem %} +{%- if nextPost or previousPost %} + +{%- endif %} +{%- endif %} diff --git a/_includes/postslist.njk b/_includes/postslist.njk new file mode 100644 index 0000000..65f1fe6 --- /dev/null +++ b/_includes/postslist.njk @@ -0,0 +1,8 @@ +
    +{%- for post in postslist | reverse %} +
  1. + {% if post.data.title %}{{ post.data.title }}{% else %}{{ post.url }}{% endif %} + +
  2. +{%- endfor %} +
diff --git a/_site/404.html b/_site/404.html new file mode 100644 index 0000000..3b50b63 --- /dev/null +++ b/_site/404.html @@ -0,0 +1,631 @@ + + + + + + Web Blog ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Content not found.

+

Go home.

+ + + +
+
+ + + + + + + diff --git a/_site/about/index.html b/_site/about/index.html new file mode 100644 index 0000000..deee4db --- /dev/null +++ b/_site/about/index.html @@ -0,0 +1,619 @@ + + + + + + Web Blog ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

About

+

I am a person that writes stuff.

+ + +
+
+ + + + + + + diff --git a/_site/android-chrome-192x192.png b/_site/android-chrome-192x192.png new file mode 100644 index 0000000..b796964 Binary files /dev/null and b/_site/android-chrome-192x192.png differ diff --git a/_site/android-chrome-512x512.png b/_site/android-chrome-512x512.png new file mode 100644 index 0000000..1164577 Binary files /dev/null and b/_site/android-chrome-512x512.png differ diff --git a/_site/apple-touch-icon.png b/_site/apple-touch-icon.png new file mode 100644 index 0000000..424cf29 Binary files /dev/null and b/_site/apple-touch-icon.png differ diff --git a/_site/blog/fifthpost/index.html b/_site/blog/fifthpost/index.html new file mode 100644 index 0000000..f633245 --- /dev/null +++ b/_site/blog/fifthpost/index.html @@ -0,0 +1,766 @@ + + + + + + This is a fifth post (draft) ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + + +

This is a fifth post (draft)

+ + + +

This is a draft post

+ + + +
+
+ + + + + + + diff --git a/_site/blog/firstpost/index.html b/_site/blog/firstpost/index.html new file mode 100644 index 0000000..129580a --- /dev/null +++ b/_site/blog/firstpost/index.html @@ -0,0 +1,778 @@ + + + + + + This is my first post. ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + + +

This is my first post.

+ + + +

Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.

+

Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.

+

Section Header

+

Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

+
 // this is a command
+ function myCommand() {
++  let counter = 0;
+-  let counter = 1;
+   counter++;
+ }
+
+ // Test with a line break above this line.
+ console.log('Test');
+
+ + +
+
+ + + + + + + diff --git a/_site/blog/fourthpost/index.html b/_site/blog/fourthpost/index.html new file mode 100644 index 0000000..4b9e8b5 --- /dev/null +++ b/_site/blog/fourthpost/index.html @@ -0,0 +1,771 @@ + + + + + + This is my fourth post (draft) ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + + +

This is my fourth post (draft)

+ + + +

Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.

+

Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.

+A possum parent and two possum kids hanging from the iconic red balloon +

Section Header

+

Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

+ + + +
+
+ + + + + + + diff --git a/_site/blog/fourthpost/xbVnp_hAou-350.avif b/_site/blog/fourthpost/xbVnp_hAou-350.avif new file mode 100644 index 0000000..d4f7756 Binary files /dev/null and b/_site/blog/fourthpost/xbVnp_hAou-350.avif differ diff --git a/_site/blog/fourthpost/xbVnp_hAou-350.png b/_site/blog/fourthpost/xbVnp_hAou-350.png new file mode 100644 index 0000000..23f55ff Binary files /dev/null and b/_site/blog/fourthpost/xbVnp_hAou-350.png differ diff --git a/_site/blog/fourthpost/xbVnp_hAou-350.webp b/_site/blog/fourthpost/xbVnp_hAou-350.webp new file mode 100644 index 0000000..fa70f32 Binary files /dev/null and b/_site/blog/fourthpost/xbVnp_hAou-350.webp differ diff --git a/_site/blog/index.html b/_site/blog/index.html new file mode 100644 index 0000000..52d18aa --- /dev/null +++ b/_site/blog/index.html @@ -0,0 +1,627 @@ + + + + + + Web Blog ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Archive

+ + +
    +
  1. + This is my first post. + +
  2. +
+ + + +
+
+ + + + + + + diff --git a/_site/blog/secondpost/index.html b/_site/blog/secondpost/index.html new file mode 100644 index 0000000..95aacb6 --- /dev/null +++ b/_site/blog/secondpost/index.html @@ -0,0 +1,772 @@ + + + + + + This is my second post with a much longer title. (draft) ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + + +

This is my second post with a much longer title. (draft)

+ + + +

Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.

+

Section Header

+

First post +Third post

+

Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.

+

Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

+ + + +
+
+ + + + + + + diff --git a/_site/blog/thirdpost/index.html b/_site/blog/thirdpost/index.html new file mode 100644 index 0000000..1e0878d --- /dev/null +++ b/_site/blog/thirdpost/index.html @@ -0,0 +1,792 @@ + + + + + + This is my third post. (draft) ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + + +

This is my third post. (draft)

+ + + +

Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.

+

Code

+

This is a very long heading that I want to wrap This is a very long heading that I want to wrap This is a very long heading that I want to wrap This is a very long heading that I want to wrap

+

Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.

+
// this is a command
+function myCommand() {
+	let counter = 0;
+	counter++;
+}
+
+// Test with a line break above this line.
+console.log('Test');
+ +

Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.

+
// this is a command
+function myCommand() {
+	let counter = 0;
+	counter++;
+}
+
+// Test with a line break above this line.
+console.log('Test');
+
+

Section Header

+

Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.

+ + + +
+
+ + + + + + + diff --git a/_site/dist/cC8wS6ZjFU.js b/_site/dist/cC8wS6ZjFU.js new file mode 100644 index 0000000..68efbdb --- /dev/null +++ b/_site/dist/cC8wS6ZjFU.js @@ -0,0 +1,231 @@ +// Thank you to https://github.com/daviddarnes/heading-anchors +// Thank you to https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/ + +let globalInstanceIndex = 0; + +class HeadingAnchors extends HTMLElement { + static register(tagName = "heading-anchors", registry = window.customElements) { + if(registry && !registry.get(tagName)) { + registry.define(tagName, this); + } + } + + static attributes = { + exclude: "data-ha-exclude", + prefix: "prefix", + content: "content", + } + + static classes = { + anchor: "ha", + placeholder: "ha-placeholder", + srOnly: "ha-visualhide", + } + + static defaultSelector = "h2,h3,h4,h5,h6"; + + static css = ` +.${HeadingAnchors.classes.srOnly} { + clip: rect(0 0 0 0); + height: 1px; + overflow: hidden; + position: absolute; + width: 1px; +} +.${HeadingAnchors.classes.anchor} { + position: absolute; + left: var(--ha_offsetx); + top: var(--ha_offsety); + text-decoration: none; + opacity: 0; +} +.${HeadingAnchors.classes.placeholder} { + opacity: .3; +} +.${HeadingAnchors.classes.anchor}:is(:focus-within, :hover) { + opacity: 1; +} +.${HeadingAnchors.classes.anchor}, +.${HeadingAnchors.classes.placeholder} { + display: inline-block; + padding: 0 .25em; + + /* Disable selection of visually hidden label */ + -webkit-user-select: none; + user-select: none; +} + +@supports (anchor-name: none) { + .${HeadingAnchors.classes.anchor} { + position: absolute; + left: anchor(left); + top: anchor(top); + } +}`; + + get supports() { + return "replaceSync" in CSSStyleSheet.prototype; + } + + get supportsAnchorPosition() { + return CSS.supports("anchor-name: none"); + } + + constructor() { + super(); + + if(!this.supports) { + return; + } + + let sheet = new CSSStyleSheet(); + sheet.replaceSync(HeadingAnchors.css); + document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]; + + this.headingStyles = {}; + this.instanceIndex = globalInstanceIndex++; + } + + connectedCallback() { + if (!this.supports) { + return; + } + + this.headings.forEach((heading, index) => { + if(!heading.hasAttribute(HeadingAnchors.attributes.exclude)) { + let anchor = this.getAnchorElement(heading); + let placeholder = this.getPlaceholderElement(); + + // Prefers anchor position approach for better accessibility + // https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/ + if(this.supportsAnchorPosition) { + let anchorName = `--ha_${this.instanceIndex}_${index}`; + placeholder.style.setProperty("anchor-name", anchorName); + anchor.style.positionAnchor = anchorName; + } + + heading.appendChild(placeholder); + heading.after(anchor); + } + }); + } + + // Polyfill-only + positionAnchorFromPlaceholder(placeholder) { + if(!placeholder) { + return; + } + + let heading = placeholder.closest("h1,h2,h3,h4,h5,h6"); + if(!heading.nextElementSibling) { + return; + } + + // TODO next element could be more defensive + this.positionAnchor(heading.nextElementSibling); + } + + // Polyfill-only + positionAnchor(anchor) { + if(!anchor || !anchor.previousElementSibling) { + return; + } + + // TODO previous element could be more defensive + let heading = anchor.previousElementSibling; + this.setFontProp(heading, anchor); + + if(this.supportsAnchorPosition) { + // quit early + return; + } + + let placeholder = heading.querySelector(`.${HeadingAnchors.classes.placeholder}`); + if(placeholder) { + anchor.style.setProperty("--ha_offsetx", `${placeholder.offsetLeft}px`); + anchor.style.setProperty("--ha_offsety", `${placeholder.offsetTop}px`); + } + } + + setFontProp(heading, anchor) { + let placeholder = heading.querySelector(`.${HeadingAnchors.classes.placeholder}`); + if(placeholder) { + let style = getComputedStyle(placeholder); + let props = ["font-weight", "font-size", "line-height", "font-family"]; + let [weight, size, lh, family] = props.map(name => style.getPropertyValue(name)); + anchor.style.setProperty("font", `${weight} ${size}/${lh} ${family}`); + let vars = style.getPropertyValue("font-variation-settings"); + if(vars) { + anchor.style.setProperty("font-variation-settings", vars); + } + } + } + + getAccessibleTextPrefix() { + // Useful for i18n + return this.getAttribute(HeadingAnchors.attributes.prefix) || "Jump to section titled"; + } + + getContent() { + if(this.hasAttribute(HeadingAnchors.attributes.content)) { + return this.getAttribute(HeadingAnchors.attributes.content); + } + return "#"; + } + + // Placeholder nests inside of heading + getPlaceholderElement() { + let ph = document.createElement("span"); + ph.setAttribute("aria-hidden", true); + ph.classList.add(HeadingAnchors.classes.placeholder); + let content = this.getContent(); + if(content) { + ph.textContent = content; + } + + ph.addEventListener("mouseover", (e) => { + let placeholder = e.target.closest(`.${HeadingAnchors.classes.placeholder}`); + if(placeholder) { + this.positionAnchorFromPlaceholder(placeholder); + } + }); + + return ph; + } + + getAnchorElement(heading) { + let anchor = document.createElement("a"); + anchor.href = `#${heading.id}`; + anchor.classList.add(HeadingAnchors.classes.anchor); + + let content = this.getContent(); + anchor.innerHTML = `${this.getAccessibleTextPrefix()}: ${heading.textContent}${content ? `` : ""}`; + + anchor.addEventListener("focus", e => { + let anchor = e.target.closest(`.${HeadingAnchors.classes.anchor}`); + if(anchor) { + this.positionAnchor(anchor); + } + }); + + anchor.addEventListener("mouseover", (e) => { + // when CSS anchor positioning is supported, this is only used to set the font + let anchor = e.target.closest(`.${HeadingAnchors.classes.anchor}`); + this.positionAnchor(anchor); + }); + + return anchor; + } + + get headings() { + return this.querySelectorAll(this.selector.split(",").map(entry => `${entry.trim()}[id]`)); + } + + get selector() { + return this.getAttribute("selector") || HeadingAnchors.defaultSelector; + } +} + +HeadingAnchors.register(); + +export { HeadingAnchors } \ No newline at end of file diff --git a/_site/favicon-16x16.png b/_site/favicon-16x16.png new file mode 100644 index 0000000..965ac9d Binary files /dev/null and b/_site/favicon-16x16.png differ diff --git a/_site/favicon-32x32.png b/_site/favicon-32x32.png new file mode 100644 index 0000000..21886dd Binary files /dev/null and b/_site/favicon-32x32.png differ diff --git a/_site/favicon.ico b/_site/favicon.ico new file mode 100644 index 0000000..413a295 Binary files /dev/null and b/_site/favicon.ico differ diff --git a/_site/feed/feed.xml b/_site/feed/feed.xml new file mode 100644 index 0000000..c945a30 --- /dev/null +++ b/_site/feed/feed.xml @@ -0,0 +1,35 @@ + + + + + Web Blog + Musings of a neurodivergent cynic. + + + 2018-05-01T00:00:00Z + https://webblog.anthonyhughes.art/ + + Anthony Hughes + + + This is my first post. + + 2018-05-01T00:00:00Z + https://webblog.anthonyhughes.art/blog/firstpost/ + <p>Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.</p> +<p>Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring.</p> +<h2 id="section-header">Section Header</h2> +<p>Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.</p> +<pre class="language-diff-js" tabindex="0"><code class="language-diff-js"><span class="token unchanged language-js"><span class="token prefix unchanged"> </span><span class="token comment">// this is a command</span> +<span class="token prefix unchanged"> </span><span class="token keyword">function</span> <span class="token function">myCommand</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> +</span><span class="token inserted-sign inserted language-js"><span class="token prefix inserted">+</span> <span class="token keyword">let</span> counter <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> +</span><span class="token deleted-sign deleted language-js"><span class="token prefix deleted">-</span> <span class="token keyword">let</span> counter <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> +</span><span class="token unchanged language-js"><span class="token prefix unchanged"> </span> counter<span class="token operator">++</span><span class="token punctuation">;</span> +<span class="token prefix unchanged"> </span><span class="token punctuation">}</span> +</span> +<span class="token unchanged language-js"><span class="token prefix unchanged"> </span><span class="token comment">// Test with a line break above this line.</span> +<span class="token prefix unchanged"> </span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> +</span></code></pre> + + + \ No newline at end of file diff --git a/_site/feed/pretty-atom-feed.xsl b/_site/feed/pretty-atom-feed.xsl new file mode 100644 index 0000000..6a1c4de --- /dev/null +++ b/_site/feed/pretty-atom-feed.xsl @@ -0,0 +1,89 @@ + + + + + + + + <xsl:value-of select="atom:feed/atom:title"/> + + + + + + +
+
+

+ + + + + + + + + + + + + + + + + + + Web Feed Preview +

+

+

+

This preview only shows titles, but the actual feed contains the full content.

+ + + + + Visit Website → + +
+

Recent Items

+ +
+ + +
+ +
+

+ + + + + + +

+ + Published: + +
+
+
diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Bold.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Bold.woff2 new file mode 100644 index 0000000..b92494e Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Bold.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-BoldItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-BoldItalic.woff2 new file mode 100644 index 0000000..509f97c Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-BoldItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraBold.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraBold.woff2 new file mode 100644 index 0000000..0afb119 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraBold.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraBoldItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..f8838ff Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraBoldItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraLight.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraLight.woff2 new file mode 100644 index 0000000..adf3c02 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraLight.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraLightItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraLightItalic.woff2 new file mode 100644 index 0000000..f4c9108 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-ExtraLightItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Light.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Light.woff2 new file mode 100644 index 0000000..5cc996e Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Light.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-LightItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-LightItalic.woff2 new file mode 100644 index 0000000..08b20d6 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-LightItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Medium.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Medium.woff2 new file mode 100644 index 0000000..e9af0d9 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Medium.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-MediumItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-MediumItalic.woff2 new file mode 100644 index 0000000..4cf365c Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-MediumItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Regular.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Regular.woff2 new file mode 100644 index 0000000..2070769 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-Regular.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-RegularItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-RegularItalic.woff2 new file mode 100644 index 0000000..e6444cf Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-RegularItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-SemiBold.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-SemiBold.woff2 new file mode 100644 index 0000000..62ecc91 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-SemiBold.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-SemiBoldItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-SemiBoldItalic.woff2 new file mode 100644 index 0000000..be2c668 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Mono/AtkinsonHyperlegibleMono-SemiBoldItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Bold.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Bold.woff2 new file mode 100644 index 0000000..3b73597 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Bold.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-BoldItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-BoldItalic.woff2 new file mode 100644 index 0000000..25b2858 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-BoldItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraBold.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraBold.woff2 new file mode 100644 index 0000000..65039ac Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraBold.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraBoldItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..5abb72e Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraBoldItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraLight.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraLight.woff2 new file mode 100644 index 0000000..5a13603 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraLight.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraLightItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraLightItalic.woff2 new file mode 100644 index 0000000..ad1940c Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-ExtraLightItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Light.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Light.woff2 new file mode 100644 index 0000000..b1eac3f Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Light.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-LightItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-LightItalic.woff2 new file mode 100644 index 0000000..f0f492f Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-LightItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Medium.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Medium.woff2 new file mode 100644 index 0000000..e82765d Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Medium.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-MediumItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-MediumItalic.woff2 new file mode 100644 index 0000000..c9e218a Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-MediumItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Regular.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Regular.woff2 new file mode 100644 index 0000000..d2babdf Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-Regular.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-RegularItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-RegularItalic.woff2 new file mode 100644 index 0000000..dc05d06 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-RegularItalic.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-SemiBold.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-SemiBold.woff2 new file mode 100644 index 0000000..a7d9ece Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-SemiBold.woff2 differ diff --git a/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-SemiBoldItalic.woff2 b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-SemiBoldItalic.woff2 new file mode 100644 index 0000000..f911176 Binary files /dev/null and b/_site/fonts/Atkinson/Hyperlegible/Next/AtkinsonHyperlegibleNext-SemiBoldItalic.woff2 differ diff --git a/_site/img/.gitkeep b/_site/img/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/_site/img/57mU09TOH6-960.avif b/_site/img/57mU09TOH6-960.avif new file mode 100644 index 0000000..00e0adf Binary files /dev/null and b/_site/img/57mU09TOH6-960.avif differ diff --git a/_site/img/57mU09TOH6-960.svg b/_site/img/57mU09TOH6-960.svg new file mode 100644 index 0000000..fcb16e7 --- /dev/null +++ b/_site/img/57mU09TOH6-960.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_site/img/57mU09TOH6-960.webp b/_site/img/57mU09TOH6-960.webp new file mode 100644 index 0000000..707a031 Binary files /dev/null and b/_site/img/57mU09TOH6-960.webp differ diff --git a/_site/img/7PK01HM_My-300.avif b/_site/img/7PK01HM_My-300.avif new file mode 100644 index 0000000..a1837fe Binary files /dev/null and b/_site/img/7PK01HM_My-300.avif differ diff --git a/_site/img/7PK01HM_My-300.svg b/_site/img/7PK01HM_My-300.svg new file mode 100644 index 0000000..dff5c67 --- /dev/null +++ b/_site/img/7PK01HM_My-300.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_site/img/7PK01HM_My-300.webp b/_site/img/7PK01HM_My-300.webp new file mode 100644 index 0000000..d26e153 Binary files /dev/null and b/_site/img/7PK01HM_My-300.webp differ diff --git a/_site/img/anthonyhughesdotart-hero.svg b/_site/img/anthonyhughesdotart-hero.svg new file mode 100644 index 0000000..fcb16e7 --- /dev/null +++ b/_site/img/anthonyhughesdotart-hero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_site/index.html b/_site/index.html new file mode 100644 index 0000000..318fbed --- /dev/null +++ b/_site/index.html @@ -0,0 +1,636 @@ + + + + + + Web Blog ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + + + +

Latest 1 Post

+ + + +
    +
  1. + This is my first post. + +
  2. +
+ + + + + + + + + +
+
+ + + + + + + diff --git a/_site/site.webmanifest b/_site/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/_site/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/_site/sitemap.xml b/_site/sitemap.xml new file mode 100644 index 0000000..5699e7f --- /dev/null +++ b/_site/sitemap.xml @@ -0,0 +1,45 @@ + + + + + + https://webblog.anthonyhughes.art/blog/firstpost/ + 2018-05-01 + + + + + + https://webblog.anthonyhughes.art/about/ + 2026-05-29 + + + + + + https://webblog.anthonyhughes.art/blog/ + 2026-05-29 + + + + + + https://webblog.anthonyhughes.art/ + 2026-05-29 + + + + + + https://webblog.anthonyhughes.art/tags/ + 2026-05-29 + + + + + + https://webblog.anthonyhughes.art/feed/feed.xml + 2026-05-29 + + + diff --git a/_site/tags/another-tag/index.html b/_site/tags/another-tag/index.html new file mode 100644 index 0000000..4633612 --- /dev/null +++ b/_site/tags/another-tag/index.html @@ -0,0 +1,629 @@ + + + + + + Tagged 'another tag' ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Tagged “another tag”

+ + +
    +
  1. + This is my first post. + +
  2. +
+ + +

See all tags.

+ + +
+
+ + + + + + + diff --git a/_site/tags/index.html b/_site/tags/index.html new file mode 100644 index 0000000..0335688 --- /dev/null +++ b/_site/tags/index.html @@ -0,0 +1,634 @@ + + + + + + Web Blog ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Tags

+ + + + +
+
+ + + + + + + diff --git a/_site/tags/number-2/index.html b/_site/tags/number-2/index.html new file mode 100644 index 0000000..9b5b6e6 --- /dev/null +++ b/_site/tags/number-2/index.html @@ -0,0 +1,625 @@ + + + + + + Tagged 'number 2' ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Tagged “number 2”

+ + +
    +
+ + +

See all tags.

+ + +
+
+ + + + + + + diff --git a/_site/tags/posts-with-two-tags/index.html b/_site/tags/posts-with-two-tags/index.html new file mode 100644 index 0000000..07412ee --- /dev/null +++ b/_site/tags/posts-with-two-tags/index.html @@ -0,0 +1,625 @@ + + + + + + Tagged 'posts with two tags' ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Tagged “posts with two tags”

+ + +
    +
+ + +

See all tags.

+ + +
+
+ + + + + + + diff --git a/_site/tags/second-tag/index.html b/_site/tags/second-tag/index.html new file mode 100644 index 0000000..de7bdc8 --- /dev/null +++ b/_site/tags/second-tag/index.html @@ -0,0 +1,625 @@ + + + + + + Tagged 'second tag' ➟ Anthony Hughes . art + + + + + + + + + + + + + + + + + +
+
+ Anthony Hughes dot Art Hero Image +
+ +

Web Blog

+ +
+ +
+ + + +

Tagged “second tag”

+ + +
    +
+ + +

See all tags.

+ + +
+
+ + + + + + + diff --git a/content/404.md b/content/404.md new file mode 100644 index 0000000..50a3fa9 --- /dev/null +++ b/content/404.md @@ -0,0 +1,20 @@ +--- +permalink: 404.html +eleventyExcludeFromCollections: true +--- +# Content not found. + +Go home. + + diff --git a/content/about.md b/content/about.md new file mode 100644 index 0000000..c1c7076 --- /dev/null +++ b/content/about.md @@ -0,0 +1,9 @@ +---js +const eleventyNavigation = { + key: "About", + order: 2 +}; +--- +# About + +I am a person that writes stuff. diff --git a/content/blog.njk b/content/blog.njk new file mode 100644 index 0000000..c11fdf8 --- /dev/null +++ b/content/blog.njk @@ -0,0 +1,10 @@ +---js +const eleventyNavigation = { + key: "Archive", + order: 2 +}; +--- +

Archive

+ +{% set postslist = collections.posts %} +{% include "postslist.njk" %} diff --git a/content/blog/blog.11tydata.js b/content/blog/blog.11tydata.js new file mode 100644 index 0000000..614f505 --- /dev/null +++ b/content/blog/blog.11tydata.js @@ -0,0 +1,6 @@ +export default { + tags: [ + "posts" + ], + "layout": "layouts/post.njk", +}; diff --git a/content/blog/fifthpost.md b/content/blog/fifthpost.md new file mode 100644 index 0000000..3a73113 --- /dev/null +++ b/content/blog/fifthpost.md @@ -0,0 +1,6 @@ +---js +const title = "This is a fifth post"; +const date = "2023-01-23"; +const draft = true; +--- +This is a draft post diff --git a/content/blog/firstpost.md b/content/blog/firstpost.md new file mode 100644 index 0000000..97db357 --- /dev/null +++ b/content/blog/firstpost.md @@ -0,0 +1,25 @@ +--- +title: This is my first post. +description: This is a post on My Blog about agile frameworks. +date: 2018-05-01 +tags: another tag +--- +Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. + +Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. + +## Section Header + +Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. + +```diff-js + // this is a command + function myCommand() { ++ let counter = 0; +- let counter = 1; + counter++; + } + + // Test with a line break above this line. + console.log('Test'); +``` diff --git a/content/blog/fourthpost/fourthpost.md b/content/blog/fourthpost/fourthpost.md new file mode 100644 index 0000000..247cdd6 --- /dev/null +++ b/content/blog/fourthpost/fourthpost.md @@ -0,0 +1,17 @@ +--- +title: This is my fourth post +description: This is a post on My Blog about touchpoints and circling wagons. +date: 2018-09-30 +tags: second tag +draft: true +--- +Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. + +Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. + +A possum parent and two possum kids hanging from the iconic red balloon + +## Section Header + +Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. + diff --git a/content/blog/fourthpost/possum.png b/content/blog/fourthpost/possum.png new file mode 100644 index 0000000..f332150 Binary files /dev/null and b/content/blog/fourthpost/possum.png differ diff --git a/content/blog/secondpost.md b/content/blog/secondpost.md new file mode 100644 index 0000000..64610f4 --- /dev/null +++ b/content/blog/secondpost.md @@ -0,0 +1,17 @@ +--- +title: This is my second post with a much longer title. +description: This is a post on My Blog about leveraging agile frameworks. +date: 2018-07-04 +tags: number 2 +draft: true +--- +Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. + +## Section Header + +First post +Third post + +Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. + +Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. diff --git a/content/blog/thirdpost.md b/content/blog/thirdpost.md new file mode 100644 index 0000000..03eda1f --- /dev/null +++ b/content/blog/thirdpost.md @@ -0,0 +1,44 @@ +--- +title: This is my third post. +description: This is a post on My Blog about win-win survival strategies. +date: 2018-08-24 +tags: ["second tag", "posts with two tags"] +draft: true +--- +Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment. + +## Code + +### This is a very long heading that I want to wrap This is a very long heading that I want to wrap This is a very long heading that I want to wrap This is a very long heading that I want to wrap + +Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. + +```js +// this is a command +function myCommand() { + let counter = 0; + counter++; +} + +// Test with a line break above this line. +console.log('Test'); +``` + +### Heading with a [link](#code) + +Bring to the table win-win survival strategies to ensure proactive domination. At the end of the day, going forward, a new normal that has evolved from generation X is on the runway heading towards a streamlined cloud solution. User generated content in real-time will have multiple touchpoints for offshoring. + +``` +// this is a command +function myCommand() { + let counter = 0; + counter++; +} + +// Test with a line break above this line. +console.log('Test'); +``` + +## Section Header + +Capitalize on low hanging fruit to identify a ballpark value added activity to beta test. Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line. diff --git a/content/content.11tydata.js b/content/content.11tydata.js new file mode 100644 index 0000000..8b0bb8e --- /dev/null +++ b/content/content.11tydata.js @@ -0,0 +1,3 @@ +export default { + layout: "layouts/home.njk", +}; diff --git a/content/feed/.virtual b/content/feed/.virtual new file mode 100644 index 0000000..0ee5e54 --- /dev/null +++ b/content/feed/.virtual @@ -0,0 +1 @@ +For RSS feed, Atom Feed, and JSON feed templates, see the plugin in eleventy.config.js diff --git a/content/feed/pretty-atom-feed.xsl b/content/feed/pretty-atom-feed.xsl new file mode 100644 index 0000000..6a1c4de --- /dev/null +++ b/content/feed/pretty-atom-feed.xsl @@ -0,0 +1,89 @@ + + + + + + + + <xsl:value-of select="atom:feed/atom:title"/> + + + + + + +
+
+

+ + + + + + + + + + + + + + + + + + + Web Feed Preview +

+

+

+

This preview only shows titles, but the actual feed contains the full content.

+ + + + + Visit Website → + +
+

Recent Items

+ +
+ + +
+ +
+

+ + + + + + +

+ + Published: + +
+
+
diff --git a/content/images/anthonyhughesdotart-hero.svg b/content/images/anthonyhughesdotart-hero.svg new file mode 100644 index 0000000..fcb16e7 --- /dev/null +++ b/content/images/anthonyhughesdotart-hero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/images/favicons/android-chrome-192x192.png b/content/images/favicons/android-chrome-192x192.png new file mode 100644 index 0000000..b796964 Binary files /dev/null and b/content/images/favicons/android-chrome-192x192.png differ diff --git a/content/images/favicons/android-chrome-512x512.png b/content/images/favicons/android-chrome-512x512.png new file mode 100644 index 0000000..1164577 Binary files /dev/null and b/content/images/favicons/android-chrome-512x512.png differ diff --git a/content/images/favicons/apple-touch-icon.png b/content/images/favicons/apple-touch-icon.png new file mode 100644 index 0000000..424cf29 Binary files /dev/null and b/content/images/favicons/apple-touch-icon.png differ diff --git a/content/images/favicons/favicon-16x16.png b/content/images/favicons/favicon-16x16.png new file mode 100644 index 0000000..965ac9d Binary files /dev/null and b/content/images/favicons/favicon-16x16.png differ diff --git a/content/images/favicons/favicon-32x32.png b/content/images/favicons/favicon-32x32.png new file mode 100644 index 0000000..21886dd Binary files /dev/null and b/content/images/favicons/favicon-32x32.png differ diff --git a/content/images/favicons/favicon.ico b/content/images/favicons/favicon.ico new file mode 100644 index 0000000..413a295 Binary files /dev/null and b/content/images/favicons/favicon.ico differ diff --git a/content/images/favicons/site.webmanifest b/content/images/favicons/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/content/images/favicons/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/content/images/footer.svg b/content/images/footer.svg new file mode 100644 index 0000000..dff5c67 --- /dev/null +++ b/content/images/footer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/content/index.njk b/content/index.njk new file mode 100644 index 0000000..f7d17e1 --- /dev/null +++ b/content/index.njk @@ -0,0 +1,29 @@ +---js +const eleventyNavigation = { + key: "Home", + order: 1 +}; + +const numberOfLatestPostsToShow = 3; +--- +{% set postsCount = collections.posts | length %} +{% set latestPostsCount = postsCount | min(numberOfLatestPostsToShow) %} +

Latest {{ latestPostsCount }} Post{% if latestPostsCount != 1 %}s{% endif %}

+ +{% set postslist = collections.posts | head(-1 * numberOfLatestPostsToShow) %} +{% set postslistCounter = postsCount %} +{% include "postslist.njk" %} + +{% set morePosts = postsCount - numberOfLatestPostsToShow %} +{% if morePosts > 0 %} +

{{ morePosts }} more post{% if morePosts != 1 %}s{% endif %} can be found in the archive.

+{% endif %} + +{# List every content page in the project #} +{# + +#} diff --git a/content/sitemap.xml.njk b/content/sitemap.xml.njk new file mode 100644 index 0000000..956cd10 --- /dev/null +++ b/content/sitemap.xml.njk @@ -0,0 +1,17 @@ +--- +permalink: /sitemap.xml +layout: false +eleventyExcludeFromCollections: true +--- + + +{%- for page in collections.all %} + {% if page.data.permalink != false %} + {% set absoluteUrl %}{{ page.url | htmlBaseUrl(metadata.url) }}{% endset %} + + {{ absoluteUrl }} + {{ page.date | htmlDateString }} + + {% endif %} +{%- endfor %} + diff --git a/content/tag-pages.njk b/content/tag-pages.njk new file mode 100644 index 0000000..bc331a0 --- /dev/null +++ b/content/tag-pages.njk @@ -0,0 +1,27 @@ +---js +// `; + + if (content.includes("")) { + return content.replace("", `${script}`); + } + + // If the HTML document contains an importmap, insert the module script after the importmap element + let importMapRegEx = / \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-img/eslint.config.mjs b/node_modules/@11ty/eleventy-img/eslint.config.mjs new file mode 100644 index 0000000..ed7517e --- /dev/null +++ b/node_modules/@11ty/eleventy-img/eslint.config.mjs @@ -0,0 +1,29 @@ +import { defineConfig } from "eslint/config"; +import pluginJs from "@eslint/js"; +import pluginStylistic from "@stylistic/eslint-plugin-js"; +import globals from "globals"; + +const GLOB_JS = '**/*.?([cm])js'; + +export default defineConfig([ + { + files: [GLOB_JS], + plugins: { + js: pluginJs, + "@stylistic/js": pluginStylistic + }, + extends: [ + "js/recommended", + ], + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { ...globals.node }, + }, + rules: { + "@stylistic/js/indent": ["error", 2], + "@stylistic/js/linebreak-style": ["error", "unix"], + "@stylistic/js/semi": ["error", "always"], + }, + }, +]); diff --git a/node_modules/@11ty/eleventy-img/img.js b/node_modules/@11ty/eleventy-img/img.js new file mode 100644 index 0000000..ee4ed6d --- /dev/null +++ b/node_modules/@11ty/eleventy-img/img.js @@ -0,0 +1,151 @@ +const {default: PQueue} = require("p-queue"); + +const DeferCounter = require("./src/defer-counter.js"); +const BuildLogger = require("./src/build-logger.js"); +const Util = require("./src/util.js"); +const Image = require("./src/image.js"); +const DirectoryManager = require("./src/directory-manager.js"); + +// For exports +const getImageSize = require("image-size"); +const ImagePath = require("./src/image-path.js"); + +const debug = require("debug")("Eleventy:Image"); + +const GLOBAL_OPTIONS = require("./src/global-options.js").defaults; + +const { memCache, diskCache } = require("./src/caches.js"); + +let deferCounter = new DeferCounter(); +let buildLogger = new BuildLogger(); +let directoryManager = new DirectoryManager(); + +/* Queue */ +let processingQueue = new PQueue({ + concurrency: GLOBAL_OPTIONS.concurrency +}); +processingQueue.on("active", () => { + debug( `Concurrency: ${processingQueue.concurrency}, Size: ${processingQueue.size}, Pending: ${processingQueue.pending}` ); +}); + +// TODO move this into build-logger.js +function setupLogger(eleventyConfig, opts) { + if(typeof eleventyConfig?.logger?.logWithOptions !== "function" || Util.isRequested(opts?.generatedVia)) { + return; + } + + buildLogger.setupOnce(eleventyConfig, () => { + // before build + deferCounter.resetCount(); + memCache.resetCount(); + diskCache.resetCount(); + }, () => { + // after build + let [memoryCacheHit] = memCache.getCount(); + let [diskCacheHit, diskCacheMiss] = diskCache.getCount(); + // these are unique images, multiple requests to optimize the same image are de-duplicated + let deferCount = deferCounter.getCount(); + + let cachedCount = memoryCacheHit + diskCacheHit; + let optimizedCount = diskCacheMiss + diskCacheHit + memoryCacheHit + deferCount; + + let msg = []; + msg.push(`${optimizedCount} ${optimizedCount !== 1 ? "images" : "image"} optimized`); + + if(cachedCount > 0 || deferCount > 0) { + let innerMsg = []; + if(cachedCount > 0) { + innerMsg.push(`${cachedCount} cached`); + } + if(deferCount > 0) { + innerMsg.push(`${deferCount} deferred`); + } + msg.push(` (${innerMsg.join(", ")})`); + } + + if(optimizedCount > 0 || cachedCount > 0 || deferCount > 0) { + eleventyConfig?.logger?.logWithOptions({ + message: msg.join(""), + prefix: "[11ty/eleventy-img]", + color: "green", + }); + } + }); +} + +function createImage(src, opts = {}) { + let eleventyConfig = opts.eleventyConfig; + + if(opts?.eleventyConfig && {}.propertyIsEnumerable.call(opts, "eleventyConfig")) { + delete opts.eleventyConfig; + Util.addConfig(eleventyConfig, opts); + } + + let img = Image.create(src, opts); + + img.setQueue(processingQueue); + img.setBuildLogger(buildLogger); + img.setDirectoryManager(directoryManager); + + setupLogger(eleventyConfig, opts); + + if(opts.transformOnRequest) { + deferCounter.increment(src); + } + + return img; +}; + +function queueImage(src, opts = {}) { + if(src.constructor?.name === "UserConfig") { + throw new Error(`Eleventy Image’s default export is not an Eleventy Plugin and cannot be used with \`eleventyConfig.addPlugin()\`. Use the \`eleventyImageTransformPlugin\` named export instead, like this: \`import { eleventyImageTransformPlugin } from '@11ty/eleventy-img';\` or this: \`const { eleventyImageTransformPlugin } = require('@11ty/eleventy-img');\``); + } + + let img = createImage(src, opts); + return img.queue(); +} + +// Exports + +module.exports = queueImage; + +Object.defineProperty(module.exports, "concurrency", { + get: function() { + return processingQueue.concurrency; + }, + set: function(concurrency) { + processingQueue.concurrency = concurrency; + }, +}); + +module.exports.Util = Util; +module.exports.Image = Image; +module.exports.ImagePath = ImagePath; +module.exports.ImageSize = getImageSize; + +// Backwards compat +module.exports.statsSync = Image.statsSync; +module.exports.statsByDimensionsSync = Image.statsByDimensionsSync; +module.exports.getFormats = Image.getFormatsArray; +module.exports.getWidths = Image.getValidWidths; + +module.exports.getHash = function getHash(src, options) { + let img = new Image(src, options); + return img.getHash(); +}; + +module.exports.setupLogger = setupLogger; + +const generateHTML = require("./src/generate-html.js"); +module.exports.generateHTML = generateHTML; +module.exports.generateObject = generateHTML.generateObject; + +const { eleventyWebcOptionsPlugin } = require("./src/webc-options-plugin.js"); +module.exports.eleventyImagePlugin = eleventyWebcOptionsPlugin; +module.exports.eleventyImageWebcOptionsPlugin = eleventyWebcOptionsPlugin; + +const { eleventyImageTransformPlugin } = require("./src/transform-plugin.js"); +module.exports.eleventyImageTransformPlugin = eleventyImageTransformPlugin; + +const { eleventyImageOnRequestDuringServePlugin } = require("./src/on-request-during-serve-plugin.js"); +module.exports.eleventyImageOnRequestDuringServePlugin = eleventyImageOnRequestDuringServePlugin; diff --git a/node_modules/@11ty/eleventy-img/package.json b/node_modules/@11ty/eleventy-img/package.json new file mode 100644 index 0000000..9a2b34a --- /dev/null +++ b/node_modules/@11ty/eleventy-img/package.json @@ -0,0 +1,75 @@ +{ + "name": "@11ty/eleventy-img", + "version": "6.0.4", + "description": "Low level utility to perform build-time image transformations.", + "publishConfig": { + "access": "public" + }, + "main": "img.js", + "engines": { + "node": ">=18" + }, + "scripts": { + "pretest": "eslint img.js src/**.js test/**.js", + "test": "ava --no-worker-threads", + "watch": "ava --no-worker-threads --watch", + "sample": "cd sample && node sample.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-img.git" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy", + "eleventy-utility" + ], + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/11ty/eleventy-img/issues" + }, + "homepage": "https://github.com/11ty/eleventy-img#readme", + "dependencies": { + "@11ty/eleventy-fetch": "^5.1.0", + "@11ty/eleventy-utils": "^2.0.7", + "brotli-size": "^4.0.0", + "debug": "^4.4.0", + "entities": "^6.0.0", + "image-size": "^1.2.1", + "p-queue": "^6.6.2", + "sharp": "^0.33.5" + }, + "devDependencies": { + "@11ty/eleventy": "^3.0.0", + "@11ty/eleventy-plugin-webc": "^0.11.2", + "@eslint/js": "^9.26.0", + "@stylistic/eslint-plugin-js": "^4.2.0", + "ava": "^6.3.0", + "eslint": "^9.26.0", + "exifr": "^7.1.3", + "globals": "^16.1.0", + "pixelmatch": "^5.3.0" + }, + "ava": { + "failFast": false, + "files": [ + "./test/*.{js,cjs,mjs}" + ], + "watchMode": { + "ignoreChanges": [ + "./.cache/*", + "./img/*", + "./test/img/*", + "./test/**/generated*" + ] + } + } +} diff --git a/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.browser.js b/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.browser.js new file mode 100644 index 0000000..cf0ce10 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.browser.js @@ -0,0 +1,3 @@ +module.exports = function() { + throw new Error("`svgCompressionSize: 'br'` feature is not supported in browser."); +}; diff --git a/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.js b/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.js new file mode 100644 index 0000000..57efc1a --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.js @@ -0,0 +1,5 @@ +const brotliSize = require("brotli-size"); + +module.exports = function(contents) { + return brotliSize.sync(contents); +}; diff --git a/node_modules/@11ty/eleventy-img/src/adapters/sharp.browser.js b/node_modules/@11ty/eleventy-img/src/adapters/sharp.browser.js new file mode 100644 index 0000000..c1f6eb2 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/adapters/sharp.browser.js @@ -0,0 +1,3 @@ +module.exports = function() { + throw new Error("Sharp is not supported in browser."); +}; diff --git a/node_modules/@11ty/eleventy-img/src/adapters/sharp.js b/node_modules/@11ty/eleventy-img/src/adapters/sharp.js new file mode 100644 index 0000000..63e9253 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/adapters/sharp.js @@ -0,0 +1,3 @@ +const sharp = require("sharp"); + +module.exports = sharp; diff --git a/node_modules/@11ty/eleventy-img/src/build-logger.js b/node_modules/@11ty/eleventy-img/src/build-logger.js new file mode 100644 index 0000000..434fc8e --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/build-logger.js @@ -0,0 +1,66 @@ +const path = require("node:path"); +const { TemplatePath } = require("@11ty/eleventy-utils"); + +const Util = require("./util.js"); + +class BuildLogger { + #eleventyConfig; + + constructor() { + this.hasAssigned = false; + } + + setupOnce(eleventyConfig, beforeCallback, afterCallback) { + if(this.hasAssigned) { + return; + } + + this.hasAssigned = true; + this.#eleventyConfig = eleventyConfig; + + eleventyConfig.on("eleventy.before", beforeCallback); + eleventyConfig.on("eleventy.after", afterCallback); + + eleventyConfig.on("eleventy.reset", () => { + this.hasAssigned = false; + beforeCallback(); // we run this on reset because the before callback will have disappeared (as the config reset) + }); + } + + getFriendlyImageSource(imageSource) { + if(Buffer.isBuffer(imageSource)) { + return ``; + } + + if(Util.isRemoteUrl(imageSource)) { + return imageSource; + } + if(path.isAbsolute(imageSource)) { + // convert back to relative url + return TemplatePath.addLeadingDotSlash(path.relative(path.resolve("."), imageSource)); + } + + return TemplatePath.addLeadingDotSlash(imageSource); + } + + log(message, options = {}, logOptions = {}) { + if(typeof this.#eleventyConfig?.logger?.logWithOptions !== "function" || options.transformOnRequest) { + return; + } + + this.#eleventyConfig.logger.logWithOptions(Object.assign({ + message: `${message}${options.generatedVia ? ` (${options.generatedVia})` : ""}`, + type: "log", + prefix: "[11ty/eleventy-img]" + }, logOptions)); + } + + error(message, options = {}, logOptions = {}) { + logOptions.type = "error"; + logOptions.force = true; + + this.log(message, options, logOptions); + } +} + +module.exports = BuildLogger; diff --git a/node_modules/@11ty/eleventy-img/src/caches.js b/node_modules/@11ty/eleventy-img/src/caches.js new file mode 100644 index 0000000..62818ac --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/caches.js @@ -0,0 +1,16 @@ +const MemoryCache = require("./memory-cache.js"); +const DiskCache = require("./disk-cache.js"); +const ExistsCache = require("./exists-cache.js"); + +let memCache = new MemoryCache(); + +let existsCache = new ExistsCache(); + +let diskCache = new DiskCache(); +diskCache.setExistsCache(existsCache); + +module.exports = { + memCache, + diskCache, + existsCache +}; diff --git a/node_modules/@11ty/eleventy-img/src/defer-counter.js b/node_modules/@11ty/eleventy-img/src/defer-counter.js new file mode 100644 index 0000000..9fcb0ff --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/defer-counter.js @@ -0,0 +1,27 @@ +class DeferCounter { + constructor() { + this.resetCount(); + } + + resetCount() { + this.deferCount = 0; + this.inputs = new Map(); + } + + getCount() { + return this.deferCount; + } + + increment(input) { + if(input) { + if(this.inputs.has(input)) { + return; + } + this.inputs.set(input, true); + } + + this.deferCount++; + } +} + +module.exports = DeferCounter; diff --git a/node_modules/@11ty/eleventy-img/src/directory-manager.js b/node_modules/@11ty/eleventy-img/src/directory-manager.js new file mode 100644 index 0000000..a2ebbe0 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/directory-manager.js @@ -0,0 +1,29 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const debugUtil = require("debug"); +const debugAssets = debugUtil("Eleventy:Assets"); + +class DirectoryManager { + #dirs = new Set(); + + isCreated(dir) { + return this.#dirs.has(dir); + } + + create(dir) { + if(this.isCreated(dir)) { + return; + } + + this.#dirs.add(dir); + debugAssets("[11ty/eleventy-img] Creating directory %o", dir); + fs.mkdirSync(dir, { recursive: true }); + } + + createFromFile(filepath) { + let dir = path.dirname(filepath); + this.create(dir); + } +} + +module.exports = DirectoryManager; diff --git a/node_modules/@11ty/eleventy-img/src/disk-cache.js b/node_modules/@11ty/eleventy-img/src/disk-cache.js new file mode 100644 index 0000000..4d14319 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/disk-cache.js @@ -0,0 +1,54 @@ +// const debug = require("debug")("Eleventy:Image"); + +class DiskCache { + #existsCache; + + constructor() { + this.hitCounter = 0; + this.missCounter = 0; + this.inputs = new Map(); + } + + setExistsCache(existsCache) { + this.#existsCache = existsCache; + } + + resetCount() { + this.hitCounter = 0; + this.missCounter = 0; + } + + getCount() { + return [this.hitCounter, this.missCounter]; + } + + isCached(targetFile, sourceInput, incrementCounts = true) { + if(!this.#existsCache) { + throw new Error("Missing `#existsCache`"); + } + + // Disk cache runs once per output file, so we only increment counts once per input + if(this.inputs.has(sourceInput)) { + incrementCounts = false; + } + + this.inputs.set(sourceInput, true); + + if(this.#existsCache?.exists(targetFile)) { + if(incrementCounts) { + this.hitCounter++; + } + + // debug("Images re-used (via disk cache): %o", this.hitCounter); + return true; + } + + if(incrementCounts) { + this.missCounter++; + } + + return false; + } +} + +module.exports = DiskCache; diff --git a/node_modules/@11ty/eleventy-img/src/exists-cache.js b/node_modules/@11ty/eleventy-img/src/exists-cache.js new file mode 100644 index 0000000..56b1702 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/exists-cache.js @@ -0,0 +1,40 @@ +const fs = require("node:fs"); +const Util = require("./util.js"); + +// Checks both files and directories +class ExistsCache { + #exists = new Map(); + + constructor() { + this.lookupCount = 0; + } + + get size() { + return this.#exists.size; + } + + has(path) { + return this.#exists.has(path); + } + + // Relative paths (to root directory) expected (but not enforced due to perf costs) + exists(path) { + if(Util.isFullUrl(path)) { + return false; + } + + 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); + } +} + +module.exports = ExistsCache; diff --git a/node_modules/@11ty/eleventy-img/src/format-hooks/svg.js b/node_modules/@11ty/eleventy-img/src/format-hooks/svg.js new file mode 100644 index 0000000..ff42e69 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/format-hooks/svg.js @@ -0,0 +1,14 @@ +const fs = require("node:fs"); +const debugUtil = require("debug"); +const debugAssets = debugUtil("Eleventy:Assets"); + +module.exports = async function createSvg(sharpInstance) { + let input = sharpInstance.options.input; + let svgBuffer = input.buffer; + if(svgBuffer) { // remote URL already has buffer + return svgBuffer; + } else { // local file system + debugAssets("[11ty/eleventy-img] Reading %o", input.file); + return fs.readFileSync(input.file); + } +}; diff --git a/node_modules/@11ty/eleventy-img/src/generate-html.js b/node_modules/@11ty/eleventy-img/src/generate-html.js new file mode 100644 index 0000000..87ade77 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/generate-html.js @@ -0,0 +1,220 @@ +const { escapeAttribute } = require("entities"); + +const LOWSRC_FORMAT_PREFERENCE = ["jpeg", "png", "gif", "svg", "webp", "avif"]; + +const CHILDREN_OBJECT_KEY = "@children"; + +function generateSrcset(metadataFormatEntry) { + if(!Array.isArray(metadataFormatEntry)) { + return ""; + } + + return metadataFormatEntry.map(entry => entry.srcset).join(", "); +} + +/* + Returns: + e.g. { img: { alt: "", src: "" } + e.g. { img: { alt: "", src: "", srcset: "", sizes: "" } } + e.g. { picture: { + class: "", + @children: [ + { source: { srcset: "", sizes: "" } }, + { source: { srcset: "", sizes: "" } }, + { img: { alt: "", src: "", srcset: "", sizes: "" } }, + ] + } + */ +function generateObject(metadata, userDefinedImgAttributes = {}, userDefinedPictureAttributes = {}, options = {}) { + let htmlOptions = options?.htmlOptions || {}; + let imgAttributes = Object.assign({}, options?.defaultAttributes, htmlOptions?.imgAttributes, userDefinedImgAttributes); + let pictureAttributes = Object.assign({}, htmlOptions?.pictureAttributes, userDefinedPictureAttributes); + + // The attributes.src gets overwritten later on. Save it here to make the error outputs less cryptic. + let originalSrc = imgAttributes.src; + + if(imgAttributes.alt === undefined) { + // You bet we throw an error on missing alt (alt="" works okay) + throw new Error(`Missing \`alt\` attribute on eleventy-img shortcode from: ${originalSrc}`); + } + + let formats = Object.keys(metadata); + let values = Object.values(metadata); + let entryCount = 0; + for(let imageFormat of values) { + entryCount += imageFormat.length; + } + + if(entryCount === 0) { + throw new Error("No image results found from `eleventy-img` in generateHTML. Expects a results object similar to: https://www.11ty.dev/docs/plugins/image/#usage."); + } + + let lowsrc; + let lowsrcFormat; + for(let format of LOWSRC_FORMAT_PREFERENCE) { + if((format in metadata) && metadata[format].length) { + lowsrcFormat = format; + lowsrc = metadata[lowsrcFormat]; + break; + } + } + + // Handle if empty intersection between format and LOWSRC_FORMAT_PREFERENCE (e.g. gif) + // If there’s only one format in the results, use that + if(!lowsrc && formats.length === 1) { + lowsrcFormat = formats[0]; + lowsrc = metadata[lowsrcFormat]; + } + + if(!lowsrc || !lowsrc.length) { + throw new Error(`Could not find the lowest source for responsive markup for ${originalSrc}`); + } + + imgAttributes.src = lowsrc[0].url; + + if(htmlOptions.fallback === "largest" || htmlOptions.fallback === undefined) { + imgAttributes.width = lowsrc[lowsrc.length - 1].width; + imgAttributes.height = lowsrc[lowsrc.length - 1].height; + } else if(htmlOptions.fallback === "smallest") { + imgAttributes.width = lowsrc[0].width; + imgAttributes.height = lowsrc[0].height; + } else { + throw new Error("Invalid `fallback` option specified. 'largest' and 'smallest' are supported. Received: " + htmlOptions.fallback); + } + + let imgAttributesWithoutSizes = Object.assign({}, imgAttributes); + delete imgAttributesWithoutSizes.sizes; + + // : one format and one size + if(entryCount === 1) { + return { + img: imgAttributesWithoutSizes + }; + } + + // Per the HTML specification sizes is required srcset is using the `w` unit + // https://html.spec.whatwg.org/dev/semantics.html#the-link-element:attr-link-imagesrcset-4 + // Using the default "100vw" is okay + let missingSizesErrorMessage = `Missing \`sizes\` attribute on eleventy-img shortcode from: ${originalSrc}. Workarounds: 1. Use a single output width for this image 2. Use \`loading="lazy"\` (which uses sizes="auto" though browser support currently varies)`; + + // : one format and multiple sizes + if(formats.length === 1) { // implied entryCount > 1 + if(entryCount > 1 && !imgAttributes.sizes) { + // Use `sizes="auto"` when using `loading="lazy"` instead of throwing an error. + if(imgAttributes.loading === "lazy") { + imgAttributes.sizes = "auto"; + } else { + throw new Error(missingSizesErrorMessage); + } + } + + let imgAttributesCopy = Object.assign({}, imgAttributesWithoutSizes); + imgAttributesCopy.srcset = generateSrcset(lowsrc); + imgAttributesCopy.sizes = imgAttributes.sizes; + + return { + img: imgAttributesCopy + }; + } + + let children = []; + values.filter(imageFormat => { + return imageFormat.length > 0 && (lowsrcFormat !== imageFormat[0].format); + }).forEach(imageFormat => { + if(imageFormat.length > 1 && !imgAttributes.sizes) { + if(imgAttributes.loading === "lazy") { + imgAttributes.sizes = "auto"; + } else { + throw new Error(missingSizesErrorMessage); + } + } + + let sourceAttrs = { + type: imageFormat[0].sourceType, + srcset: generateSrcset(imageFormat), + }; + + if(imgAttributes.sizes) { + sourceAttrs.sizes = imgAttributes.sizes; + } + + children.push({ + "source": sourceAttrs + }); + }); + + /* + Add lowsrc as an img, for browsers that don’t support picture or the formats provided in source + + If we have more than one size, we can use srcset and sizes. + If the browser doesn't support those attributes, it should ignore them. + */ + let imgAttributesForPicture = Object.assign({}, imgAttributesWithoutSizes); + if (lowsrc.length > 1) { + if (!imgAttributes.sizes) { + // Per the HTML specification sizes is required srcset is using the `w` unit + // https://html.spec.whatwg.org/dev/semantics.html#the-link-element:attr-link-imagesrcset-4 + // Using the default "100vw" is okay + throw new Error(missingSizesErrorMessage); + } + + imgAttributesForPicture.srcset = generateSrcset(lowsrc); + imgAttributesForPicture.sizes = imgAttributes.sizes; + } + + children.push({ + "img": imgAttributesForPicture + }); + + return { + "picture": { + ...pictureAttributes, + [CHILDREN_OBJECT_KEY]: children, + } + }; +} + +function mapObjectToHTML(tagName, attrs = {}) { + let attrHtml = Object.entries(attrs).map(entry => { + let [key, value] = entry; + if(key === CHILDREN_OBJECT_KEY) { + return false; + } + + // Issue #82 + if(key === "alt") { + return `${key}="${value ? escapeAttribute(value) : ""}"`; + } + + return `${key}="${value}"`; + }).filter(keyPair => Boolean(keyPair)).join(" "); + + return `<${tagName}${attrHtml ? ` ${attrHtml}` : ""}>`; +} + +function generateHTML(metadata, attributes = {}, htmlOptionsOverride = {}) { + let htmlOptions = Object.assign({}, metadata?.eleventyImage?.htmlOptions, htmlOptionsOverride); + + let isInline = htmlOptions.whitespaceMode !== "block"; + let markup = []; + + // htmlOptions.imgAttributes and htmlOptions.pictureAttributes are merged in generateObject + let obj = generateObject(metadata, attributes, {}, { htmlOptions }); + for(let tag in obj) { + markup.push(mapObjectToHTML(tag, obj[tag])); + + // + if(Array.isArray(obj[tag]?.[CHILDREN_OBJECT_KEY])) { + for(let child of obj[tag][CHILDREN_OBJECT_KEY]) { + let childTagName = Object.keys(child)[0]; + markup.push((!isInline ? " " : "") + mapObjectToHTML(childTagName, child[childTagName])); + } + + markup.push(``); + } + } + return markup.join(!isInline ? "\n" : ""); +} + +module.exports = generateHTML; +module.exports.generateObject = generateObject; diff --git a/node_modules/@11ty/eleventy-img/src/global-options.js b/node_modules/@11ty/eleventy-img/src/global-options.js new file mode 100644 index 0000000..70f8bee --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/global-options.js @@ -0,0 +1,121 @@ +const path = require("node:path"); +const os = require("node:os"); + +const Util = require("./util.js"); +const svgHook = require("./format-hooks/svg.js"); + +const DEFAULTS = { + widths: ["auto"], + formats: ["webp", "jpeg"], // "png", "svg", "avif" + + formatFiltering: ["transparent", "animated"], + + // Via https://github.com/11ty/eleventy-img/issues/258 + concurrency: Math.min(Math.max(8, os.availableParallelism()), 16), + + urlPath: "/img/", + outputDir: "img/", + + // true to skip raster formats if SVG input is found + // "size" to skip raster formats if larger than SVG input + svgShortCircuit: false, + svgAllowUpscale: true, + svgCompressionSize: "", // "br" to report SVG `size` property in metadata as Brotli compressed + // overrideInputFormat: false, // internal, used to force svg output in statsSync et al + sharpOptions: {}, // options passed to the Sharp constructor + sharpWebpOptions: {}, // options passed to the Sharp webp output method + sharpPngOptions: {}, // options passed to the Sharp png output method + sharpJpegOptions: {}, // options passed to the Sharp jpeg output method + sharpAvifOptions: {}, // options passed to the Sharp avif output method + + formatHooks: { + svg: svgHook, + }, + + cacheDuration: "1d", // deprecated, use cacheOptions.duration + + // disk cache for remote assets + cacheOptions: { + // duration: "1d", + // directory: ".cache", + // removeUrlQueryParams: false, + // fetchOptions: {}, + }, + + filenameFormat: null, + + // urlFormat allows you to return a full URL to an image including the domain. + // Useful when you’re using your own hosted image service (probably via .statsSync or .statsByDimensionsSync) + // Note: when you use this, metadata will not include .filename or .outputPath + urlFormat: null, + + // If true, skips all image processing, just return stats. Doesn’t read files, doesn’t write files. + // Important to note that `dryRun: true` performs image processing and includes a buffer—this does not. + // Useful when used with `urlFormat` above. + // Better than .statsSync* functions, because this will use the in-memory cache and de-dupe requests. Those will not. + statsOnly: false, + remoteImageMetadata: {}, // For `statsOnly` remote images, this needs to be populated with { width, height, format? } + + useCache: true, // in-memory and disk cache + dryRun: false, // Also returns a buffer instance in the return object. Doesn’t write anything to the file system + + hashLength: 10, // Truncates the hash to this length + + fixOrientation: false, // always rotate images to ensure correct orientation + + // When the original width is smaller than the desired output width, this is the minimum size difference + // between the next smallest image width that will generate one extra width in the output. + // e.g. when using `widths: [400, 800]`, the source image would need to be at least (400 * 1.25 =) 500px wide + // to generate two outputs (400px, 500px). If the source image is less than 500px, only one output will + // be generated (400px). + // Read more at https://github.com/11ty/eleventy-img/issues/184 and https://github.com/11ty/eleventy-img/pull/190 + minimumThreshold: 1.25, + + // During --serve mode in Eleventy, this will generate images on request instead of part of the build skipping + // writes to the file system and speeding up builds! + transformOnRequest: false, + + // operate on Sharp instance manually. + transform: undefined, + + // return HTML from generateHTML directly + returnType: "object", // or "html" + + // Defaults used when generateHTML is called from a result set + htmlOptions: { + imgAttributes: {}, + pictureAttributes: {}, + + whitespaceMode: "inline", // "block" + + // the will use the largest dimensions for width/height (when multiple output widths are specified) + // see https://github.com/11ty/eleventy-img/issues/63 + fallback: "largest", // or "smallest" + }, + + // v5.0.0 Removed `extensions`, option to override output format with new file extension. It wasn’t being used anywhere or documented. + // v6.0.0, removed `useCacheValidityInHash: true` see https://github.com/11ty/eleventy-img/issues/146#issuecomment-2555741376 +}; + +function getGlobalOptions(eleventyConfig, options, via) { + let directories = eleventyConfig.directories; + let globalOptions = Object.assign({ + packages: { + image: require("../"), + }, + outputDir: path.join(directories.output, options.urlPath || ""), + failOnError: true, + }, options); + + globalOptions.directories = directories; + globalOptions.generatedVia = via; + + Util.addConfig(eleventyConfig, globalOptions); + + return globalOptions; +} + +module.exports = { + getGlobalOptions, + defaults: DEFAULTS, +}; diff --git a/node_modules/@11ty/eleventy-img/src/image-attrs-to-posthtml-node.js b/node_modules/@11ty/eleventy-img/src/image-attrs-to-posthtml-node.js new file mode 100644 index 0000000..55b41b1 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/image-attrs-to-posthtml-node.js @@ -0,0 +1,140 @@ +const eleventyImage = require("../img.js"); +const Util = require("./util.js"); + +const ATTR_PREFIX = "eleventy:"; + +const CHILDREN_OBJECT_KEY = "@children"; + +const ATTR = { + IGNORE: `${ATTR_PREFIX}ignore`, + WIDTHS: `${ATTR_PREFIX}widths`, + FORMATS: `${ATTR_PREFIX}formats`, + OUTPUT: `${ATTR_PREFIX}output`, + OPTIONAL: `${ATTR_PREFIX}optional`, + PICTURE: `${ATTR_PREFIX}pictureattr:`, +}; + +function getPictureAttributesFromImgNode(attrs = {}) { + let pictureAttrs = {}; + for(let key in attrs) { + // hoists to ` + // e.g. hoists to + if(key.startsWith(ATTR.PICTURE)) { + pictureAttrs[key.slice(ATTR.PICTURE.length)] = attrs[key]; + } + } + return pictureAttrs; +} + +function convertToPosthtmlNode(obj) { + // node.tag + // node.attrs + // node.content + + let node = {}; + let [key] = Object.keys(obj); + node.tag = key; + + let children = obj[key]?.[CHILDREN_OBJECT_KEY]; + let attributes = {}; + for(let attrKey in obj[key]) { + if(attrKey !== CHILDREN_OBJECT_KEY) { + attributes[attrKey] = obj[key][attrKey]; + } + } + node.attrs = attributes; + + if(Array.isArray(children)) { + node.content = obj[key]?.[CHILDREN_OBJECT_KEY] + .filter(child => Boolean(child)) + .map(child => { + return convertToPosthtmlNode(child); + }); + } + + return node; +} + +function isValidSimpleWidthAttribute(width) { + // `width` must be a single integer (not comma separated). Don’t use invalid HTML in width attribute. Use eleventy:widths if you want more complex support + return (""+width) == (""+parseInt(width, 10)); +} + +async function imageAttributesToPosthtmlNode(attributes, instanceOptions, globalPluginOptions) { + if(!attributes.src) { + throw new Error("Missing `src` attribute for `@11ty/eleventy-img`"); + } + + if(!globalPluginOptions) { + throw new Error("Missing global defaults for `@11ty/eleventy-img`: did you call addPlugin?"); + } + + if(!instanceOptions) { + instanceOptions = {}; + } + + // overrides global widths + if(attributes.width && isValidSimpleWidthAttribute(attributes.width)) { + // Support `width` but only single value + instanceOptions.widths = [ parseInt(attributes.width, 10) ]; + } else if(attributes[ATTR.WIDTHS] && typeof attributes[ATTR.WIDTHS] === "string") { + instanceOptions.widths = attributes[ATTR.WIDTHS].split(",").map(entry => parseInt(entry, 10)); + } + + if(attributes[ATTR.FORMATS] && typeof attributes[ATTR.FORMATS] === "string") { + instanceOptions.formats = attributes[ATTR.FORMATS].split(","); + } + + let options = Object.assign({}, globalPluginOptions, instanceOptions); + Util.addConfig(globalPluginOptions.eleventyConfig, options); + + let metadata = await eleventyImage(attributes.src, options); + let pictureAttributes = getPictureAttributesFromImgNode(attributes); + + cleanAttrs(attributes); + + // You bet we throw an error on missing alt in `imageAttributes` (alt="" works okay) + let obj = await eleventyImage.generateObject(metadata, attributes, pictureAttributes, options); + return convertToPosthtmlNode(obj); +} + +function cleanAttrs(attrs = {}) { + for(let key in attrs) { + if(key.startsWith(ATTR_PREFIX)) { + delete attrs?.[key]; + } + } +} + +function cleanTag(node) { + // Delete all prefixed attributes + cleanAttrs(node?.attrs); +} + +function isIgnored(node) { + return node?.attrs && node?.attrs?.[ATTR.IGNORE] !== undefined; +} + +function isOptional(node, comparisonValue) { + let attrValue = node?.attrs && node?.attrs?.[ATTR.OPTIONAL]; + if(attrValue !== undefined) { + // if comparisonValue is not specified, return true + if(comparisonValue === undefined) { + return true; + } + return attrValue === comparisonValue; + } + return false; +} + +function getOutputDirectory(node) { + return node?.attrs?.[ATTR.OUTPUT]; +} + +module.exports = { + imageAttributesToPosthtmlNode, + cleanTag, + isIgnored, + isOptional, + getOutputDirectory, +}; diff --git a/node_modules/@11ty/eleventy-img/src/image-path.js b/node_modules/@11ty/eleventy-img/src/image-path.js new file mode 100644 index 0000000..1a875c7 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/image-path.js @@ -0,0 +1,30 @@ +const path = require("node:path"); + +class ImagePath { + static filenameFormat(id, src, width, format) { // and options + if (width) { + return `${id}-${width}.${format}`; + } + + return `${id}.${format}`; + } + + static getFilename(id, src, width, format, options = {}) { + if (typeof options.filenameFormat === "function") { + let filename = options.filenameFormat(id, src, width, format, options); + // if options.filenameFormat returns falsy, use fallback filename + if(filename) { + return filename; + } + } + + return ImagePath.filenameFormat(id, src, width, format, options); + } + + static convertFilePathToUrl(dir, filename) { + let src = path.join(dir, filename); + return src.split(path.sep).join("/"); + } +} + +module.exports = ImagePath; diff --git a/node_modules/@11ty/eleventy-img/src/image.js b/node_modules/@11ty/eleventy-img/src/image.js new file mode 100644 index 0000000..0f01861 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/image.js @@ -0,0 +1,930 @@ +const fs = require("node:fs"); +const fsp = fs.promises; +const path = require("node:path"); +const getImageSize = require("image-size"); +const debugUtil = require("debug"); + +const { createHashSync } = require("@11ty/eleventy-utils"); +const { Fetch } = require("@11ty/eleventy-fetch"); + +const sharp = require("./adapters/sharp.js"); +const brotliSize = require("./adapters/brotli-size.js"); +const Util = require("./util.js"); +const ImagePath = require("./image-path.js"); +const generateHTML = require("./generate-html.js"); + +const GLOBAL_OPTIONS = require("./global-options.js").defaults; +const { existsCache, memCache, diskCache } = require("./caches.js"); + +const debug = debugUtil("Eleventy:Image"); +const debugAssets = debugUtil("Eleventy:Assets"); + +const MIME_TYPES = { + "jpeg": "image/jpeg", + "webp": "image/webp", + "png": "image/png", + "svg": "image/svg+xml", + "avif": "image/avif", + "gif": "image/gif", +}; + +const FORMAT_ALIASES = { + "jpg": "jpeg", + // if you’re working from a mime type input, let’s alias it back to svg + "svg+xml": "svg", +}; + +const ANIMATED_TYPES = [ + "webp", + "gif", +]; + +const TRANSPARENCY_TYPES = [ + "avif", + "png", + "webp", + "gif", + "svg", +]; + +const MINIMUM_TRANSPARENCY_TYPES = [ + "png", + "gif", + "svg", +]; + +class Image { + #input; + #contents = {}; + #queue; + #queuePromise; + #buildLogger; + #computedHash; + #directoryManager; + + constructor(src, options = {}) { + if(!src) { + throw new Error("`src` is a required argument to the eleventy-img utility (can be a String file path, String URL, or Buffer)."); + } + + this.src = src; + this.isRemoteUrl = typeof src === "string" && Util.isRemoteUrl(src); + + this.rawOptions = options; + this.options = Object.assign({}, GLOBAL_OPTIONS, options); + + // Compatible with eleventy-dev-server and Eleventy 3.0.0-alpha.7+ in serve mode. + if(this.options.transformOnRequest && !this.options.urlFormat) { + this.options.urlFormat = function({ src, width, format }/*, imageOptions*/, options) { + return `/.11ty/image/?src=${encodeURIComponent(src)}&width=${width}&format=${format}${options.generatedVia ? `&via=${options.generatedVia}` : ""}`; + }; + + this.options.statsOnly = true; + } + + if(this.isRemoteUrl) { + this.cacheOptions = Object.assign({ + type: "buffer", + // deprecated in Eleventy Image, but we already prefer this.cacheOptions.duration automatically + duration: this.options.cacheDuration, + // Issue #117: re-use eleventy-img dryRun option value for eleventy-fetch dryRun + dryRun: this.options.dryRun, + }, this.options.cacheOptions); + + // v6.0.0 this now inherits eleventy-fetch option defaults + this.assetCache = Fetch(src, this.cacheOptions); + } + } + + setQueue(queue) { + this.#queue = queue; + } + + setBuildLogger(buildLogger) { + this.#buildLogger = buildLogger; + } + + setDirectoryManager(manager) { + this.#directoryManager = manager; + } + + get directoryManager() { + if(!this.#directoryManager) { + throw new Error("Missing #directoryManager"); + } + + return this.#directoryManager; + } + + get buildLogger() { + if(!this.#buildLogger) { + throw new Error("Missing #buildLogger. Call `setBuildLogger`"); + } + return this.#buildLogger; + } + + // In memory cache is up front, handles promise de-duping from input (this does not use getHash) + // Note: output cache is also in play below (uses getHash) + getInMemoryCacheKey() { + let opts = Util.getSortedObject(this.options); + + opts.__originalSrc = this.src; + + if(this.isRemoteUrl) { + opts.sourceUrl = this.src; // the source url + } else if(Buffer.isBuffer(this.src)) { + opts.sourceUrl = this.src.toString(); + opts.__originalSize = this.src.length; + } else { + // Important: do not cache this + opts.__originalSize = fs.statSync(this.src).size; + } + + return JSON.stringify(opts, function(key, value) { + // allows `transform` functions to be truthy for in-memory key + if (typeof value === "function") { + return "" + (value.name || ""); + } + return value; + }); + } + + getFileContents(overrideLocalFilePath) { + if(!overrideLocalFilePath && this.isRemoteUrl) { + return false; + } + + let src = overrideLocalFilePath || this.src; + + if(!this.#contents[src]) { + // perf: check to make sure it’s not a string first + if(typeof src !== "string" && Buffer.isBuffer(src)) { + this.#contents[src] = src; + } else { + debugAssets("[11ty/eleventy-img] Reading %o", src); + this.#contents[src] = fs.readFileSync(src); + } + } + + // Always + return this.#contents[src]; + } + + static getValidWidths(originalWidth, widths = [], allowUpscale = false, minimumThreshold = 1) { + // replace any falsy values with the original width + let valid = widths.map(width => !width || width === 'auto' ? originalWidth : width); + + // Convert strings to numbers, "400" (floats are not allowed in sharp) + valid = valid.map(width => parseInt(width, 10)); + + // Replace any larger-than-original widths with the original width if upscaling is not allowed. + // This ensures that if a larger width has been requested, we're at least providing the closest + // non-upscaled image that we can. + if (!allowUpscale) { + let lastWidthWasBigEnough = true; // first one is always valid + valid = valid.sort((a, b) => a - b).map(width => { + if(width > originalWidth) { + if(lastWidthWasBigEnough) { + return originalWidth; + } + return -1; + } + + lastWidthWasBigEnough = originalWidth > Math.floor(width * minimumThreshold); + + return width; + }).filter(width => width > 0); + } + + // Remove duplicates (e.g., if null happens to coincide with an explicit width + // or a user passes in multiple duplicate values, or multiple larger-than-original + // widths have resulted in the original width being included multiple times) + valid = [...new Set(valid)]; + + // sort ascending + return valid.sort((a, b) => a - b); + } + + static getFormatsArray(formats, autoFormat, svgShortCircuit, isAnimated, hasTransparency) { + if(formats && formats.length) { + if(typeof formats === "string") { + formats = formats.split(","); + } + + formats = formats.map(format => { + if(autoFormat) { + if((!format || format === "auto")) { + format = autoFormat; + } + } + + if(FORMAT_ALIASES[format]) { + return FORMAT_ALIASES[format]; + } + return format; + }); + + if(svgShortCircuit !== "size") { + // svg must come first for possible short circuiting + formats.sort((a, b) => { + if(a === "svg") { + return -1; + } else if(b === "svg") { + return 1; + } + return 0; + }); + } + + if(isAnimated) { + let validAnimatedFormats = formats.filter(f => ANIMATED_TYPES.includes(f)); + // override formats if a valid animated format is found, otherwise leave as-is + if(validAnimatedFormats.length > 0) { + debug("Filtering non-animated formats from output: from %o to %o", formats, validAnimatedFormats); + formats = validAnimatedFormats; + } else { + debug("No animated output formats found for animated image, using original formats (may be a static image): %o", formats); + } + } + + if(hasTransparency) { + let minimumValidTransparencyFormats = formats.filter(f => MINIMUM_TRANSPARENCY_TYPES.includes(f)); + // override formats if a valid animated format is found, otherwise leave as-is + if(minimumValidTransparencyFormats.length > 0) { + let validTransparencyFormats = formats.filter(f => TRANSPARENCY_TYPES.includes(f)); + debug("Filtering non-transparency-friendly formats from output: from %o to %o", formats, validTransparencyFormats); + formats = validTransparencyFormats; + } else { + debug("At least one transparency-friendly output format of %o must be included if the source image has an alpha channel, skipping formatFiltering and using original formats: %o", MINIMUM_TRANSPARENCY_TYPES, formats); + } + } + + // Remove duplicates (e.g., if null happens to coincide with an explicit format + // or a user passes in multiple duplicate values) + formats = [...new Set(formats)]; + + return formats; + } + + return []; + } + + #transformRawFiles(files = []) { + let byType = {}; + for(let file of files) { + if(!byType[file.format]) { + byType[file.format] = []; + } + byType[file.format].push(file); + } + for(let type in byType) { + // sort by width, ascending (for `srcset`) + byType[type].sort((a, b) => { + return a.width - b.width; + }); + } + + let filterLargeRasterImages = this.options.svgShortCircuit === "size"; + let svgEntry = byType.svg; + let svgSize = svgEntry && svgEntry.length && svgEntry[0].size; + + if(filterLargeRasterImages && svgSize) { + for(let type of Object.keys(byType)) { + if(type === "svg") { + continue; + } + + let svgAdded = false; + let originalFormatKept = false; + byType[type] = byType[type].map(entry => { + if(entry.size > svgSize) { + if(!svgAdded) { + svgAdded = true; + // need at least one raster smaller than SVG to do this trick + if(originalFormatKept) { + return svgEntry[0]; + } + // all rasters are bigger + return false; + } + + return false; + } + + originalFormatKept = true; + return entry; + }).filter(entry => entry); + } + } + + return byType; + } + + #finalizeResults(results = {}) { + // used when results are passed to generate HTML, we maintain some internal metadata about the options used. + let imgAttributes = this.options.htmlOptions?.imgAttributes || {}; + imgAttributes.src = this.src; + + Object.defineProperty(results, "eleventyImage", { + enumerable: false, + writable: false, + value: { + htmlOptions: { + whitespaceMode: this.options.htmlOptions?.whitespaceMode, + imgAttributes, + pictureAttributes: this.options.htmlOptions?.pictureAttributes, + fallback: this.options.htmlOptions?.fallback, + }, + } + }); + + // renamed `return` to `returnType` to match Fetch API in v6.0.0-beta.3 + if(this.options.returnType === "html" || this.options.return === "html") { + return generateHTML(results); + } + + return results; + } + + getSharpOptionsForFormat(format) { + if(format === "webp") { + return this.options.sharpWebpOptions; + } else if(format === "jpeg") { + return this.options.sharpJpegOptions; + } else if(format === "png") { + return this.options.sharpPngOptions; + } else if(format === "avif") { + return this.options.sharpAvifOptions; + } + return {}; + } + + async getInput() { + // internal cache + if(!this.#input) { + if(this.isRemoteUrl) { + // fetch remote image Buffer + this.#input = this.assetCache.queue(); + } else { + // not actually a promise, this is sync + this.#input = this.getFileContents(); + } + } + + return this.#input; + } + + getHash() { + if (this.#computedHash) { + return this.#computedHash; + } + + // debug("Creating hash for %o", this.src); + let hashContents = []; + + if(existsCache.exists(this.src)) { + let fileContents = this.getFileContents(); + + // If the file starts with whitespace or the '<' character, it might be SVG. + // Otherwise, skip the expensive buffer.toString() call + // (no point in unicode encoding a binary file) + let fileContentsPrefix = fileContents?.slice(0, 1)?.toString()?.trim(); + if (!fileContentsPrefix || fileContentsPrefix[0] == "<") { + // remove all newlines for hashing for better cross-OS hash compatibility (Issue #122) + let fileContentsStr = fileContents.toString(); + let firstFour = fileContentsStr.trim().slice(0, 5); + if(firstFour === "8 as 1 (normal) but check anyways + return orientation >= 5 && orientation <= 8; + } + + isAnimated(metadata) { + // sharp options have animated image support enabled + if(!this.options?.sharpOptions?.animated) { + return false; + } + + let isAnimationFriendlyFormat = ANIMATED_TYPES.includes(metadata.format); + if(!isAnimationFriendlyFormat) { + return false; + } + + if(metadata?.pages) { + // input has multiple pages: https://sharp.pixelplumbing.com/api-input#metadata + // this is *unknown* when not called from `resize` (limited metadata available) + return metadata?.pages > 1; + } + + // Best guess + return isAnimationFriendlyFormat; + } + + getEntryFormat(metadata) { + return metadata.format || this.options.overrideInputFormat; + } + + // metadata so far: width, height, format + // src is used to calculate the output file names + getFullStats(metadata) { + let results = []; + let isImageAnimated = this.isAnimated(metadata) && Array.isArray(this.options.formatFiltering) && this.options.formatFiltering.includes("animated"); + let hasAlpha = metadata.hasAlpha && Array.isArray(this.options.formatFiltering) && this.options.formatFiltering.includes("transparent"); + let entryFormat = this.getEntryFormat(metadata); + let outputFormats = Image.getFormatsArray(this.options.formats, entryFormat, this.options.svgShortCircuit, isImageAnimated, hasAlpha); + + if (this.needsRotation(metadata.orientation)) { + [metadata.height, metadata.width] = [metadata.width, metadata.height]; + } + + if(metadata.pageHeight) { + // When the { animated: true } option is provided to sharp, animated + // image formats like gifs or webp will have an inaccurate `height` value + // in their metadata which is actually the height of every single frame added together. + // In these cases, the metadata will contain an additional `pageHeight` property which + // is the height that the image should be displayed at. + metadata.height = metadata.pageHeight; + } + + for(let outputFormat of outputFormats) { + if(!outputFormat || outputFormat === "auto") { + throw new Error("When using statsSync or statsByDimensionsSync, `formats: [null | 'auto']` to use the native image format is not supported."); + } + + if(outputFormat === "svg") { + if(entryFormat === "svg") { + let svgStats = this.getStat("svg", metadata.width, metadata.height); + + // SVG metadata.size is only available with Buffer input (remote urls) + if(metadata.size) { + // Note this is unfair for comparison with raster formats because its uncompressed (no GZIP, etc) + svgStats.size = metadata.size; + } + results.push(svgStats); + + if(this.options.svgShortCircuit === true) { + break; + } else { + continue; + } + } else { + debug("Skipping SVG output for %o: received raster input.", this.src); + continue; + } + } else { // not outputting SVG (might still be SVG input though!) + let widths = Image.getValidWidths(metadata.width, this.options.widths, metadata.format === "svg" && this.options.svgAllowUpscale, this.options.minimumThreshold); + for(let width of widths) { + let height = Image.getAspectRatioHeight(metadata, width); + + results.push(this.getStat(outputFormat, width, height)); + } + } + } + + return this.#transformRawFiles(results); + } + + static getDimensionsFromSharp(sharpInstance, stat) { + let dims = {}; + if(sharpInstance.options.width > -1) { + dims.width = sharpInstance.options.width; + dims.resized = true; + } + if(sharpInstance.options.height > -1) { + dims.height = sharpInstance.options.height; + dims.resized = true; + } + + if(dims.width || dims.height) { + if(!dims.width) { + dims.width = Image.getAspectRatioWidth(stat, dims.height); + } + if(!dims.height) { + dims.height = Image.getAspectRatioHeight(stat, dims.width); + } + } + + return dims; + } + + static getAspectRatioWidth(originalDimensions, newHeight) { + return Math.floor(newHeight * originalDimensions.width / originalDimensions.height); + } + + static getAspectRatioHeight(originalDimensions, newWidth) { + // Warning: if this is a guess via statsByDimensionsSync and that guess is wrong + // The aspect ratio will be wrong and any height/widths returned will be wrong! + return Math.floor(newWidth * originalDimensions.height / originalDimensions.width); + } + + getOutputSize(contents, filePath) { + if(contents) { + if(this.options.svgCompressionSize === "br") { + return brotliSize(contents); + } + + if("length" in contents) { + return contents.length; + } + } + + // fallback to looking on local file system + if(!filePath) { + throw new Error("`filePath` expected."); + } + + return fs.statSync(filePath).size; + } + + isOutputCached(targetFile, sourceInput) { + if(!this.options.useCache) { + return false; + } + + // last cache was a miss, so we must write to disk + if(this.assetCache && !this.assetCache.wasLastFetchCacheHit()) { + return false; + } + + if(!diskCache.isCached(targetFile, sourceInput, !Util.isRequested(this.options.generatedVia))) { + return false; + } + + return true; + } + + // src should be a file path to an image or a buffer + async resize(input) { + let sharpInputImage = sharp(input, Object.assign({ + // Deprecated by sharp, use `failOn` option instead + // https://github.com/lovell/sharp/blob/1533bf995acda779313fc178d2b9d46791349961/lib/index.d.ts#L915 + failOnError: false, + }, this.options.sharpOptions)); + + // Must find the image format from the metadata + // File extensions lie or may not be present in the src url! + let sharpMetadata = await sharpInputImage.metadata(); + + let outputFilePromises = []; + + let fullStats = this.getFullStats(sharpMetadata); + + for(let outputFormat in fullStats) { + for(let stat of fullStats[outputFormat]) { + if(this.isOutputCached(stat.outputPath, input)) { + // Cached images already exist in output + let outputFileContents; + + if(this.options.dryRun || outputFormat === "svg" && this.options.svgCompressionSize === "br") { + outputFileContents = this.getFileContents(stat.outputPath); + } + + if(this.options.dryRun) { + stat.buffer = outputFileContents; + } + + stat.size = this.getOutputSize(outputFileContents, stat.outputPath); + + outputFilePromises.push(Promise.resolve(stat)); + continue; + } + + let sharpInstance = sharpInputImage.clone(); + let transform = this.options.transform; + let isTransformResize = false; + + if(transform) { + if(typeof transform !== "function") { + throw new Error("Expected `function` type in `transform` option. Received: " + transform); + } + + await transform(sharpInstance); + + // Resized in a transform (maybe for a crop) + let dims = Image.getDimensionsFromSharp(sharpInstance, stat); + if(dims.resized) { + isTransformResize = true; + + // Overwrite current `stat` object with new sizes and file names + stat = this.getStat(stat.format, dims.width, dims.height); + } + } + + // https://github.com/11ty/eleventy-img/issues/244 + sharpInstance.keepIccProfile(); + + // Output images do not include orientation metadata (https://github.com/11ty/eleventy-img/issues/52) + // Use sharp.rotate to bake orientation into the image (https://github.com/lovell/sharp/blob/v0.32.6/docs/api-operation.md#rotate): + // > If no angle is provided, it is determined from the EXIF data. Mirroring is supported and may infer the use of a flip operation. + // > The use of rotate without an angle will remove the EXIF Orientation tag, if any. + if(this.options.fixOrientation || this.needsRotation(sharpMetadata.orientation)) { + sharpInstance.rotate(); + } + + if(!isTransformResize) { + if(stat.width < sharpMetadata.width || (this.options.svgAllowUpscale && sharpMetadata.format === "svg")) { + let resizeOptions = { + width: stat.width + }; + + if(sharpMetadata.format !== "svg" || !this.options.svgAllowUpscale) { + resizeOptions.withoutEnlargement = true; + } + + sharpInstance.resize(resizeOptions); + } + } + + // Format hooks take priority over Sharp processing. + // format hooks are only used for SVG out of the box + if(this.options.formatHooks && this.options.formatHooks[outputFormat]) { + let hookResult = await this.options.formatHooks[outputFormat].call(stat, sharpInstance); + if(hookResult) { + stat.size = this.getOutputSize(hookResult); + + if(this.options.dryRun) { + stat.buffer = Buffer.from(hookResult); + + outputFilePromises.push(Promise.resolve(stat)); + } else { + this.directoryManager.createFromFile(stat.outputPath); + + debugAssets("[11ty/eleventy-img] Writing %o", stat.outputPath); + + outputFilePromises.push(fsp.writeFile(stat.outputPath, hookResult).then(() => stat)); + } + } + } else { // not a format hook + let sharpFormatOptions = this.getSharpOptionsForFormat(outputFormat); + let hasFormatOptions = Object.keys(sharpFormatOptions).length > 0; + if(hasFormatOptions || outputFormat && sharpMetadata.format !== outputFormat) { + // https://github.com/lovell/sharp/issues/3680 + // Fix heic regression in sharp 0.33 + if(outputFormat === "heic" && !sharpFormatOptions.compression) { + sharpFormatOptions.compression = "av1"; + } + sharpInstance.toFormat(outputFormat, sharpFormatOptions); + } + + if(!this.options.dryRun && stat.outputPath) { + // Should never write when dryRun is true + this.directoryManager.createFromFile(stat.outputPath); + + debugAssets("[11ty/eleventy-img] Writing %o", stat.outputPath); + + outputFilePromises.push( + sharpInstance.toFile(stat.outputPath) + .then(info => { + stat.size = info.size; + return stat; + }) + ); + } else { + outputFilePromises.push(sharpInstance.toBuffer({ resolveWithObject: true }).then(({ data, info }) => { + stat.buffer = data; + stat.size = info.size; + return stat; + })); + } + } + + if(stat.outputPath) { + if(this.options.dryRun) { + debug( "Generated %o", stat.url ); + } else { + debug( "Wrote %o", stat.outputPath ); + } + } + } + } + + return Promise.all(outputFilePromises).then(files => this.#finalizeResults(this.#transformRawFiles(files))); + } + + async getStatsOnly() { + if(typeof this.src !== "string" || !this.options.statsOnly) { + return; + } + + let input; + if(Util.isRemoteUrl(this.src)) { + if(this.rawOptions.remoteImageMetadata?.width && this.rawOptions.remoteImageMetadata?.height) { + return this.getFullStats({ + width: this.rawOptions.remoteImageMetadata.width, + height: this.rawOptions.remoteImageMetadata.height, + format: this.rawOptions.remoteImageMetadata.format, // only required if you want to use the "auto" format + guess: true, + }); + } + + // Fetch remote image to operate on it + // `remoteImageMetadata` is no longer required for statsOnly on remote images + input = await this.getInput(); + } + + // Local images + try { + // Related to https://github.com/11ty/eleventy-img/issues/295 + let { width, height, type } = getImageSize(input || this.src); + + return this.getFullStats({ + width, + height, + format: type // only required if you want to use the "auto" format + }); + } catch(e) { + throw new Error(`Eleventy Image error (statsOnly): \`image-size\` on "${this.src}" failed. Original error: ${e.message}`); + } + } + + // returns raw Promise + queue() { + if(!this.#queue) { + return Promise.reject(new Error("Missing #queue.")); + } + + if(this.#queuePromise) { + return this.#queuePromise; + } + + debug("Processing %o (in-memory cache miss), options: %o", this.src, this.options); + + this.#queuePromise = this.#queue.add(async () => { + try { + if(typeof this.src === "string" && this.options.statsOnly) { + return this.getStatsOnly(); + } + + this.buildLogger.log(`Processing ${this.buildLogger.getFriendlyImageSource(this.src)}`, this.options); + + let input = await this.getInput(); + + return this.resize(input); + } catch(e) { + this.buildLogger.error(`Error: ${e.message} (via ${this.buildLogger.getFriendlyImageSource(this.src)})`, this.options); + + if(this.options.failOnError) { + throw e; + } + } + }); + + return this.#queuePromise; + } + + // Factory to return from cache if available + static create(src, options = {}) { + let img = new Image(src, options); + + // use resolved options for this + if(!img.options.useCache) { + return img; + } + + let key = img.getInMemoryCacheKey(); + let cached = memCache.get(key, !options.transformOnRequest && !Util.isRequested(options.generatedVia)); + if(cached) { + return cached; + } + + memCache.add(key, img); + + return img; + } + + /* `statsSync` doesn’t generate any files, but will tell you where + * the asynchronously generated files will end up! This is useful + * in synchronous-only template environments where you need the + * image URLs synchronously but can’t rely on the files being in + * the correct location yet. + * + * `options.dryRun` is still asynchronous but also doesn’t generate + * any files. + */ + statsSync() { + if(this.isRemoteUrl) { + throw new Error("`statsSync` is not supported with remote sources. Use `statsByDimensionsSync(src, width, height, options)` instead."); + } + + let dimensions = getImageSize(this.src); + + return this.getFullStats({ + width: dimensions.width, + height: dimensions.height, + format: dimensions.type, + }); + } + + static statsSync(src, opts) { + if(typeof src === "string" && Util.isRemoteUrl(src)) { + throw new Error("`statsSync` is not supported with remote sources. Use `statsByDimensionsSync(src, width, height, options)` instead."); + } + + let img = Image.create(src, opts); + return img.statsSync(); + } + + statsByDimensionsSync(width, height) { + let dimensions = { + width, + height, + guess: true + }; + return this.getFullStats(dimensions); + } + + static statsByDimensionsSync(src, width, height, opts) { + let img = Image.create(src, opts); + return img.statsByDimensionsSync(width, height); + } +} + +module.exports = Image; diff --git a/node_modules/@11ty/eleventy-img/src/memory-cache.js b/node_modules/@11ty/eleventy-img/src/memory-cache.js new file mode 100644 index 0000000..3ff63c0 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/memory-cache.js @@ -0,0 +1,54 @@ +const debug = require("debug")("Eleventy:Image"); + +class MemoryCache { + constructor() { + this.cache = {}; + this.hitCounter = 0; + this.missCounter = 0; + } + + resetCount() { + this.hitCounter = 0; + this.missCounter = 0; + } + + getCount() { + return [this.hitCounter, this.missCounter]; + } + + add(key, results) { + this.cache[key] = { + results + }; + + debug("Unique images processed: %o", this.size()); + } + + get(key, incrementCounts = false) { + if(this.cache[key]) { + if(incrementCounts) { + this.hitCounter++; + } + // debug("Images re-used (via in-memory cache): %o", this.hitCounter); + + // may return promise + return this.cache[key].results; + } + + if(incrementCounts) { + this.missCounter++; + } + + return false; + } + + has(key) { + return key in this.cache; + } + + size() { + return Object.keys(this.cache).length; + } +} + +module.exports = MemoryCache; diff --git a/node_modules/@11ty/eleventy-img/src/on-request-during-serve-plugin.js b/node_modules/@11ty/eleventy-img/src/on-request-during-serve-plugin.js new file mode 100644 index 0000000..30e707d --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/on-request-during-serve-plugin.js @@ -0,0 +1,105 @@ +const fs = require("node:fs"); +const { TemplatePath } = require("@11ty/eleventy-utils"); + +const eleventyImage = require("../img.js"); +const setupLogger = eleventyImage.setupLogger; +const Util = require("./util.js"); + +const debug = require("debug")("Eleventy:Image"); + +function eleventyImageOnRequestDuringServePlugin(eleventyConfig, options = {}) { + try { + // Throw an error if the application is not using Eleventy 3.0.0-alpha.7 or newer (including prereleases). + eleventyConfig.versionCheck(">=3.0.0-alpha.7"); + } catch(e) { + console.log( `[11ty/eleventy-img] Warning: your version of Eleventy is incompatible with the dynamic image rendering plugin (see \`eleventyImageOnRequestDuringServePlugin\`). Any dynamically rendered images will 404 (be missing) during --serve mode but will not affect the standard build output: ${e.message}` ); + } + + setupLogger(eleventyConfig, {}); + + // Eleventy 3.0 or newer only. + eleventyConfig.setServerOptions({ + onRequest: { + // TODO work with dev-server’s option for `injectedScriptsFolder` + "/.11ty/image/": async function({ url }) { + // src could be file path or full url + let src = url.searchParams.get("src"); + let imageFormat = url.searchParams.get("format"); + let width = parseInt(url.searchParams.get("width"), 10); + let via = url.searchParams.get("via"); + + let defaultOptions; + if(via === "webc") { + defaultOptions = eleventyConfig.getFilter("__private_eleventyImageConfigurationOptions")(); + } else if(via === "transform") { + defaultOptions = eleventyConfig.getFilter("__private_eleventyImageTransformConfigurationOptions")(); + } + // if using this plugin directly (not via webc or transform), global default options will need to be passed in to the `addPlugin` call directly + + // Prefer options passed to this plugin, fallback to Transform plugin or WebC options if the image source was generated via those options. + let opts = Object.assign({}, defaultOptions, options, { + widths: [width || "auto"], + formats: [imageFormat || "auto"], + + dryRun: true, + cacheOptions: { + // We *do* want to write files to .cache for re-use here. + dryRun: false + }, + + transformOnRequest: false, // use the built images so we don’t go in a loop + generatedVia: Util.KEYS.requested, + }); + + Util.addConfig(eleventyConfig, opts); + + debug( `%o transformed on request to %o at %o width.`, src, imageFormat, width ); + + try { + if(!Util.isFullUrl(src)) { + // Image path on file system must be in working directory + src = TemplatePath.absolutePath(".", src); + + if(!fs.existsSync(src) || !src.startsWith(TemplatePath.absolutePath("."))) { + throw new Error(`Invalid path: ${src}`); + } + } + + let stats = await eleventyImage(src, opts); + + let format = Object.keys(stats).pop(); + let stat = stats[format][0]; + if(!stat) { + throw new Error("Invalid image format."); + } + if(!stat.buffer) { + throw new Error("Could not find `buffer` property for image."); + } + + return { + headers: { + // TODO Set cache headers to match eleventy-fetch cache options (though remote fetchs are still written to .cache) + "Content-Type": stat.sourceType, + }, + body: stat.buffer, + }; + } catch (error) { + debug("Error attempting to transform %o: %O", src, error); + + return { + status: 500, + headers: { + "Content-Type": "image/svg+xml", + "x-error-message": error.message + }, + body: ``, + }; + } + } + } + }); +} + +module.exports = { + eleventyImageOnRequestDuringServePlugin, +}; diff --git a/node_modules/@11ty/eleventy-img/src/transform-plugin.js b/node_modules/@11ty/eleventy-img/src/transform-plugin.js new file mode 100644 index 0000000..959dca0 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/transform-plugin.js @@ -0,0 +1,210 @@ +const path = require("node:path"); +const Util = require("./util.js"); +const { imageAttributesToPosthtmlNode, getOutputDirectory, cleanTag, isIgnored, isOptional } = require("./image-attrs-to-posthtml-node.js"); +const { getGlobalOptions } = require("./global-options.js"); +const { eleventyImageOnRequestDuringServePlugin } = require("./on-request-during-serve-plugin.js"); + +const PLACEHOLDER_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII="; + +const ATTRS = { + ORIGINAL_SOURCE: "eleventy:internal_original_src", +}; + +function getSrcAttributeValue(sourceNode/*, rootTargetNode*/) { + // Debatable TODO: use rootTargetNode (if `picture`) to retrieve a potentially higher quality source from + return sourceNode.attrs?.src; +} + +function assignAttributes(rootTargetNode, newNode) { + // only copy attributes if old and new tag name are the same (picture => picture, img => img) + if(rootTargetNode.tag !== newNode.tag) { + delete rootTargetNode.attrs; + } + + if(!rootTargetNode.attrs) { + rootTargetNode.attrs = {}; + } + + // Copy all new attributes to target + if(newNode.attrs) { + Object.assign(rootTargetNode.attrs, newNode.attrs); + } +} + +function getOutputLocations(originalSource, outputDirectoryFromAttribute, pageContext, options) { + let projectOutputDirectory = options.directories.output; + + if(outputDirectoryFromAttribute) { + if(path.isAbsolute(outputDirectoryFromAttribute)) { + return { + outputDir: path.join(projectOutputDirectory, outputDirectoryFromAttribute), + urlPath: outputDirectoryFromAttribute, + }; + } + return { + outputDir: path.join(projectOutputDirectory, pageContext.url, outputDirectoryFromAttribute), + urlPath: path.join(pageContext.url, outputDirectoryFromAttribute), + }; + } + + if(options.urlPath) { + // do nothing, user has specified directories in the plugin options. + return {}; + } + + if(path.isAbsolute(originalSource)) { + // if the path is an absolute one (relative to the content directory) write to a global output directory to avoid duplicate writes for identical source images. + return { + outputDir: path.join(projectOutputDirectory, "/img/"), + urlPath: "/img/", + }; + } + + // If original source is a relative one, this colocates images to the template output. + let dir = path.dirname(pageContext.outputPath); + + // filename is included in url: ./dir/post.html => /dir/post.html + if(pageContext.outputPath.endsWith(pageContext.url)) { + // remove file name + let split = pageContext.url.split("/"); + split[split.length - 1] = ""; + + return { + outputDir: dir, + urlPath: split.join("/"), + }; + } + + // filename is not included in url: ./dir/post/index.html => /dir/post/ + return { + outputDir: dir, + urlPath: pageContext.url, + }; +} + +function transformTag(context, sourceNode, rootTargetNode, opts) { + let originalSource = getSrcAttributeValue(sourceNode, rootTargetNode); + + if(!originalSource) { + return sourceNode; + } + + let { inputPath } = context.page; + + sourceNode.attrs.src = Util.normalizeImageSource({ + input: opts.directories.input, + inputPath, + }, originalSource, { + isViaHtml: true, // this reference came from HTML, so we can decode the file name + }); + + if(sourceNode.attrs.src !== originalSource) { + sourceNode.attrs[ATTRS.ORIGINAL_SOURCE] = originalSource; + } + + let outputDirectoryFromAttribute = getOutputDirectory(sourceNode); + let instanceOptions = getOutputLocations(originalSource, outputDirectoryFromAttribute, context.page, opts); + + // returns promise + return imageAttributesToPosthtmlNode(sourceNode.attrs, instanceOptions, opts).then(newNode => { + // node.tag + // node.attrs + // node.content + + assignAttributes(rootTargetNode, newNode); + + rootTargetNode.tag = newNode.tag; + rootTargetNode.content = newNode.content; + }, (error) => { + if(isOptional(sourceNode) || !opts.failOnError) { + if(isOptional(sourceNode, "keep")) { + // replace with the original source value, no image transformation is taking place + if(sourceNode.attrs[ATTRS.ORIGINAL_SOURCE]) { + sourceNode.attrs.src = sourceNode.attrs[ATTRS.ORIGINAL_SOURCE]; + } + // leave as-is, likely 404 when a user visits the page + } else if(isOptional(sourceNode, "placeholder")) { + // transparent png + sourceNode.attrs.src = PLACEHOLDER_DATA_URI; + } else if(isOptional(sourceNode)) { + delete sourceNode.attrs.src; + } + + // optional or don’t fail on error + cleanTag(sourceNode); + + return Promise.resolve(); + } + + return Promise.reject(error); + }); +} + +function eleventyImageTransformPlugin(eleventyConfig, options = {}) { + options = Object.assign({ + extensions: "html", + transformOnRequest: process.env.ELEVENTY_RUN_MODE === "serve", + }, options); + + if(options.transformOnRequest !== false) { + // Add the on-request plugin automatically (unless opt-out in this plugins options only) + eleventyConfig.addPlugin(eleventyImageOnRequestDuringServePlugin); + } + + // Notably, global options are not shared automatically with the WebC `eleventyImagePlugin` above. + // Devs can pass in the same object to both if they want! + let opts = getGlobalOptions(eleventyConfig, options, "transform"); + + eleventyConfig.addJavaScriptFunction("__private_eleventyImageTransformConfigurationOptions", () => { + return opts; + }); + + function posthtmlPlugin(context) { + return async (tree) => { + let promises = []; + let match = tree.match; + + tree.match({ tag: 'picture' }, pictureNode => { + match.call(pictureNode, { tag: 'img' }, imgNode => { + imgNode._insideOfPicture = true; + + if(!isIgnored(imgNode) && !imgNode?.attrs?.src?.startsWith("data:")) { + promises.push(transformTag(context, imgNode, pictureNode, opts)); + } + + return imgNode; + }); + + return pictureNode; + }); + + tree.match({ tag: 'img' }, (imgNode) => { + if(imgNode._insideOfPicture) { + delete imgNode._insideOfPicture; + } else if(isIgnored(imgNode) || imgNode?.attrs?.src?.startsWith("data:")) { + cleanTag(imgNode); + } else { + promises.push(transformTag(context, imgNode, imgNode, opts)); + } + + return imgNode; + }); + + await Promise.all(promises); + + return tree; + }; + } + + if(!eleventyConfig.htmlTransformer || !("addPosthtmlPlugin" in eleventyConfig.htmlTransformer)) { + throw new Error("[@11ty/eleventy-img] `eleventyImageTransformPlugin` is not compatible with this version of Eleventy. You will need to use v3.0.0 or newer."); + } + + eleventyConfig.htmlTransformer.addPosthtmlPlugin(options.extensions, posthtmlPlugin, { + priority: -1, // we want this to go before or inputpath to url + }); +} + +module.exports = { + eleventyImageTransformPlugin, +}; diff --git a/node_modules/@11ty/eleventy-img/src/util.js b/node_modules/@11ty/eleventy-img/src/util.js new file mode 100644 index 0000000..cf59faf --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/util.js @@ -0,0 +1,78 @@ +const path = require("node:path"); + +class Util { + static KEYS = { + requested: "requested" + }; + + /* + * Does not mutate, returns new Object. + */ + static getSortedObject(unordered) { + let keys = Object.keys(unordered).sort(); + let obj = {}; + for(let key of keys) { + obj[key] = unordered[key]; + } + return obj; + } + + static isRemoteUrl(url) { + try { + const validUrl = new URL(url); + + if (validUrl.protocol.startsWith("https:") || validUrl.protocol.startsWith("http:")) { + return true; + } + + return false; + // eslint-disable-next-line no-unused-vars + } catch(e) { + // invalid url OR local path + return false; + } + } + + static normalizeImageSource({ input, inputPath }, src, options = {}) { + let { isViaHtml } = Object.assign({ + isViaHtml: false + }, options); + + if(Util.isFullUrl(src)) { + return src; + } + + if(isViaHtml) { + src = decodeURIComponent(src); + } + + if(!path.isAbsolute(src)) { + // if the image src is relative, make it relative to the template file (inputPath); + let dir = path.dirname(inputPath); + return path.join(dir, src); + } + + // if the image src is absolute, make it relative to the input/content directory. + return path.join(input, src); + } + + static isRequested(generatedVia) { + return generatedVia === this.KEYS.requested; + } + + static addConfig(eleventyConfig, options) { + if(!eleventyConfig) { + return; + } + + Object.defineProperty(options, "eleventyConfig", { + value: eleventyConfig, + enumerable: false, + }); + } +} + +// Temporary alias for changes made in https://github.com/11ty/eleventy-img/pull/138 +Util.isFullUrl = Util.isRemoteUrl; + +module.exports = Util; diff --git a/node_modules/@11ty/eleventy-img/src/webc-options-plugin.js b/node_modules/@11ty/eleventy-img/src/webc-options-plugin.js new file mode 100644 index 0000000..1fbfde3 --- /dev/null +++ b/node_modules/@11ty/eleventy-img/src/webc-options-plugin.js @@ -0,0 +1,23 @@ +const { getGlobalOptions } = require("./global-options.js"); +const { eleventyImageOnRequestDuringServePlugin } = require("./on-request-during-serve-plugin.js"); + +function eleventyWebcOptionsPlugin(eleventyConfig, options = {}) { + options = Object.assign({ + transformOnRequest: process.env.ELEVENTY_RUN_MODE === "serve", + }, options); + + // Notably, global options are not shared automatically with the `eleventyImageTransformPlugin` below. + // Devs can pass in the same object to both if they want! + eleventyConfig.addJavaScriptFunction("__private_eleventyImageConfigurationOptions", () => { + return getGlobalOptions(eleventyConfig, options, "webc"); + }); + + if(options.transformOnRequest !== false) { + // Add the on-request plugin automatically (unless opt-out in this plugins options only) + eleventyConfig.addPlugin(eleventyImageOnRequestDuringServePlugin); + } +} + +module.exports = { + eleventyWebcOptionsPlugin, +}; diff --git a/node_modules/@11ty/eleventy-navigation/.eleventy.js b/node_modules/@11ty/eleventy-navigation/.eleventy.js new file mode 100644 index 0000000..20b9141 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/.eleventy.js @@ -0,0 +1,26 @@ +const pkg = require("./package.json"); +const EleventyNavigation = require("./eleventy-navigation"); + +// export the configuration function for plugin +module.exports = function(eleventyConfig) { + try { + eleventyConfig.versionCheck(pkg["11ty"].compatibility); + } catch(e) { + console.log( `WARN: Eleventy Plugin (${pkg.name}) Compatibility: ${e.message}` ); + } + + eleventyConfig.addFilter("eleventyNavigation", EleventyNavigation.findNavigationEntries); + eleventyConfig.addFilter("eleventyNavigationBreadcrumb", EleventyNavigation.findBreadcrumbEntries); + eleventyConfig.addFilter("eleventyNavigationToHtml", function(pages, options) { + return EleventyNavigation.toHtml.call(eleventyConfig, pages, options); + }); + eleventyConfig.addFilter("eleventyNavigationToMarkdown", function(pages, options) { + return EleventyNavigation.toMarkdown.call(eleventyConfig, pages, options); + }); +}; + +module.exports.navigation = { + find: EleventyNavigation.findNavigationEntries, + findBreadcrumbs: EleventyNavigation.findBreadcrumbEntries, + getDependencyGraph: EleventyNavigation.getDependencyGraph, +}; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/.github/workflows/ci.yml b/node_modules/@11ty/eleventy-navigation/.github/workflows/ci.yml new file mode 100644 index 0000000..03f969e --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/.github/workflows/ci.yml @@ -0,0 +1,22 @@ +name: Node Unit Tests +on: [push, pull_request] +permissions: read-all +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + node: ["18", "20", "22", "24"] + name: Node.js ${{ matrix.node }} on ${{ matrix.os }} + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # 4.1.7 + - name: Setup node + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # 4.0.3 + with: + node-version: ${{ matrix.node }} + # cache: npm + - run: npm install + - run: npm test +env: + YARN_GPG: no diff --git a/node_modules/@11ty/eleventy-navigation/.github/workflows/release.yml b/node_modules/@11ty/eleventy-navigation/.github/workflows/release.yml new file mode 100644 index 0000000..594770a --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Publish Release to npm +on: + release: + types: [published] +permissions: read-all +jobs: + build: + runs-on: ubuntu-latest + environment: GitHub Publish + 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: "22" + registry-url: 'https://registry.npmjs.org' + - run: npm install -g npm@latest + - 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: + NPM_PUBLISH_TAG: ${{ contains(github.event.release.tag_name, '-beta.') && 'beta' || 'latest' }} diff --git a/node_modules/@11ty/eleventy-navigation/LICENSE b/node_modules/@11ty/eleventy-navigation/LICENSE new file mode 100644 index 0000000..37922a8 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019–2025 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-navigation/README.md b/node_modules/@11ty/eleventy-navigation/README.md new file mode 100644 index 0000000..7475fc8 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/README.md @@ -0,0 +1,9 @@ +

11ty Logo

+ +# eleventy-navigation 🕚⚡️🎈🐀 + +A plugin for creating hierarchical navigation in Eleventy projects. Supports breadcrumbs too! + +Used [in production on 11ty.dev](https://www.11ty.dev/docs/)! + +## Read the [Full Documentation on 11ty.dev](https://www.11ty.dev/docs/plugins/navigation/) diff --git a/node_modules/@11ty/eleventy-navigation/eleventy-navigation.js b/node_modules/@11ty/eleventy-navigation/eleventy-navigation.js new file mode 100644 index 0000000..d361d93 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/eleventy-navigation.js @@ -0,0 +1,277 @@ +const DepGraph = require("dependency-graph").DepGraph; + +function findNavigationEntries(nodes = [], key = "") { + let keys = key.split(",").filter(k => Boolean(k)); + let pages = {}; + for(let entry of nodes) { + let data = entry?.data || {}; + if(data?.eleventyNavigation) { + let {eleventyNavigation} = data || {}; + + let pageKey; + if(!key && !eleventyNavigation.parent) { // top level (no parents) + pageKey = "__default"; + } else if(keys.includes(eleventyNavigation.parent)) { + pageKey = eleventyNavigation.parent; + } + + if(pageKey) { + if(!pages[pageKey]) { + pages[pageKey] = []; + } + let url = eleventyNavigation.url ?? data?.page?.url; + + pages[pageKey].push(Object.assign({ data }, eleventyNavigation, { + ...(url ? { url } : {}), + pluginType: "eleventy-navigation", + ...(keys.length > 0 ? { parentKey: eleventyNavigation.parent } : {}), + })); + } + } + } + + return Object.values(pages).flat().sort(function(a, b) { + if(a.pinned && b.pinned) { + return (a.order || 0) - (b.order || 0); + } + + let order = [a.order, b.order]; + if(a.pinned) { + order[0] = -Infinity; + } + if(b.pinned) { + order[1] = -Infinity; + } + + if(order[0] === undefined && order[1] === undefined) { + return 0; + } + if(order[1] === undefined) { + return -1; + } + if(order[0] === undefined) { + return 1; + } + return order[0] - order[1]; + }).map(function(entry) { + if(!entry.title) { + entry.title = entry.key; + } + if(entry.key) { + entry.children = findNavigationEntries(nodes, entry.key); + } + return entry; + }); +} + +function findDependencies(pages, depGraph, parentKey) { + for( let page of pages ) { + depGraph.addNode(page.key, page); + if(parentKey) { + depGraph.addDependency(page.key, parentKey); + } + if(page.children) { + findDependencies(page.children, depGraph, page.key); + } + } +} + +function getDependencyGraph(nodes) { + let pages = findNavigationEntries(nodes); + let graph = new DepGraph(); + findDependencies(pages, graph); + return graph; +} + +function isOptionMatch(options, name) { + // Liquid.js issue #35 + if(Array.isArray(options)) { + return options[options.indexOf(name)] + } + return options[name]; +} + +function findBreadcrumbEntries(nodes, activeKey, options = {}) { + let graph = getDependencyGraph(nodes); + if (isOptionMatch(options, "allowMissing") && !graph.hasNode(activeKey)) { + // Fail gracefully if the key isn't in the graph + return []; + } + let deps = graph.dependenciesOf(activeKey); + if(isOptionMatch(options, "includeSelf")) { + deps.push(activeKey); + } + + return activeKey ? deps.map(key => { + let data = Object.assign({}, graph.getNodeData(key)); + delete data.children; + data._isBreadcrumb = true; + return data; + }) : []; +} + +function getUrlFilter(eleventyConfig) { + // eleventyConfig.pathPrefix was first available in Eleventy 2.0.0-canary.15 + // And in Eleventy 2.0.0-canary.15 we recommend the a built-in transform for pathPrefix + if(eleventyConfig.pathPrefix !== undefined) { + return function(url) { + return url; + }; + } + + if("getFilter" in eleventyConfig) { + // v0.10.0 and above + return eleventyConfig.getFilter("url"); + } else if("nunjucksFilters" in eleventyConfig) { + // backwards compat, hardcoded key + return eleventyConfig.nunjucksFilters.url; + } else { + // Theoretically we could just move on here with a `url => url` but then `pathPrefix` + // would not work and it wouldn’t be obvious why—so let’s fail loudly to avoid that. + throw new Error("Could not find a `url` filter for the eleventy-navigation plugin in eleventyNavigationToHtml filter."); + } +} + +function buildHtmlAttr(name, values) { + // values could be array or string + if (!values || !values.length) { + return ''; + } + const valueStr = Array.isArray(values) ? values.join(" ") : values; + return ` ${name}="${valueStr}"`; +} + +function buildAllHtmlAttrs(attrs) { + return attrs.reduce((acc, { name, values }) => acc + buildHtmlAttr(name, values), ''); +} + +function navigationToHtml(pages, options = {}) { + options = Object.assign({ + listElement: "ul", + listItemElement: "li", + listClass: "", + listItemClass: "", + listItemHasChildrenClass: "", + activeKey: "", + activeListItemClass: "", + anchorClass: "", + activeAnchorClass: "", + useAriaCurrentAttr: false, + showExcerpt: false, + isChildList: false, + useTopLevelDetails: false, + anchorElementWithoutHref: "a", // default, better to use span + }, options); + + let isChildList = !!options.isChildList; + options.isChildList = true; + + let urlFilter; + + if(pages.length && pages[0].pluginType !== "eleventy-navigation") { + throw new Error("Incorrect argument passed to eleventyNavigationToHtml filter. You must call `eleventyNavigation` or `eleventyNavigationBreadcrumb` first, like: `collection.all | eleventyNavigation | eleventyNavigationToHtml | safe`"); + } + + return pages.length ? `<${options.listElement}${!isChildList && options.listClass ? ` class="${options.listClass}"` : ''}>${pages.map(entry => { + let liClass = []; + let aClass = []; + let aAttrs = []; + if(options.listItemClass) { + liClass.push(options.listItemClass); + } + if(options.anchorClass) { + aClass.push(options.anchorClass); + } + if(entry.url) { + if(!urlFilter) { + // don’t get if not used + urlFilter = getUrlFilter(this); + } + aAttrs.push({name: "href", values: urlFilter(entry.url)}) + } + if(options.activeKey === entry.key) { + if(options.activeListItemClass) { + liClass.push(options.activeListItemClass); + } + if(options.activeAnchorClass) { + aClass.push(options.activeAnchorClass); + } + if(options.useAriaCurrentAttr) { + aAttrs.push({ name: "aria-current", values: "page" }); + } + } + if(options.listItemHasChildrenClass && entry.children && entry.children.length) { + liClass.push(options.listItemHasChildrenClass); + } + if(aClass.length) { + aAttrs.push({ name: "class", values: aClass }); + } + + let postfix = ""; + + // Helper to show pin/order in text: + // let hasOrder = entry.order || entry.order === 0; + // if(process.env.ELEVENTY_RUN_MODE === "serve" && (hasOrder || entry.pinned)) { + // postfix = ` (${entry.pinned ? "📌" : ""}${entry.order ?? ""})`; + // } + + let aAttrsStr = buildAllHtmlAttrs(aAttrs); + let hasLink = aAttrs.find(entry => entry.name === "href"); + let itemTitle = entry.title + postfix; + + let titleHtmlStart = `${itemTitle}`; + + // purely defensive use of `useTopLevelDetails` here + if(options.anchorElementWithoutHref && !hasLink) { + titleHtmlStart = `<${options.anchorElementWithoutHref}>${itemTitle}`; + } + + let titleHtmlEnd = ""; + if(options.useTopLevelDetails && !isChildList && entry.children) { + if(hasLink) { + // `` must be sibling: no other interactive elements in + titleHtmlStart = `${titleHtmlStart}
${itemTitle}`; + } else { + titleHtmlStart = `
${itemTitle}`; + } + titleHtmlEnd = "
"; + } + + let childContentStr = entry.children ? navigationToHtml.call(this, entry.children, options) : ""; + + return `<${options.listItemElement}${buildHtmlAttr("class", liClass)}>${titleHtmlStart}${options.showExcerpt && entry.excerpt ? `: ${entry.excerpt}` : ""}${childContentStr}${titleHtmlEnd}`; + }).join("\n")}` : ""; +} + +function navigationToMarkdown(pages, options = {}) { + options = Object.assign({ + showExcerpt: false, + childDepth: 0 + }, options); + + let childDepth = 1 + options.childDepth; + options.childDepth++; + + let urlFilter; + + if(pages.length && pages[0].pluginType !== "eleventy-navigation") { + throw new Error("Incorrect argument passed to eleventyNavigationToMarkdown filter. You must call `eleventyNavigation` or `eleventyNavigationBreadcrumb` first, like: `collection.all | eleventyNavigation | eleventyNavigationToMarkdown | safe`"); + } + + let indent = (new Array(childDepth)).join(" ") || ""; + return pages.length ? `${pages.map(entry => { + if(entry.url && !urlFilter) { + // don’t get if not used + urlFilter = getUrlFilter(this); + } + return `${indent}* ${entry.url ? `[` : ""}${entry.title}${entry.url ? `](${urlFilter(entry.url)})` : ""}${options.showExcerpt && entry.excerpt ? `: ${entry.excerpt}` : ""}\n${entry.children ? navigationToMarkdown.call(this, entry.children, options) : ""}`; + }).join("")}` : ""; +} + +module.exports = { + getDependencyGraph, + findNavigationEntries, + findBreadcrumbEntries, + toHtml: navigationToHtml, + toMarkdown: navigationToMarkdown +}; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/package.json b/node_modules/@11ty/eleventy-navigation/package.json new file mode 100644 index 0000000..5d020c9 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/package.json @@ -0,0 +1,49 @@ +{ + "name": "@11ty/eleventy-navigation", + "version": "1.0.5", + "publishConfig": { + "access": "public" + }, + "description": "A plugin for creating hierarchical navigation in Eleventy projects. Supports breadcrumbs too!", + "main": ".eleventy.js", + "scripts": { + "test": "npx ava", + "sample": "npx @11ty/eleventy --input=sample --output=sample/_site --config=sample/.eleventy.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-navigation.git" + }, + "bugs": { + "url": "https://github.com/11ty/eleventy-navigation/issues" + }, + "homepage": "https://www.11ty.dev/docs/plugins/navigation/", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy", + "eleventy-plugin" + ], + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "11ty": { + "compatibility": ">=0.7 || >=1.0.0-canary" + }, + "devDependencies": { + "ava": "^6.4.1" + }, + "dependencies": { + "dependency-graph": "^1.0.0" + }, + "ava": { + "files": [ + "./test/*.js" + ] + } +} diff --git a/node_modules/@11ty/eleventy-navigation/sample/.eleventy.js b/node_modules/@11ty/eleventy-navigation/sample/.eleventy.js new file mode 100644 index 0000000..8ffc704 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/.eleventy.js @@ -0,0 +1,9 @@ +const EleventyNavigationPlugin = require("../"); + +module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin(EleventyNavigationPlugin); + + return { + pathPrefix: "/sdljfkaldsjlfka/" + } +}; \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/sample/bats.md b/node_modules/@11ty/eleventy-navigation/sample/bats.md new file mode 100644 index 0000000..b024399 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/bats.md @@ -0,0 +1,5 @@ +--- +eleventyNavigation: + key: Bats + parent: Mammals +--- \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/sample/humans.md b/node_modules/@11ty/eleventy-navigation/sample/humans.md new file mode 100644 index 0000000..2f323ba --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/humans.md @@ -0,0 +1,5 @@ +--- +eleventyNavigation: + key: Humans + parent: Mammals +--- \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/sample/liquid/index.liquid b/node_modules/@11ty/eleventy-navigation/sample/liquid/index.liquid new file mode 100644 index 0000000..3fd6c74 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/liquid/index.liquid @@ -0,0 +1,19 @@ +

Full List

+ +{{ collections.all | eleventyNavigation | dump(2) }} + +{{ collections.all | eleventyNavigation | eleventyNavigationToHtml }} + +

Breadcrumb for Bats

+ +{{ + collections.all + | eleventyNavigationBreadcrumb: "Bats" + | dump(2) +}} + +{{ + collections.all + | eleventyNavigationBreadcrumb: "Bats" + | eleventyNavigationToHtml +}} diff --git a/node_modules/@11ty/eleventy-navigation/sample/mammals.md b/node_modules/@11ty/eleventy-navigation/sample/mammals.md new file mode 100644 index 0000000..f3d7ca8 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/mammals.md @@ -0,0 +1,4 @@ +--- +eleventyNavigation: + key: Mammals +--- \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/sample/no-key.md b/node_modules/@11ty/eleventy-navigation/sample/no-key.md new file mode 100644 index 0000000..69fb2c2 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/no-key.md @@ -0,0 +1,4 @@ +--- +eleventyNavigation: +--- +This page has no key. \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/sample/no-nav.md b/node_modules/@11ty/eleventy-navigation/sample/no-nav.md new file mode 100644 index 0000000..586ff35 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/no-nav.md @@ -0,0 +1,3 @@ +--- +--- +This page has no navigation. \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/sample/nunjucks/index.njk b/node_modules/@11ty/eleventy-navigation/sample/nunjucks/index.njk new file mode 100644 index 0000000..327dc3c --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/sample/nunjucks/index.njk @@ -0,0 +1,11 @@ +

Full List

+ +{{ collections.all | eleventyNavigation | dump(2) | safe }} + +{{ collections.all | eleventyNavigation | eleventyNavigationToHtml | safe }} + +

Breadcrumb for Bats

+ +{{ collections.all | eleventyNavigationBreadcrumb("Bats") | dump(2) | safe }} + +{{ collections.all | eleventyNavigationBreadcrumb("Bats") | eleventyNavigationToHtml | safe }} \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-navigation/test/navigationTest.js b/node_modules/@11ty/eleventy-navigation/test/navigationTest.js new file mode 100644 index 0000000..6c5d080 --- /dev/null +++ b/node_modules/@11ty/eleventy-navigation/test/navigationTest.js @@ -0,0 +1,747 @@ +const test = require("ava"); +const EleventyNavigation = require("../eleventy-navigation"); + +test("Empty navigation", t => { + t.deepEqual(EleventyNavigation.findNavigationEntries(), []); +}); + +test("One root page navigation", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].pluginType, "eleventy-navigation"); + + // Warning, title must be preserved per the public API + t.is(obj[0].title, "root1"); + // Warning, url must be preserved per the public API + t.is(obj[0].url, "root1.html"); + + t.is(obj[0].children.length, 0); +}); + +test("One root page navigation with separate title", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1", + title: "Another title" + }, + page: { + url: "root1.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].pluginType, "eleventy-navigation"); + t.is(obj[0].title, "Another title"); + t.is(obj[0].children.length, 0); +}); + +test("One root, one child page navigation", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: "child1.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].children.length, 1); + t.is(obj[0].children[0].parent, "root1"); + t.is(obj[0].children[0].key, "child1"); +}); + +test("Three layers deep navigation", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "child1", + key: "grandchild1" + }, + page: { + url: "grandchild1.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].children.length, 1); + t.is(obj[0].children[0].parent, "root1"); + t.is(obj[0].children[0].key, "child1"); + t.is(obj[0].children[0].children[0].parent, "child1"); + t.is(obj[0].children[0].children[0].key, "grandchild1"); +}); + +test("One root, three child navigation (order)", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1", + order: 3 + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child2", + order: 1 + }, + page: { + url: "child2.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child3", + order: 2 + }, + page: { + url: "child3.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child4" + }, + page: { + url: "child4.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].children.length, 4); + t.is(obj[0].children.map(e => e.key).join(","), "child2,child3,child1,child4"); +}); + +test("One root, three child navigation, one with 0 (order)", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1", + order: 3 + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child2", + order: 0 + }, + page: { + url: "child2.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child3", + order: 2 + }, + page: { + url: "child3.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child4" + }, + page: { + url: "child4.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].children.length, 4); + t.is(obj[0].children.map(e => e.key).join(","), "child2,child3,child1,child4"); +}); + +test("One root, three child navigation (implied order)", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1", + order: 3 + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child2" + }, + page: { + url: "child2.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child3", + order: -1 + }, + page: { + url: "child3.html" + } + } + } + ]); + t.is(obj[0].key, "root1"); + t.is(obj[0].children.length, 3); + t.is(obj[0].children.map(e => e.key).join(","), "child3,child1,child2"); +}); + +test("Show throw an error without a config", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + } + ]); + + t.throws(() => { + EleventyNavigation.toHtml(obj); + }); +}); + +let fakeConfig = { + nunjucksFilters: { + url: url => url + } +}; + +let fakeNavigationEntries = [ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: "child1.html" + } + } + } +]; + +let fakeNavigationEntriesEmptyUrl = [ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: false + } + } + } +]; + +test("Checking active class on output HTML", t => { + let obj = EleventyNavigation.findNavigationEntries(fakeNavigationEntries); + + let html = EleventyNavigation.toHtml.call(fakeConfig, obj); + t.is(html, `
`); + + let activeHtmlItem = EleventyNavigation.toHtml.call(fakeConfig, obj, { + activeKey: "child1", + activeListItemClass: "this-is-the-active-item" + }); + t.is(activeHtmlItem, ``); + + let activeHtmlAnchor = EleventyNavigation.toHtml.call(fakeConfig, obj, { + activeKey: "child1", + activeAnchorClass: "this-is-the-active-anchor" + }); + t.is(activeHtmlAnchor, ``); + + let activeHtmlItemAndAnchor = EleventyNavigation.toHtml.call(fakeConfig, obj, { + activeKey: "child1", + activeListItemClass: "this-is-the-active-item", + activeAnchorClass: "this-is-the-active-anchor" + }); + t.is(activeHtmlItemAndAnchor, ``); +}); + +test("Checking aria-current option on output HTML", t => { + let obj = EleventyNavigation.findNavigationEntries(fakeNavigationEntries); + + let html = EleventyNavigation.toHtml.call(fakeConfig, obj); + t.true(html.indexOf(`
  • child1
  • `) > -1); + + let activeHtmlAnchor = EleventyNavigation.toHtml.call(fakeConfig, obj, { + activeKey: "child1", + useAriaCurrentAttr: true + }); + t.true(activeHtmlAnchor.indexOf(`
  • child1
  • `) > -1); +}); + +test("Checking has children class on output HTML", t => { + let obj = EleventyNavigation.findNavigationEntries(fakeNavigationEntries); + + let activeHtml = EleventyNavigation.toHtml.call(fakeConfig, obj, { + listItemHasChildrenClass: "item-has-children" + }); + t.true(activeHtml.indexOf(`
  • root1`) > -1); + t.true(activeHtml.indexOf(`
  • child1
  • `) > -1); +}); + +test("URL override", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1", + url: "https://www.zachleat.com/" + }, + page: { + url: "root1.html" + } + } + } + ]); + + t.is(obj[0].url, "https://www.zachleat.com/"); +}); + +test("Breadcrumbs", t => { + let obj = EleventyNavigation.findBreadcrumbEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "child1", + key: "grandchild1" + }, + page: { + url: "grandchild1.html" + } + } + } + ], "grandchild1"); + + t.is(obj.length, 2); + t.is(obj[0].key, "root1"); + t.is(obj[1].key, "child1"); +}); + +test("Breadcrumbs (include self)", t => { + let obj = EleventyNavigation.findBreadcrumbEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "child1", + key: "grandchild1" + }, + page: { + url: "grandchild1.html" + } + } + } + ], "grandchild1", { + includeSelf: true + }); + + t.is(obj.length, 3); + t.is(obj[0].key, "root1"); + t.is(obj[1].key, "child1"); + t.is(obj[2].key, "grandchild1"); +}); + +test("Breadcrumbs (options.allowMissing)", t => { + const entries = EleventyNavigation.findBreadcrumbEntries( + [], + "orphan", + {allowMissing: true} + ); + t.is(entries.length, 0); +}); + +test("Output markdown", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1" + }, + page: { + url: "child1.html" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "child1", + key: "grandchild1" + }, + page: { + url: "grandchild1.html" + } + } + } + ]); + + let html = EleventyNavigation.toMarkdown.call(fakeConfig, obj); + t.is(html, `* [root1](root1.html) + * [child1](child1.html) + * [grandchild1](grandchild1.html) +`); +}); + +test("Navigation entry contains page data", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + }, + page: { + url: "root1.html" + }, + tags: [ + "robot", + "lesbian" + ], + collections: {} + } + } + ]); + + // Page data like tags should be included in the obj + t.deepEqual(obj[0].data.tags, ["robot", "lesbian"]); +}); + +test("Missing url", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1", + } + } + } + ]); + + t.is(EleventyNavigation.toHtml.call(fakeConfig, obj), ``); +}); + +test("Multiple roots", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1", + } + } + }, + { + data: { + eleventyNavigation: { + key: "root2" + }, + } + }, + { + data: { + eleventyNavigation: { + parent: "root2", + key: "child3", + } + } + } + ]); + + t.deepEqual(obj.map(e => e.key), ["root1", "root2"]); + t.deepEqual(obj[0].children.map(e => e.key), ["child1"]); + t.deepEqual(obj[1].children.map(e => e.key), ["child3"]); +}); + +test("Multiple roots, multiple keys", t => { + let obj = EleventyNavigation.findNavigationEntries([ + { + data: { + eleventyNavigation: { + key: "root1" + } + } + }, + { + data: { + eleventyNavigation: { + parent: "root1", + key: "child1", + } + } + }, + { + data: { + eleventyNavigation: { + key: "root2" + }, + } + }, + { + data: { + eleventyNavigation: { + parent: "root2", + key: "child3", + } + } + } + ], "root1,root2"); + + t.deepEqual(obj.map(e => e.key), ["child1", "child3"]); + t.deepEqual(obj[0].children.map(e => e.key), []); + t.deepEqual(obj[1].children.map(e => e.key), []); +}); + +test("Breadcrumb include self", t => { + let nodes = [ + { + data: { + eleventyNavigation: { + key: "root1", + } + } + } + ]; + let obj = EleventyNavigation.findBreadcrumbEntries(nodes, "root1", { includeSelf: true }); + + t.is(EleventyNavigation.toHtml(obj), ``); +}); + +test("Breadcrumb include self (Liquid.js #35)", t => { + let nodes = [ + { + data: { + eleventyNavigation: { + key: "root1", + } + } + } + ]; + let obj = EleventyNavigation.findBreadcrumbEntries(nodes, "root1", [ "includeSelf", true ]); + + t.is(EleventyNavigation.toHtml(obj), ``); +}); + +test("Use top level details", t => { + let obj = EleventyNavigation.findNavigationEntries(fakeNavigationEntries); + + let html = EleventyNavigation.toHtml.call(fakeConfig, obj, { + useTopLevelDetails: true + }); + t.is(html, ``); +}); + +test("Use top level details with empty url", t => { + let obj = EleventyNavigation.findNavigationEntries(fakeNavigationEntriesEmptyUrl); + + let html = EleventyNavigation.toHtml.call(fakeConfig, obj, { + useTopLevelDetails: true, + anchorElementWithoutHref: "span", + }); + t.is(html, ``); +}); \ No newline at end of file diff --git a/node_modules/@11ty/eleventy-plugin-bundle/README.md b/node_modules/@11ty/eleventy-plugin-bundle/README.md new file mode 100644 index 0000000..a585831 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/README.md @@ -0,0 +1,337 @@ +# eleventy-plugin-bundle + +Little bundles of code, little bundles of joy. + +Create minimal per-page or app-level bundles of CSS, JavaScript, or HTML to be included in your Eleventy project. + +Makes it easy to implement Critical CSS, in-use-only CSS/JS bundles, SVG icon libraries, or secondary HTML content to load via XHR. + +## Why? + +This project is a minimum-viable-bundler and asset pipeline in Eleventy. It does not perform any transpilation or code manipulation (by default). The code you put in is the code you get out (with configurable `transforms` if you’d like to modify the code). + +For more larger, more complex use cases you may want to use a more full featured bundler like Vite, Parcel, Webpack, rollup, esbuild, or others. + +But do note that a full-featured bundler has a significant build performance cost, so take care to weigh the cost of using that style of bundler against whether or not this plugin has sufficient functionality for your use case—especially as the platform matures and we see diminishing returns on code transpilation (ES modules everywhere). + +## Installation + +No installation necessary. Starting with Eleventy `v3.0.0-alpha.10` and newer, this plugin is now bundled with Eleventy. + +## Usage + +By default, Bundle Plugin v2.0 does not include any default bundles. You must add these yourself via `eleventyConfig.addBundle`. One notable exception happens when using the WebC Eleventy Plugin, which adds `css`, `js`, and `html` bundles for you. + +To create a bundle type, use `eleventyConfig.addBundle` in your Eleventy configuration file (default `.eleventy.js`): + +```js +// .eleventy.js +export default function(eleventyConfig) { + eleventyConfig.addBundle("css"); +}; +``` + +This does two things: + +1. Creates a new `css` shortcode for adding arbitrary code to this bundle +2. Adds `"css"` as an eligible type argument to the `getBundle` and `getBundleFileUrl` shortcodes. + +### Full options list + +```js +export default function(eleventyConfig) { + eleventyConfig.addBundle("css", { + // (Optional) Folder (relative to output directory) files will write to + toFileDirectory: "bundle", + + // (Optional) File extension used for bundle file output, defaults to bundle name + outputFileExtension: "css", + + // (Optional) Name of shortcode for use in templates, defaults to bundle name + shortcodeName: "css", + // shortcodeName: false, // disable this feature. + + // (Optional) Modify bundle content + transforms: [], + + // (Optional) If two identical code blocks exist in non-default buckets, they’ll be hoisted to the first bucket in common. + hoist: true, + + // (Optional) In 11ty.js templates, having a named export of `bundle` will populate your bundles. + bundleExportKey: "bundle", + // bundleExportKey: false, // disable this feature. + }); +}; +``` + +Read more about [`hoist` and duplicate bundle hoisting](https://github.com/11ty/eleventy-plugin-bundle/issues/5). + +### Universal Shortcodes + +The following Universal Shortcodes (available in `njk`, `liquid`, `hbs`, `11ty.js`, and `webc`) are provided by this plugin: + +* `getBundle` to retrieve bundled code as a string. +* `getBundleFileUrl` to create a bundle file on disk and retrieve the URL to that file. + +Here’s a [real-world commit showing this in use on the `eleventy-base-blog` project](https://github.com/11ty/eleventy-base-blog/commit/c9595d8f42752fa72c66991c71f281ea960840c9?diff=split). + +### Example: Add bundle code in a Markdown file in Eleventy + +```md +# My Blog Post + +This is some content, I am writing markup. + +{% css %} +em { font-style: italic; } +{% endcss %} + +## More Markdown + +{% css %} +strong { font-weight: bold; } +{% endcss %} +``` + +Renders to: + +```html +

    My Blog Post

    + +

    This is some content, I am writing markup.

    + +

    More Markdown

    +``` + +Note that the bundled code is excluded! + +_There are a few [more examples below](#examples)!_ + +### Render bundle code + +```html + + + + +{% css %}* { color: orange; }{% endcss %} +``` + +### Write a bundle to a file + +Writes the bundle content to a content-hashed file location in your output directory and returns the URL to the file for use like this: + +```html + +``` + +Note that writing bundles to files will likely be slower for empty-cache first time visitors but better cached in the browser for repeat-views (and across multiple pages, too). + +### Asset bucketing + +```html + +{% css "defer" %}em { font-style: italic; }{% endcss %} +``` + +```html + + + +``` + +A `default` bucket is implied: + +```html + +{% css %}em { font-style: italic; }{% endcss %} +{% css "default" %}em { font-style: italic; }{% endcss %} + + + + +``` + +### Examples + +#### Critical CSS + +```js +// .eleventy.js +export default function(eleventyConfig) { + eleventyConfig.addBundle("css"); +}; +``` + +Use asset bucketing to divide CSS between the `default` bucket and a `defer` bucket, loaded asynchronously. + +_(Note that some HTML boilerplate has been omitted from the sample below)_ + +```html + + + + + + + + + + + + {% css %}/* Inline in the head, great with @font-face! */{% endcss %} + + {% css "defer" %}/* Load me later */{% endcss %} + + +``` + +**Related**: + +* Check out the [demo of Critical CSS using Eleventy Edge](https://demo-eleventy-edge.netlify.app/critical-css/) for a repeat view optimization without JavaScript. +* You may want to improve the above code with [`fetchpriority`](https://www.smashingmagazine.com/2022/04/boost-resource-loading-new-priority-hint-fetchpriority/) when [browser support improves](https://caniuse.com/mdn-html_elements_link_fetchpriority). + +#### SVG Icon Library + +Here an `svg` is bundle is created. + +```js +// .eleventy.js +export default function(eleventyConfig) { + eleventyConfig.addBundle("svg"); +}; +``` + +```html + + + +{% svg %} + +{% endsvg %} + +And now you can use `icon-close` in as many SVG instances as you’d like (without repeating the heftier SVG content). + + + + + +``` + +#### React Helmet-style `` additions + +```js +// .eleventy.js +export default function(eleventyConfig) { + eleventyConfig.addBundle("html"); +}; +``` + +This might exist in an Eleventy layout file: + +```html + + {% getBundle "html", "head" %} + +``` + +And then in your content you might want to page-specific `preconnect`: + +```html +{% html "head" %} + +{% endhtml %} +``` + +#### Bundle Sass with the Render Plugin + +You can render template syntax inside of the `{% css %}` shortcode too, if you’d like to do more advanced things using Eleventy template types. + +This example assumes you have added the [Render plugin](https://www.11ty.dev/docs/plugins/render/) and the [`scss` custom template type](https://www.11ty.dev/docs/languages/custom/) to your Eleventy configuration file. + +```html +{% css %} + {% renderTemplate "scss" %} + h1 { .test { color: red; } } + {% endrenderTemplate %} +{% endcss %} +``` + +Now the compiled Sass is available in your default bundle and will show up in `getBundle` and `getBundleFileUrl`. + +#### Use with [WebC](https://www.11ty.dev/docs/languages/webc/) + +Starting with `@11ty/eleventy-plugin-webc@0.9.0` (track at [issue #48](https://github.com/11ty/eleventy-plugin-webc/issues/48)) this plugin is used by default in the Eleventy WebC plugin. Specifically, [WebC Bundler Mode](https://www.11ty.dev/docs/languages/webc/#css-and-js-(bundler-mode)) now uses the bundle plugin under the hood. + +To add CSS to a bundle in WebC, you would use a ` + +``` + +To add JS to a page bundle in WebC, you would use a ` + +``` + +* 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..21c8405 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/package.json @@ -0,0 +1,62 @@ +{ + "name": "@11ty/eleventy-plugin-bundle", + "version": "3.0.7", + "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..924731a --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.shortcodes.js @@ -0,0 +1,83 @@ +import { OutOfOrderRender } from "./OutOfOrderRender.js"; +import debugUtil from "debug"; + +const debug = debugUtil("Eleventy:Bundle"); + +export default function(eleventyConfig, pluginOptions = {}) { + let managers = eleventyConfig.getBundleManagers(); + let writeToFileSystem = true; + + function bundleTransform(content, stage = 0) { + // Only run if content is string + // Only run if managers are in play + if(typeof content !== "string" || Object.keys(managers).length === 0) { + 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; + } + + 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)}`); + } + + 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)}`); + } + + 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; + }); + }); +}; diff --git a/node_modules/@11ty/eleventy-plugin-rss/.eleventy.js b/node_modules/@11ty/eleventy-plugin-rss/.eleventy.js new file mode 100644 index 0000000..bfee82b --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/.eleventy.js @@ -0,0 +1,20 @@ +import rssPlugin from "./src/rssPlugin.js"; +import dateRfc3339 from "./src/dateRfc3339.js"; +import dateRfc822 from "./src/dateRfc822.js"; +import getNewestCollectionItemDate from "./src/getNewestCollectionItemDate.js"; +import virtualTemplate from "./src/virtualTemplate.js"; + +import absoluteUrl from "./src/absoluteUrl.js"; +import convertHtmlToAbsoluteUrls from "./src/htmlToAbsoluteUrls.js"; + +export default rssPlugin; + +export { + rssPlugin, + virtualTemplate as feedPlugin, + dateRfc3339 as dateToRfc3339, + dateRfc822 as dateToRfc822, + getNewestCollectionItemDate as getNewestCollectionItemDate, + absoluteUrl as absoluteUrl, + convertHtmlToAbsoluteUrls as convertHtmlToAbsoluteUrls +}; diff --git a/node_modules/@11ty/eleventy-plugin-rss/LICENSE b/node_modules/@11ty/eleventy-plugin-rss/LICENSE new file mode 100644 index 0000000..89a4362 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 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-plugin-rss/README.md b/node_modules/@11ty/eleventy-plugin-rss/README.md new file mode 100644 index 0000000..c782cfc --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/README.md @@ -0,0 +1,34 @@ +

    11ty Logo

    + +# eleventy-plugin-rss 🕚⚡️🎈🐀 + +A pack of [Eleventy](https://github.com/11ty/eleventy) filters for generating Atom, JSON and RSS feeds using the Nunjucks templating engine. + + +See `sample/feed.njk` for an example Atom feed template, `sample/feed.json` for an example JSON feed template, or `sample/feed-rss.njk` for an example RSS feed template. + +## [The full `eleventy-plugin-rss` documentation is on 11ty.dev](https://www.11ty.dev/docs/plugins/rss/). + +* _This is a plugin for the [Eleventy static site generator](https://www.11ty.dev/)._ +* Find more [Eleventy plugins](https://www.11ty.dev/docs/plugins/). +* Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/), follow [@eleven_ty](https://twitter.com/eleven_ty) on Twitter, and support [11ty on Open Collective](https://opencollective.com/11ty) + +[![npm Version](https://img.shields.io/npm/v/@11ty/eleventy-plugin-rss.svg?style=for-the-badge)](https://www.npmjs.com/package/@11ty/eleventy-plugin-rss) [![GitHub issues](https://img.shields.io/github/issues/11ty/eleventy-plugin-rss.svg?style=for-the-badge)](https://github.com/11ty/eleventy-plugin-rss/issues) + +## Installation + +``` +npm install @11ty/eleventy-plugin-rss +``` + +_[The full `eleventy-plugin-rss` documentation is on 11ty.dev](https://www.11ty.dev/docs/plugins/rss/)._ + +## 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. + diff --git a/node_modules/@11ty/eleventy-plugin-rss/package.json b/node_modules/@11ty/eleventy-plugin-rss/package.json new file mode 100644 index 0000000..6487694 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/package.json @@ -0,0 +1,50 @@ +{ + "name": "@11ty/eleventy-plugin-rss", + "version": "3.0.0", + "type": "module", + "description": "Generate an Atom, RSS, or JSON feed.", + "publishConfig": { + "access": "public" + }, + "main": ".eleventy.js", + "scripts": { + "test": "npx ava", + "sample": "cd sample && npx @11ty/eleventy --config=config-sample.js --pathprefix=pathprefix", + "clean": "rm -rf sample/_site" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-plugin-rss.git" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy", + "eleventy-plugin" + ], + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/11ty/eleventy-plugin-rss/issues" + }, + "homepage": "https://www.11ty.dev/docs/plugins/rss/", + "11ty": { + "compatibility": ">=3.0.0-alpha.15" + }, + "devDependencies": { + "@11ty/eleventy": "^3.1.5", + "ava": "^6.4.1" + }, + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/posthtml-urls": "^1.0.2", + "debug": "^4.4.3", + "posthtml": "^0.16.7" + } +} diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/absoluteUrl.js b/node_modules/@11ty/eleventy-plugin-rss/src/absoluteUrl.js new file mode 100644 index 0000000..83a4754 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/absoluteUrl.js @@ -0,0 +1,13 @@ +import debugUtil from "debug"; +const debug = debugUtil("Eleventy:Rss"); + +// This is deprecated! Use the Eleventy HTML plugin instead (2.0+) +export default function(url, base) { + try { + return (new URL(url, base)).toString() + } catch(e) { + debug("Trying to convert %o to be an absolute url with base %o and failed, returning: %o (invalid url)", url, base, url) + // TODO add debug output! + return url; + } +}; diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/dateRfc3339.js b/node_modules/@11ty/eleventy-plugin-rss/src/dateRfc3339.js new file mode 100644 index 0000000..563598a --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/dateRfc3339.js @@ -0,0 +1,11 @@ +// Atom uses RFC 3339 dates +// https://tools.ietf.org/html/rfc3339#section-5.8 +export default function(dateObj) { + let s = dateObj.toISOString(); + + // remove milliseconds + let split = s.split("."); + split.pop(); + + return split.join("") + "Z"; +} diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/dateRfc822.js b/node_modules/@11ty/eleventy-plugin-rss/src/dateRfc822.js new file mode 100644 index 0000000..e2cdacf --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/dateRfc822.js @@ -0,0 +1,23 @@ +export default function pubDateRFC822(value, timeZone = undefined) { + const date = new Date(value); + const options = { + weekday: 'short', + day: '2-digit', + month: 'short', + year: 'numeric', + + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hourCycle: 'h23', + + timeZone: timeZone, + timeZoneName: 'longOffset', + }; + + const formattedDate = new Intl.DateTimeFormat('en-US', options).format(date); + const [wkd, mmm, dd, yyyy, time, z] = formattedDate.replace(/([,\s]+)/g, ' ').split(' '); + const tz = z.replace(/GMT(?\+|\-)(?\d\d):(?\d\d)/, '$$$'); + + return `${wkd}, ${dd} ${mmm} ${yyyy} ${time} ${tz}`; +} diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/getNewestCollectionItemDate.js b/node_modules/@11ty/eleventy-plugin-rss/src/getNewestCollectionItemDate.js new file mode 100644 index 0000000..05e7a8b --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/getNewestCollectionItemDate.js @@ -0,0 +1,7 @@ +export default function(collection, emptyFallbackDate) { + if( !collection || !collection.length ) { + return emptyFallbackDate || new Date(); + } + + return new Date(Math.max(...collection.map(item => {return item.date}))); +} diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/htmlToAbsoluteUrls.js b/node_modules/@11ty/eleventy-plugin-rss/src/htmlToAbsoluteUrls.js new file mode 100644 index 0000000..56004fa --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/htmlToAbsoluteUrls.js @@ -0,0 +1,21 @@ +import posthtml from 'posthtml'; +import urls from '@11ty/posthtml-urls'; +import absoluteUrl from "./absoluteUrl.js"; + +// This is deprecated! Use the Eleventy HTML plugin instead (2.0+) +export default async function(htmlContent, base, processOptions = {}) { + if( !base ) { + throw new Error( "eleventy-plugin-rss: htmlToAbsoluteUrls(absolutePostUrl) was missing the full URL base `absolutePostUrl` argument.") + } + + let options = { + eachURL: function(url) { + return absoluteUrl(url.trim(), base); + } + }; + + let modifier = posthtml().use(urls(options)); + + let result = await modifier.process(htmlContent, processOptions); + return result.html; +}; diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/rssPlugin.js b/node_modules/@11ty/eleventy-plugin-rss/src/rssPlugin.js new file mode 100644 index 0000000..c746653 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/rssPlugin.js @@ -0,0 +1,60 @@ +import pkg from "../package.json" with {type: "json"}; + +import dateRfc3339 from "./dateRfc3339.js"; +import dateRfc822 from "./dateRfc822.js"; +import getNewestCollectionItemDate from "./getNewestCollectionItemDate.js"; + +import absoluteUrl from "./absoluteUrl.js"; +import convertHtmlToAbsoluteUrls from "./htmlToAbsoluteUrls.js"; + + +export default function eleventyRssPlugin(eleventyConfig, options = {}) { + eleventyConfig.versionCheck(pkg["11ty"].compatibility); + + // Guaranteed unique, first add wins + const pluginHtmlBase = eleventyConfig.resolvePlugin("@11ty/eleventy/html-base-plugin"); + eleventyConfig.addPlugin(pluginHtmlBase, options.htmlBasePluginOptions || {}); + + // Dates + eleventyConfig.addNunjucksFilter("getNewestCollectionItemDate", getNewestCollectionItemDate); + eleventyConfig.addNunjucksFilter("dateToRfc3339", dateRfc3339); + eleventyConfig.addNunjucksFilter("dateToRfc822", dateRfc822); + + // Deprecated in favor of the more efficient HTML plugin bundled with Eleventy + eleventyConfig.addNunjucksFilter("absoluteUrl", absoluteUrl); + + // Deprecated in favor of the more efficient HTML plugin bundled with Eleventy + eleventyConfig.addNunjucksAsyncFilter("htmlToAbsoluteUrls", (htmlContent, base, callback) => { + if(!htmlContent) { + callback(null, ""); + return; + } + + let posthtmlOptions = Object.assign({ + // default PostHTML render options + closingSingleTag: "slash" + }, options.posthtmlRenderOptions); + + convertHtmlToAbsoluteUrls(htmlContent, base, posthtmlOptions).then(html => { + callback(null, html); + }); + }); + + // These are removed, their names are incorrect! Issue #8, #21 + eleventyConfig.addNunjucksFilter("rssLastUpdatedDate", () => { + throw new Error("The `rssLastUpdatedDate` filter was removed. Use `getNewestCollectionItemDate | dateToRfc3339` (for Atom) or `getNewestCollectionItemDate | dateToRfc822` (for RSS) instead.") + }); + eleventyConfig.addNunjucksFilter("rssDate", () => { + throw new Error("The `rssDate` filter was removed. Use `dateToRfc3339` (for Atom) or `dateToRfc822` (for RSS) instead."); + }); +}; + +Object.defineProperty(eleventyRssPlugin, "eleventyPackage", { + value: pkg.name +}); + +Object.defineProperty(eleventyRssPlugin, "eleventyPluginOptions", { + value: { + unique: true + } +}); diff --git a/node_modules/@11ty/eleventy-plugin-rss/src/virtualTemplate.js b/node_modules/@11ty/eleventy-plugin-rss/src/virtualTemplate.js new file mode 100644 index 0000000..a7e8028 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-rss/src/virtualTemplate.js @@ -0,0 +1,204 @@ +import debugUtil from "debug"; +import pkg from "../package.json" with {type: "json"}; + +import { DeepCopy } from "@11ty/eleventy-utils"; + +import rssPlugin from "./rssPlugin.js"; + +const debug = debugUtil("Eleventy:Rss:Feed"); + +function getFeedContent({ type, stylesheet, collection, script }) { + // Note: page.lang comes from the i18n plugin: https://www.11ty.dev/docs/plugins/i18n/#page.lang + + if(type === "rss") { + // Nunjucks template + return ` +${stylesheet ? `\n` : ""} + + ${script ? `` : ""} + {{ metadata.title }} + {{ metadata.base | addPathPrefixToFullUrl }} + + {{ metadata.subtitle }} + {{ metadata.language or page.lang }} + {%- if metadata.icon %}{{ metadata.icon }}{%- endif %} + {%- for post in collections.${collection.name} | reverse | eleventyFeedHead(${collection.limit}) %} + {%- set absolutePostUrl = post.url | htmlBaseUrl(metadata.base) %} + + {{ post.data.title }} + {{ absolutePostUrl }} + {%- if (post.data.summary) -%} + {{ post.data.summary }} + {{ post.content | renderTransforms(post.data.page, metadata.base) }} + {%- else -%} + {{ post.content | renderTransforms(post.data.page, metadata.base) }} + {%- endif -%} + {{ post.date | dateToRfc822 }} + {{ metadata.author.name }} + {{ absolutePostUrl }} + + {%- endfor %} + +`; + } + + if(type === "atom") { + // Nunjucks template + return ` +${stylesheet ? `\n` : ""} + ${script ? `` : ""} + {{ metadata.title }} + {{ metadata.subtitle }} + + + {{ collections['${collection.name}'] | getNewestCollectionItemDate | dateToRfc3339 }} + {{ metadata.base | addPathPrefixToFullUrl }} + {%- if metadata.icon %} + {{ metadata.icon }} + {%- endif %} + {%- if metadata.logo %} + {{ metadata.logo }} + {%- endif %} + + {{ metadata.author.name }} + {%- if metadata.author.email %} + {{ metadata.author.email }} + {%- endif %} + + {%- for post in collections['${collection.name}'] | reverse | eleventyFeedHead(${collection.limit}) %} + {%- set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.base) }}{% endset %} + + {{ post.data.title }} + + {{ post.date | dateToRfc3339 }} + {{ absolutePostUrl }} + {%- if post.data.summary %} + {{ post.data.summary }} + {%- endif %} + {{ post.content | renderTransforms(post.data.page, metadata.base) }} + + {%- endfor %} +`; + } + + if(type === "json") { + return `{ + "version": "https://jsonfeed.org/version/1.1", + "title": "{{ metadata.title }}", + "language": "{{ metadata.language or page.lang }}", + "home_page_url": "{{ metadata.base | addPathPrefixToFullUrl }}", + "feed_url": "{{ permalink | htmlBaseUrl(metadata.base) }}", + "description": "{{ metadata.description }}", + "authors": [ + { + "name": "{{ metadata.author.name }}"{% if metadata.author.email %}, + "url": "mailto:{{ metadata.author.email }}" + {%- endif %} + } + ], + "items": [ + {%- for post in collections['${collection.name}'] | reverse | eleventyFeedHead(${collection.limit}) %} + {%- set absolutePostUrl %}{{ post.url | htmlBaseUrl(metadata.base) }}{% endset %} + { + "id": "{{ absolutePostUrl }}", + "url": "{{ absolutePostUrl }}", + "title": "{{ post.data.title }}", + "content_html": {% if post.content %}{{ post.content | renderTransforms(post.data.page, metadata.base) | dump | safe }}{% else %}""{% endif %}, + "date_published": "{{ post.date | dateToRfc3339 }}" + } + {% if not loop.last %},{% endif %} + {%- endfor %} + ] +}` + } + + throw new Error("Missing or invalid feed type. Received: " + type); +} + +export default function eleventyFeedPlugin(eleventyConfig, options = {}) { + eleventyConfig.versionCheck(pkg["11ty"].compatibility); + + // Guaranteed unique, first add wins + const pluginHtmlBase = eleventyConfig.resolvePlugin("@11ty/eleventy/html-base-plugin"); + eleventyConfig.addPlugin(pluginHtmlBase, options.htmlBasePluginOptions || {}); + + // Guaranteed unique, first add wins + eleventyConfig.addPlugin(rssPlugin, options.rssPluginOptions || {}); + + let slugifyFilter = eleventyConfig.getFilter("slugify"); + let inputPathSuffix = options?.metadata?.title ? `-${slugifyFilter(options?.metadata?.title)}` : ""; + + options = DeepCopy({ + // rss and json also supported + type: "atom", + collection: { + name: false, // required + limit: 0, // limit number of entries, 0 means no limit + }, + outputPath: "/feed.xml", + inputPath: `eleventy-plugin-feed${inputPathSuffix}-${options.type || "atom"}.njk`, // TODO make this more unique + templateData: {}, + metadata: { + title: "Blog Title", + subtitle: "This is a longer description about your blog.", + language: "", // downstream templates use `page.lang` as fallback + base: "https://example.com/", + author: { + name: "Your Name", + email: "", // Optional + } + } + }, options); + + if(!options.collection?.name) { + throw new Error("Missing `collection.name` option in feedPlugin from @11ty/eleventy-plugin-rss."); + } + if(typeof options.collection?.name !== "string") { + throw new Error("Only string is supported in `collection.name` option in feedPlugin from @11ty/eleventy-plugin-rss. Received: " + typeof options.collection?.name); + } + + let eleventyExcludeFromCollections; + let eleventyImport; + if(options.collection.name === "all") { + eleventyExcludeFromCollections = true; + eleventyImport = {}; + } else { + eleventyExcludeFromCollections = [ options.collection.name ] + eleventyImport = { + collections: [ options.collection.name ], + }; + } + + let templateData = { + ...options?.templateData || {}, + permalink: options.outputPath, + eleventyExcludeFromCollections, + eleventyImport, + layout: false, + metadata: options.metadata, + }; + + // Get the first `n` elements of a collection. + eleventyConfig.addFilter("eleventyFeedHead", function(array, n) { + if(!n || n === 0) { + return array; + } + if(n < 0) { + return array.slice(n); + } + return array.slice(0, n); + }); + + eleventyConfig.addTemplate(options.inputPath, getFeedContent(options), templateData); +}; + +Object.defineProperty(eleventyFeedPlugin, "eleventyPackage", { + value: `${pkg.name}/feed-plugin` +}); + +Object.defineProperty(eleventyFeedPlugin, "eleventyPluginOptions", { + value: { + // multiple adds of this one is OK + unique: false + } +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.editorconfig b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.editorconfig new file mode 100644 index 0000000..d415404 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eleventy.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eleventy.js new file mode 100644 index 0000000..a3b1838 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eleventy.js @@ -0,0 +1,60 @@ +const pkg = require("./package.json"); +const Prism = require("prismjs"); +const PrismLoader = require("./src/PrismLoader"); +const hasTemplateFormat = require("./src/hasTemplateFormat"); +const HighlightPairedShortcode = require("./src/HighlightPairedShortcode"); +const LiquidHighlightTag = require("./src/LiquidHighlightTag"); +const markdownPrismJs = require("./src/markdownSyntaxHighlightOptions"); + +module.exports = function(eleventyConfig, options){ + try { + eleventyConfig.versionCheck(pkg["11ty"].compatibility); + } catch(e) { + console.log( `WARN: Eleventy Plugin (${pkg.name}) Compatibility: ${e.message}` ); + } + options = Object.assign({ + init: function({Prism}){}, + lineSeparator: "\n", + errorOnInvalidLanguage: false, + alwaysWrapLineHighlights: false, + preAttributes: {}, + codeAttributes: {}, + languages: [], + }, options); + + for(const language of options.languages){ + PrismLoader(language) + } + + if( hasTemplateFormat(options.templateFormats, "liquid") ) { + eleventyConfig.addLiquidTag("highlight", (liquidEngine) => { + // {% highlight js 0 2 %} + let highlight = new LiquidHighlightTag(liquidEngine); + return highlight.getObject(options); + }); + } + + if( hasTemplateFormat(options.templateFormats, "njk") ) { + eleventyConfig.addPairedNunjucksShortcode("highlight", (content, args) => { + // {% highlight "js 0 2-3" %} + let [language, ...highlightNumbers] = args.split(" "); + return HighlightPairedShortcode(content, language, highlightNumbers.join(" "), options); + }); + } + + if( hasTemplateFormat(options.templateFormats, "md") ) { + // ```js/0,2-3 + eleventyConfig.addMarkdownHighlighter(markdownPrismJs(options)); + } + + // we need to add this as many template languages (Vue, WebC) rely on JavaScript functions (not just 11ty.js) + eleventyConfig.addJavaScriptFunction("highlight", (language, content, highlight1, highlight2) => { + let highlightLines = [highlight1, highlight2].filter(entry => entry).join(" "); + let result = HighlightPairedShortcode(content, language, highlightLines, options); + return result; + }); + + options.init({Prism}) +}; + +module.exports.pairedShortcode = HighlightPairedShortcode; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eleventyignore b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eleventyignore new file mode 100644 index 0000000..b43bf86 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eleventyignore @@ -0,0 +1 @@ +README.md diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eslintrc.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eslintrc.js new file mode 100644 index 0000000..62e8c16 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + env: { + es6: true, + node: true + }, + extends: "eslint:recommended", + parserOptions: { + sourceType: "module", + ecmaVersion: 2017 + }, + rules: { + indent: ["error", 2], + "linebreak-style": ["error", "unix"], + quotes: ["error", "double"], + semi: ["error", "always"] + } +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.gitattributes b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.gitattributes new file mode 100644 index 0000000..d01653a --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.gitattributes @@ -0,0 +1 @@ +text eol=lf diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.github/workflows/ci.yml b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.github/workflows/ci.yml new file mode 100644 index 0000000..eee523c --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.github/workflows/ci.yml @@ -0,0 +1,23 @@ +on: + push: + branches-ignore: + - "gh-pages" +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + node: ["16", "18", "20", "22", "24"] + 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 }} + # cache: npm + - run: npm install + - run: npm test +env: + YARN_GPG: no diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.github/workflows/release.yml b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.github/workflows/release.yml new file mode 100644 index 0000000..b1c03b9 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/.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 install + - 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/eleventy-plugin-syntaxhighlight/LICENSE b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/LICENSE new file mode 100644 index 0000000..89a4362 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 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-plugin-syntaxhighlight/README.md b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/README.md new file mode 100644 index 0000000..c55781d --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/README.md @@ -0,0 +1,8 @@ +

    eleventy Logo

    + +# eleventy-plugin-syntaxhighlight 🕚⚡️🎈🐀 + +A pack of [Eleventy](https://github.com/11ty/eleventy) plugins for syntax highlighting. No browser/client JavaScript here, these highlight transformations are all done at build-time. + +## Read the [Full Documentation on 11ty.dev](https://www.11ty.dev/docs/plugins/syntaxhighlight/) + diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/eleventy-config.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/eleventy-config.js new file mode 100644 index 0000000..c6f37fc --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/eleventy-config.js @@ -0,0 +1,10 @@ +const syntaxHighlight = require("../.eleventy.js"); + +module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin(syntaxHighlight, { + // alwaysWrapLineHighlights: true + preAttributes: { tabindex: 0 } + }); + + eleventyConfig.setTemplateFormats("njk,liquid,md,css"); +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/prism-theme.css b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/prism-theme.css new file mode 100644 index 0000000..4e2d4e7 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/prism-theme.css @@ -0,0 +1,148 @@ +pre { + display: block; + padding: .75rem 1rem; + line-height: 1.5; + + overflow-x: auto; + background-color: #eee; + font-size: 0.875em; /* 14px /16 */ + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; + + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + + background-color: #272822; + color: #fff; +} + + +/** + * a11y-dark theme for JavaScript, CSS, and HTML + * Based on the okaidia theme: https://github.com/PrismJS/prism/blob/gh-pages/themes/prism-okaidia.css + * @author ericwbailey + */ + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #d4d0ab; +} + +.token.punctuation { + color: #fefefe; +} + +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #ffa07a; +} + +.token.boolean, +.token.number { + color: #00e0e0; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #abe338; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #00e0e0; +} + +.token.atrule, +.token.attr-value, +.token.function { + color: #ffd700; +} + +.token.keyword { + color: #00e0e0; +} + +.token.regex, +.token.important { + color: #ffd700; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +@media screen and (-ms-high-contrast: active) { + code[class*="language-"], + pre[class*="language-"] { + color: windowText; + background: window; + } + + :not(pre) > code[class*="language-"], + pre[class*="language-"] { + background: window; + } + + .token.important { + background: highlight; + color: window; + font-weight: normal; + } + + .token.atrule, + .token.attr-value, + .token.function, + .token.keyword, + .token.operator, + .token.selector { + font-weight: bold; + } + + .token.attr-value, + .token.comment, + .token.doctype, + .token.function, + .token.keyword, + .token.operator, + .token.property, + .token.string { + color: highlight; + } + + .token.attr-value, + .token.url { + font-weight: normal; + } +} diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-liquid.liquid b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-liquid.liquid new file mode 100644 index 0000000..d714e2c --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-liquid.liquid @@ -0,0 +1,33 @@ + + + + + + + + + + +{% highlight js %} +function myFunction() { + return true; +} +{% endhighlight %} + +{% highlight js %} +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +{% endhighlight %} + +{% highlight js 1,3 %} +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +{% endhighlight %} + + diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-markdown.md b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-markdown.md new file mode 100644 index 0000000..15ba5e8 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-markdown.md @@ -0,0 +1,62 @@ + + + + + + + + + + +```ts +function myFunction() { + return true; +} +``` + +```typescript +function myFunction() { + return true; +} +``` + +```js +function myFunction() { + return true; +} +``` + +```js +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +``` + +## Dash line + +```js/- +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +``` + +```js/1,3 +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +``` + +## Scrollbar + +```js +import { aReallyLongFunctionNameThatCouldBeLongerButThisShouldBeLongEnoughByNowHopefully as anEvenLongerFunctionNameWithMoreCharactersThanCouldBeImaginedByAnyOnePersonInThisEntireWorldOfPeopleThatOneMightKnowAtLeastThatIsWhatIsTheorizedByThisLongName } from 'wow-this-is-so-long-you-might-need-a-scrollbar-to-see-it.long-ol-file-extension-that-should-not-be-this-long-on-a-real-site-but-this-is-to-demonstrate-the-accessibility-of-tabindex-and-scrollbars.js'; +``` + + + diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-nunjucks.njk b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-nunjucks.njk new file mode 100644 index 0000000..02513be --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test-nunjucks.njk @@ -0,0 +1,74 @@ + + + + + + + + + + + +{% highlight "js" %} +function myFunction() { + return true; +} +{% endhighlight %} + +{% highlight "js" %} +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +{% endhighlight %} + +{% highlight "js 1,3" %} +let multilineString = ` + this is the first line + this is the middle line + this is the last line +`; +{% endhighlight %} + +{% highlight "js 1,3" %} +alert("test"); + +let multilineString = buildSchema(` + this is the first line + this is the middle line + this is the last line +`); + +alert("test"); +{% endhighlight %} + +{% highlight "js" %} +module.exports = function({collections}) { + return `
      +${collections.post.map((post) => `
    • ${ post.data.title }
    • `).join("\n")} +
    `; +}; +{% endhighlight %} + +{% highlight "js 1,3" %} +module.exports = function({collections}) { + return `
      +${collections.post.map((post) => `
    • ${ post.data.title }
    • `).join("\n")} +
    `; +}; +{% endhighlight %} + +{% highlight "typescript" %} +function myFunction() { + return true; +} +{% endhighlight %} + +{% highlight "ts" %} +function myFunction() { + return true; +} +{% endhighlight %} + + diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test.css b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test.css new file mode 100644 index 0000000..5ab54a7 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/demo/test.css @@ -0,0 +1,15 @@ +.highlight-line { + display: inline-block; +} + +/* allow highlighting empty lines */ +.highlight-line:empty:before { + content: " "; +} + +.highlight-line:not(:last-child) { + min-width: 100%; +} +.highlight-line .highlight-line:not(:last-child) { + min-width: 0; +} diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/package.json b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/package.json new file mode 100644 index 0000000..e1d622c --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/package.json @@ -0,0 +1,55 @@ +{ + "name": "@11ty/eleventy-plugin-syntaxhighlight", + "version": "5.0.2", + "description": "Prism.js based syntax highlighting for Markdown, Liquid, Nunjucks, WebC, and 11ty.js templates.", + "publishConfig": { + "access": "public" + }, + "main": ".eleventy.js", + "scripts": { + "test": "npx ava", + "demo": "npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js", + "start": "npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js --serve" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/11ty/eleventy-plugin-syntaxhighlight.git" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + }, + "keywords": [ + "eleventy", + "eleventy-plugin" + ], + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/11ty/eleventy-plugin-syntaxhighlight/issues" + }, + "homepage": "https://www.11ty.dev/docs/plugins/syntaxhighlight/", + "11ty": { + "compatibility": ">=0.5.4" + }, + "devDependencies": { + "@11ty/eleventy": "^3.1.2", + "ava": "^6.4.1", + "markdown-it": "^14.1.0" + }, + "dependencies": { + "prismjs": "^1.30.0" + }, + "ava": { + "environmentVariables": {}, + "failFast": false, + "files": [ + "./test/*.js", + "./test/*.mjs" + ] + } +} diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightLines.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightLines.js new file mode 100644 index 0000000..4aa8312 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightLines.js @@ -0,0 +1,33 @@ +class HighlightLines { + constructor(rangeStr) { + this.highlights = this.convertRangeToHash(rangeStr); + } + + convertRangeToHash(rangeStr) { + let hash = {}; + if( !rangeStr ) { + return hash; + } + + let ranges = rangeStr.split(",").map(function(range) { + return range.trim(); + }); + + for(let range of ranges) { + let startFinish = range.split('-'); + let start = parseInt(startFinish[0], 10); + let end = parseInt(startFinish[1] || start, 10); + + for( let j = start, k = end; j<=k; j++ ) { + hash[j] = true; + } + } + return hash; + } + + isHighlighted(lineNumber) { + return !!this.highlights[lineNumber]; + } +} + +module.exports = HighlightLines; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightLinesGroup.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightLinesGroup.js new file mode 100644 index 0000000..47c0aaa --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightLinesGroup.js @@ -0,0 +1,68 @@ +const HighlightLines = require("./HighlightLines"); + +class HighlightLinesGroup { + constructor(str, delimiter) { + this.init(str, delimiter); + } + + init(str = "", delimiter = " ") { + this.str = str; + this.delimiter = delimiter; + + let split = str.split(this.delimiter); + this.highlights = new HighlightLines(split.length === 1 ? split[0] : ""); + this.highlightsAdd = new HighlightLines(split.length === 2 ? split[0] : ""); + this.highlightsRemove = new HighlightLines(split.length === 2 ? split[1] : ""); + } + + isHighlighted(lineNumber) { + return this.highlights.isHighlighted(lineNumber); + } + + isHighlightedAdd(lineNumber) { + return this.highlightsAdd.isHighlighted(lineNumber); + } + + isHighlightedRemove(lineNumber) { + return this.highlightsRemove.isHighlighted(lineNumber); + } + + hasTagMismatch(line) { + let startCount = line.split(" or on the line. + // for example, we can’t wrap with + if(this.hasTagMismatch(line)) { + return line; + } + + return before + line + after; + } + + getLineMarkup(lineNumber, line, extraClasses = []) { + let extraClassesStr = (extraClasses.length ? " " + extraClasses.join(" ") : ""); + + if (this.isHighlighted(lineNumber)) { + return this.splitLineMarkup(line, ``, ``); + } + if (this.isHighlightedAdd(lineNumber)) { + return this.splitLineMarkup(line, ``, ``); + } + if (this.isHighlightedRemove(lineNumber)) { + return this.splitLineMarkup(line, ``, ``); + } + + return this.splitLineMarkup( line, ``, ``); + } +} + +module.exports = HighlightLinesGroup; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightPairedShortcode.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightPairedShortcode.js new file mode 100644 index 0000000..be37d52 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/HighlightPairedShortcode.js @@ -0,0 +1,39 @@ +const Prism = require("prismjs"); +const PrismLoader = require("./PrismLoader"); +const HighlightLinesGroup = require("./HighlightLinesGroup"); +const getAttributes = require("./getAttributes"); + +module.exports = function (content, language, highlightNumbers, options = {}) { + // default to on + if(options.trim === undefined || options.trim === true) { + content = content.trim(); + } + + let highlightedContent; + if( language === "text" ) { + highlightedContent = content; + } else { + let loader = PrismLoader(language, options); + if(!loader) { + highlightedContent = content; + } else { + highlightedContent = Prism.highlight(content, loader, language); + } + } + + let group = new HighlightLinesGroup(highlightNumbers); + let lines = highlightedContent.split(/\r?\n/); + lines = lines.map(function(line, j) { + if(options.alwaysWrapLineHighlights || highlightNumbers) { + let lineContent = group.getLineMarkup(j, line); + return lineContent; + } + return line; + }); + + const context = { content: content, language: language, options: options }; + const preAttributes = getAttributes(options.preAttributes, context); + const codeAttributes = getAttributes(options.codeAttributes, context); + + return `` + lines.join(options.lineSeparator || "
    ") + ""; +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/LiquidHighlightTag.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/LiquidHighlightTag.js new file mode 100644 index 0000000..26eb7ce --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/LiquidHighlightTag.js @@ -0,0 +1,49 @@ +const HighlightPairedShortcode = require("./HighlightPairedShortcode"); + +class LiquidHighlightTag { + constructor(liquidEngine) { + this.liquidEngine = liquidEngine; + } + + getObject(options = {}) { + let ret = function(highlighter) { + return { + parse: function(tagToken, remainTokens) { + let split = tagToken.args.split(" "); + + this.language = split.shift(); + this.highlightLines = split.join(" "); + + this.tokens = []; + + var stream = highlighter.liquidEngine.parser.parseStream(remainTokens); + + stream + .on("token", token => { + if (token.name === "endhighlight") { + stream.stop(); + } else { + this.tokens.push(token); + } + }) + .on("end", x => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + + stream.start(); + }, + render: function(scope, hash) { + let tokens = this.tokens.map(token => { + return token.raw || token.getText(); + }); + let tokenStr = tokens.join("").trim(); + return Promise.resolve(HighlightPairedShortcode(tokenStr, this.language, this.highlightLines, options)); + } + }; + }; + + return ret(this); + } +} + +module.exports = LiquidHighlightTag; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/PrismLoader.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/PrismLoader.js new file mode 100644 index 0000000..5fa6007 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/PrismLoader.js @@ -0,0 +1,42 @@ +const Prism = require("prismjs"); +const PrismLoader = require("prismjs/components/index.js"); +// Avoid "Language does not exist: " console logs +PrismLoader.silent = true; + +require("prismjs/components/prism-diff.js"); + +// Load diff-highlight plugin +require("prismjs/plugins/diff-highlight/prism-diff-highlight"); + +const PrismAlias = require("./PrismNormalizeAlias"); + +module.exports = function(language, options = {}) { + let diffRemovedRawName = language; + if(language.startsWith("diff-")) { + diffRemovedRawName = language.substr("diff-".length); + } + // aliasing should ignore diff- + let aliasedName = PrismAlias(diffRemovedRawName); + + if(!Prism.languages[ aliasedName ]) { // matches `diff` too + PrismLoader(aliasedName); + } + + if(options.errorOnInvalidLanguage && !Prism.languages[ aliasedName ]) { + throw new Error(`"${language}" is not a valid Prism.js language for eleventy-plugin-syntaxhighlight`); + } + + if(!language.startsWith("diff-")) { + return Prism.languages[ aliasedName ]; + } + + // language has diff- prefix + let fullLanguageName = `diff-${aliasedName}`; + + // Store into with aliased keys + // ts -> diff-typescript + // js -> diff-javascript + Prism.languages[ fullLanguageName ] = Prism.languages.diff; + + return Prism.languages[ fullLanguageName ]; +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/PrismNormalizeAlias.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/PrismNormalizeAlias.js new file mode 100644 index 0000000..7738e05 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/PrismNormalizeAlias.js @@ -0,0 +1,40 @@ +const HARDCODED_ALIASES = { + njk: "jinja2", + nunjucks: "jinja2", +}; + +// This was added to make `ts` resolve to `typescript` correctly. +// The Prism loader doesn’t seem to always handle aliasing correctly. +module.exports = function(language) { + try { + // Careful this is not public API stuff: + // https://github.com/PrismJS/prism/issues/2146 + const PrismComponents = require("prismjs/components.json"); + let langs = PrismComponents.languages; + + // Manual override + if(HARDCODED_ALIASES[language]) { + language = HARDCODED_ALIASES[language]; + } + + if(langs[ language ]) { + return language; + } + for(let langName in langs) { + if(Array.isArray(langs[langName].alias)) { + for(let alias of langs[langName].alias) { + if(alias === language) { + return langName; + } + } + } else if(langs[langName].alias === language) { + return langName; + } + } + } catch(e) { + // Couldn’t find the components file, aliases may not resolve correctly + // See https://github.com/11ty/eleventy-plugin-syntaxhighlight/issues/19 + } + + return language; +} diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/getAttributes.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/getAttributes.js new file mode 100644 index 0000000..603c6a5 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/getAttributes.js @@ -0,0 +1,62 @@ +function attributeEntryToString(attribute, context) { + let [key, value] = attribute; + + if (typeof value === "function") { // Callback must return a string or a number + value = value(context); // Run the provided callback and store the result + } + + if (typeof value !== "string" && typeof value !== "number") { + throw new Error( + `Attribute "${key}" must have, or evaluate to, a value of type string or number, not "${typeof value}".` + ); + } + + return `${key}="${value}"`; +} + +/** + * ## Usage + * The function `getAttributes` is used to convert an object, `attributes`, with HTML attributes as keys and the values as the corresponding HTML attribute's values. + * If it is falsey, an empty string will be returned. + * + * ```js + getAttributes({ + tabindex: 0, + 'data-language': function (context) { return context.language; }, + 'data-otherStuff': 'value' + }) // => ' tabindex="0" data-language="JavaScript" data-otherStuff="value"' + ``` + * + * @param {{[s: string]: string | number}} attributes An object with key-value pairs that represent attributes. + * @param {object} context An object with the current context. + * @param {string} context.content The code to parse and highlight. + * @param {string} context.language The language for the current instance. + * @param {object} context.options The options passed to the syntax highlighter. + * @returns {string} A string containing the above HTML attributes preceded by a single space. + */ +function getAttributes(attributes, context = {}) { + let langClass = context.language ? `language-${context.language}` : ""; + + if (!attributes) { + return langClass ? ` class="${langClass}"` : ""; + } else if (typeof attributes === "object") { + if(!("class" in attributes) && langClass) { + // class attribute should be first in order + let tempAttrs = { class: langClass }; + for(let key in attributes) { + tempAttrs[key] = attributes[key]; + } + attributes = tempAttrs; + } + + const formattedAttributes = Object.entries(attributes).map( + entry => attributeEntryToString(entry, context) + ); + + return formattedAttributes.length ? ` ${formattedAttributes.join(" ")}` : ""; + } else if (typeof attributes === "string") { + throw new Error("Syntax highlighter plugin custom attributes on
     and  must be an object. Received: " + JSON.stringify(attributes));
    +  }
    +}
    +
    +module.exports = getAttributes;
    diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/hasTemplateFormat.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/hasTemplateFormat.js
    new file mode 100644
    index 0000000..ee81e89
    --- /dev/null
    +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/hasTemplateFormat.js
    @@ -0,0 +1,13 @@
    +module.exports = function(templateFormats = ["*"], format = false) {
    +  if(!Array.isArray(templateFormats)) {
    +    templateFormats = [templateFormats];
    +  }
    +
    +  if( Array.isArray(templateFormats) ) {
    +    if( templateFormats.indexOf("*") > -1 || templateFormats.indexOf(format) > -1 ) {
    +      return true;
    +    }
    +  }
    +
    +  return false;
    +};
    diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/markdownSyntaxHighlightOptions.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/markdownSyntaxHighlightOptions.js
    new file mode 100644
    index 0000000..098c683
    --- /dev/null
    +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/src/markdownSyntaxHighlightOptions.js
    @@ -0,0 +1,54 @@
    +const Prism = require("prismjs");
    +const PrismLoader = require("./PrismLoader");
    +const HighlightLinesGroup = require("./HighlightLinesGroup");
    +const getAttributes = require("./getAttributes");
    +
    +module.exports = function (options = {}) {
    +  return function(str, language) {
    +    if(!language) {
    +      // empty string means defer to the upstream escaping code built into markdown lib.
    +      return "";
    +    }
    +
    +
    +    let split = language.split("/");
    +    if( split.length ) {
    +      language = split.shift();
    +    }
    +
    +    let html;
    +    if(language === "text") {
    +      html = str;
    +    } else {
    +      let loader = PrismLoader(language, options)
    +      if(!loader) {
    +        html = str;
    +      } else {
    +        html = Prism.highlight(str, loader, language);
    +      }
    +    }
    +
    +    let hasHighlightNumbers = split.length > 0;
    +    let highlights = new HighlightLinesGroup(split.join("/"), "/");
    +    let lines = html.split("\n");
    +
    +    // Trim last line if it is empty
    +    if (lines[lines.length - 1] === "") {
    +      lines = lines.slice(0, -1);
    +    }
    +
    +    lines = lines.map(function(line, j) {
    +      if(options.alwaysWrapLineHighlights || hasHighlightNumbers) {
    +        let lineContent = highlights.getLineMarkup(j, line);
    +        return lineContent;
    +      }
    +      return line;
    +    });
    +
    +    const context = { content: str, language: language, options: options };
    +    const preAttributes = getAttributes(options.preAttributes, context);
    +    const codeAttributes = getAttributes(options.codeAttributes, context);
    +
    +    return `${lines.join(options.lineSeparator || "
    ")}
    `; + }; +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/syntax-highlight.webc b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/syntax-highlight.webc new file mode 100644 index 0000000..d894ea3 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/syntax-highlight.webc @@ -0,0 +1,18 @@ + diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-diff/.eleventy.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-diff/.eleventy.js new file mode 100644 index 0000000..40a3b76 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-diff/.eleventy.js @@ -0,0 +1,5 @@ +const syntaxHighlight = require("../../"); + +module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin(syntaxHighlight); +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-diff/test.11ty.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-diff/test.11ty.js new file mode 100644 index 0000000..cba7e9a --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-diff/test.11ty.js @@ -0,0 +1,5 @@ +module.exports = function(data) { + let result1 = this.highlight("diff", "-var test;"); + let result2 = this.highlight("diff-js", "-var test;"); + return result1 + "\n" + result2; +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-test/.eleventy.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-test/.eleventy.js new file mode 100644 index 0000000..40a3b76 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-test/.eleventy.js @@ -0,0 +1,5 @@ +const syntaxHighlight = require("../../"); + +module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin(syntaxHighlight); +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-test/test.11ty.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-test/test.11ty.js new file mode 100644 index 0000000..67c309f --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/11tyjs-test/test.11ty.js @@ -0,0 +1,4 @@ +module.exports = function(data) { + let result = this.highlight("js", "var test;"); + return result; +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/EleventyTest.mjs b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/EleventyTest.mjs new file mode 100644 index 0000000..21aaeaf --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/EleventyTest.mjs @@ -0,0 +1,28 @@ +import test from "ava"; +import Eleventy from '@11ty/eleventy'; + +function normalizeNewLines(str) { + return str.replace(/\r\n/g, "\n"); +} + +test("Diff output escaped #75", async t => { + let elev = new Eleventy("./test/issue-75/", "./test/issue-75/_site/", { + configPath: "./test/issue-75/.eleventy.js" + }); + let json = await elev.toJSON(); + + t.is(json.length, 1); + t.is(normalizeNewLines(json[0].content.trim()), normalizeNewLines(`
    <p>Hello</p>
    +
    -<p>Hello</p>
    `)); +}); + +test("diff-javascript #80", async t => { + let elev = new Eleventy("./test/issue-80/", "./test/issue-80/_site/", { + configPath: "./test/issue-80/.eleventy.js" + }); + let json = await elev.toJSON(); + + t.is(json.length, 1); + t.is(normalizeNewLines(json[0].content.trim()), normalizeNewLines(`
    - foo()
    +
    `)); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/GetAttributesTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/GetAttributesTest.js new file mode 100644 index 0000000..d555968 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/GetAttributesTest.js @@ -0,0 +1,54 @@ +const test = require("ava"); +const ga = require("../src/getAttributes"); + +test("Falsy", t => { + t.is(ga(false), ""); + t.is(ga(null), ""); + t.is(ga(undefined), ""); + t.is(ga(""), ""); + t.throws(() => { + ga(" test='1'"); + }); +}); + +test("Object syntax", t => { + t.is(ga({}), ""); + t.is(ga({ hi: 1 }), ' hi="1"'); + t.is(ga({ hi: 1, bye: 2 }), ' hi="1" bye="2"'); + t.is(ga({ class: "my-class", bye: 2 }), ' class="my-class" bye="2"'); + t.is(ga({ hi: function(ctx) { return '1'; }, bye: 2 }), ' hi="1" bye="2"'); +}); + +test("Function callback", t => { + t.is(ga({ "data-lang": ({language}) => language }, { + language: "html" + }), ' class="language-html" data-lang="html"'); +}); + +test("Function callback with class attribute (override)", t => { + t.is(ga({ + class: ({language}) => "my-custom-"+language + }, { + language: "html" + }), ' class="my-custom-html"'); +}); + +test("Function callback must return string or integer", t => { + t.throws(() => { + ga({ "data-lang": ({language}) => undefined }, { + language: "html" + }) + }); + + t.throws(() => { + ga({ "data-lang": ({language}) => {} }, { + language: "html" + }) + }); + + t.throws(() => { + ga({ "data-lang": ({language}) => false }, { + language: "html" + }) + }); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HasTemplateFormatTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HasTemplateFormatTest.js new file mode 100644 index 0000000..ad0cda5 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HasTemplateFormatTest.js @@ -0,0 +1,25 @@ +const test = require("ava"); +const hasTemplateFormat = require("../src/hasTemplateFormat"); + +test("hasTemplateFormats", t => { + t.true(hasTemplateFormat("*", "liquid")); + t.false(hasTemplateFormat([], "liquid")); + + // options not specified, defaults to * + t.true(hasTemplateFormat(undefined, "liquid")); + t.false(hasTemplateFormat(null, "liquid")); + + t.true(hasTemplateFormat("*", false)); + t.false(hasTemplateFormat([], false)); + + // options not specified, defaults to * + t.true(hasTemplateFormat(undefined, false)); + t.false(hasTemplateFormat(null, false)); + + t.true(hasTemplateFormat(["*"], "liquid")); + t.true(hasTemplateFormat(["liquid"], "liquid")); + t.true(hasTemplateFormat(["liquid", "njk"], "liquid")); + t.true(hasTemplateFormat(["liquid", "njk"], "njk")); + t.true(hasTemplateFormat(["liquid", "njk", "md"], "md")); + t.false(hasTemplateFormat(["liquid", "njk", "md"], "pug")); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightLinesGroupTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightLinesGroupTest.js new file mode 100644 index 0000000..9c575a8 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightLinesGroupTest.js @@ -0,0 +1,93 @@ +const test = require("ava"); +const HighlightLinesGroup = require("../src/HighlightLinesGroup"); + +test("Empty", t => { + let hilite = new HighlightLinesGroup(""); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), false); +}); + +test("Highlight irrelevant (-)", t => { + let hilite = new HighlightLinesGroup("-"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), false); +}); + +test("Highlight simple (0)", t => { + let hilite = new HighlightLinesGroup("0"); + t.is(hilite.isHighlighted(0), true); + t.is(hilite.isHighlighted(1), false); +}); + + +test("Highlight simple (1)", t => { + let hilite = new HighlightLinesGroup("1"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), true); +}); + +test("Highlight complex", t => { + let hilite = new HighlightLinesGroup("1-2,4"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), true); + t.is(hilite.isHighlighted(2), true); + t.is(hilite.isHighlighted(3), false); + t.is(hilite.isHighlighted(4), true); + t.is(hilite.isHighlighted(5), false); +}); + +test("Add/Remove", t => { + let hilite = new HighlightLinesGroup("1-2,4 3"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), false); + t.is(hilite.isHighlighted(2), false); + t.is(hilite.isHighlighted(3), false); + t.is(hilite.isHighlighted(4), false); + t.is(hilite.isHighlighted(5), false); + + t.is(hilite.isHighlightedAdd(0), false); + t.is(hilite.isHighlightedAdd(1), true); + t.is(hilite.isHighlightedAdd(2), true); + t.is(hilite.isHighlightedAdd(3), false); + t.is(hilite.isHighlightedAdd(4), true); + t.is(hilite.isHighlightedAdd(5), false); + + t.is(hilite.isHighlightedRemove(0), false); + t.is(hilite.isHighlightedRemove(1), false); + t.is(hilite.isHighlightedRemove(2), false); + t.is(hilite.isHighlightedRemove(3), true); + t.is(hilite.isHighlightedRemove(4), false); + t.is(hilite.isHighlightedRemove(5), false); +}); + +test("Add/Remove New Delimiter", t => { + let hilite = new HighlightLinesGroup("1-2,4/3", "/"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), false); + t.is(hilite.isHighlighted(2), false); + t.is(hilite.isHighlighted(3), false); + t.is(hilite.isHighlighted(4), false); + t.is(hilite.isHighlighted(5), false); + + t.is(hilite.isHighlightedAdd(0), false); + t.is(hilite.isHighlightedAdd(1), true); + t.is(hilite.isHighlightedAdd(2), true); + t.is(hilite.isHighlightedAdd(3), false); + t.is(hilite.isHighlightedAdd(4), true); + t.is(hilite.isHighlightedAdd(5), false); + + t.is(hilite.isHighlightedRemove(0), false); + t.is(hilite.isHighlightedRemove(1), false); + t.is(hilite.isHighlightedRemove(2), false); + t.is(hilite.isHighlightedRemove(3), true); + t.is(hilite.isHighlightedRemove(4), false); + t.is(hilite.isHighlightedRemove(5), false); +}); + +test("Split Line Markup", t => { + let hilite = new HighlightLinesGroup("", " "); + t.is(hilite.splitLineMarkup("Test", "BEFORE", "AFTER"), "BEFORETestAFTER"); + t.is(hilite.splitLineMarkup("Test", "BEFORE", "AFTER"), "BEFORETestAFTER"); + t.is(hilite.splitLineMarkup("Test", "BEFORE", "AFTER"), "Test"); + t.is(hilite.splitLineMarkup("Test", "BEFORE", "AFTER"), "Test"); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightLinesTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightLinesTest.js new file mode 100644 index 0000000..cbbb330 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightLinesTest.js @@ -0,0 +1,41 @@ +const test = require("ava"); +const HighlightLines = require("../src/HighlightLines"); + +test("HighlightLines empty", t => { + let hilite = new HighlightLines(""); + t.is(hilite.isHighlighted(0), false); +}); + +test("HighlightLines single 0", t => { + let hilite = new HighlightLines("0"); + t.is(hilite.isHighlighted(0), true); + t.is(hilite.isHighlighted(1), false); +}); + +test("HighlightLines single 1", t => { + let hilite = new HighlightLines("1"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), true); +}); + +test("HighlightLines range", t => { + let hilite = new HighlightLines("1-3"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), true); + t.is(hilite.isHighlighted(2), true); + t.is(hilite.isHighlighted(3), true); + t.is(hilite.isHighlighted(4), false); +}); + +test("HighlightLines multiple ranges", t => { + let hilite = new HighlightLines("1-3,5-7"); + t.is(hilite.isHighlighted(0), false); + t.is(hilite.isHighlighted(1), true); + t.is(hilite.isHighlighted(2), true); + t.is(hilite.isHighlighted(3), true); + t.is(hilite.isHighlighted(4), false); + t.is(hilite.isHighlighted(5), true); + t.is(hilite.isHighlighted(6), true); + t.is(hilite.isHighlighted(7), true); + t.is(hilite.isHighlighted(8), false); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightPairedShortcodeTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightPairedShortcodeTest.js new file mode 100644 index 0000000..d4217a5 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/HighlightPairedShortcodeTest.js @@ -0,0 +1,116 @@ +const test = require("ava"); +const HighlightPairedShortcode = require("../src/HighlightPairedShortcode"); + +test("Base", async t => { + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); +}); + +test("Base with LF EOL, always wrap highlights", async t => { + t.is(await HighlightPairedShortcode('alert();\nalert();', +"js", "", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); +}); + +test("Base with LF EOL, no wrap highlights", async t => { + t.is(await HighlightPairedShortcode('alert();\nalert();', +"js", "", { alwaysWrapLineHighlights: false }), `
    alert();
    alert();
    `); +}); + +test("Base with CRLF EOL, always wrap highlights", async t => { + t.is(await HighlightPairedShortcode('alert();\r\nalert();', +"js", "", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); +}); + +test("Base with CRLF EOL, no wrap highlights", async t => { + t.is(await HighlightPairedShortcode('alert();\r\nalert();', +"js", "", { alwaysWrapLineHighlights: false }), `
    alert();
    alert();
    `); +}); + +test("Base with custom attributes", async t => { + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "", { alwaysWrapLineHighlights: true, preAttributes: { tabindex: 0, 'data-testid': 'code' } }), `
    alert();
    alert();
    `); +}); + +test("Base change the line separator", async t => { + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "", { + alwaysWrapLineHighlights: true, + lineSeparator: "\n", +}), `
    alert();
    +alert();
    `); +}); + +test("Base No line highlights", async t => { + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", ""), `
    alert();
    alert();
    `); +}); + +test("Highlight Active", async t => { + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "0", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); + + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "0-1", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); +}); + +test("Highlight Add/Remove", async t => { + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "0 1", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); + + t.is(await HighlightPairedShortcode(`alert(); +alert();`, "js", "1 0", { alwaysWrapLineHighlights: true }), `
    alert();
    alert();
    `); +}); + +test("Test loader typescript", async t => { + let script = `function greeter(person) { + return "Hello, " + person; +} + +let user = "Jane User"; + +document.body.textContent = greeter(user);`; + + t.is(await HighlightPairedShortcode(script, "typescript"), `
    function greeter(person) {
    return "Hello, " + person;
    }

    let user = "Jane User";

    document.body.textContent = greeter(user);
    `); +}); + +test("Test loader ts", async t => { + let script = `function greeter(person) { + return "Hello, " + person; +} + +let user = "Jane User"; + +document.body.textContent = greeter(user);` + + t.is(await HighlightPairedShortcode(script, "ts"), `
    function greeter(person) {
    return "Hello, " + person;
    }

    let user = "Jane User";

    document.body.textContent = greeter(user);
    `); +}); + +test("Test loader invalid language, with errorOnInvalidLanguage option", async t => { + await t.throwsAsync(async () => { + await HighlightPairedShortcode("", "asldkjflksdaj", null, { + errorOnInvalidLanguage: true + }); + }, { message: `"asldkjflksdaj" is not a valid Prism.js language for eleventy-plugin-syntaxhighlight` }); +}); + +test("Test loader invalid language (should pass)", async t => { + t.is(await HighlightPairedShortcode("test test test", "asldkjflksdaj"), `
    test test test
    `) +}); + +test("Test loader invalid language with ignore", async t => { + let src = `hello +hello` + t.is(await HighlightPairedShortcode(src, "asldkjflksdaj"), `
    hello
    hello
    `); +}); + +test("Trim content option (defaults true)", async t => { + t.is(await HighlightPairedShortcode(` alert(); +alert(); `, "js", "", {}), `
    alert();
    alert();
    `); + + t.is(await HighlightPairedShortcode(` alert(); +alert(); `, "js", "", { trim: true }), `
    alert();
    alert();
    `); + + t.is(await HighlightPairedShortcode(` alert(); +alert(); `, "js", "", { trim: false }), `
     alert();
    alert();
    `); + +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/JavaScriptFunctionTest.mjs b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/JavaScriptFunctionTest.mjs new file mode 100644 index 0000000..22d8aba --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/JavaScriptFunctionTest.mjs @@ -0,0 +1,25 @@ +import test from "ava"; +import Eleventy from '@11ty/eleventy'; + +test("JavaScript Function", async t => { + let elev = new Eleventy("./test/11tyjs-test/", "./test/11tyjs-test/_site/", { + configPath: "./test/11tyjs-test/.eleventy.js" + }); + let json = await elev.toJSON(); + + t.is(json.length, 1); + let rendered = json[0].content; + t.is(`
    var test;
    `, rendered); +}); + +test("JavaScript Function Diff #76", async t => { + let elev = new Eleventy("./test/11tyjs-diff/", "./test/11tyjs-diff/_site/", { + configPath: "./test/11tyjs-diff/.eleventy.js" + }); + let json = await elev.toJSON(); + + t.is(json.length, 1); + let rendered = json[0].content; + t.is(`
    -var test;
    +
    -var test;
    `, rendered); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/LiquidHighlightTagTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/LiquidHighlightTagTest.js new file mode 100644 index 0000000..8d6eaa4 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/LiquidHighlightTagTest.js @@ -0,0 +1,43 @@ +const test = require("ava"); +const { Liquid } = require('liquidjs'); +const LiquidHighlightTag = require("../src/LiquidHighlightTag"); + +async function renderLiquid(str, data = {}, engine = null) { + if(!engine) { + engine = new Liquid(); + } + + let result = await engine.parseAndRender(str, data); + return result; +} + +test("Test Render", async t => { + t.is("Hi Zach", await renderLiquid("Hi {{name}}", {name: "Zach"})); +}); + +test("Test Highlight Tag Render", async t => { + let engine = new Liquid(); + let tag = new LiquidHighlightTag(engine); + engine.registerTag("highlight", tag.getObject()); + + let rendered = await renderLiquid("{% highlight js %}var test;{% endhighlight %}", {}, engine); + t.is(`
    var test;
    `, rendered); +}); + +test("Njk Alias", async t => { + let engine = new Liquid(); + let tag = new LiquidHighlightTag(engine); + engine.registerTag("highlight", tag.getObject()); + + let rendered = await renderLiquid("{% highlight njk %}{% raw %}hello{% endraw %}{% endhighlight %}", {}, engine); + t.is(`
    {% raw %}hello{% endraw %}
    `, rendered); +}); + +test("Nunjucks alias", async t => { + let engine = new Liquid(); + let tag = new LiquidHighlightTag(engine); + engine.registerTag("highlight", tag.getObject()); + + let rendered = await renderLiquid("{% highlight nunjucks %}{% raw %}hello{% endraw %}{% endhighlight %}", {}, engine); + t.is(`
    {% raw %}hello{% endraw %}
    `, rendered); +}); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/MarkdownHighlightTest.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/MarkdownHighlightTest.js new file mode 100644 index 0000000..e7a7cea --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/MarkdownHighlightTest.js @@ -0,0 +1,111 @@ +const test = require("ava"); +const md = require("markdown-it"); +const markdownPrismJsOptions = require("../src/markdownSyntaxHighlightOptions"); + +test("Test Markdown Highlighter", t => { + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions({ alwaysWrapLineHighlights: true }) + }); + t.is(mdLib.render(`\`\`\`js +alert(); +\`\`\``).trim(), `
    alert();
    `); +}); + +test("Test Markdown Highlighter No Line Highlights", t => { + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions() + }); + t.is(mdLib.render(`\`\`\`js +alert(); +\`\`\``).trim(), `
    alert();
    `); +}); + +test("Markdown with `preAttributes`", t => { + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions({ + alwaysWrapLineHighlights: true, + preAttributes: { + // will override class="language-js" + class: ({language}) => "not-a-lang-" + language + } + }) + }); + t.is(mdLib.render(`\`\`\`js +alert(); +\`\`\``).trim(), `
    alert();
    `); +}); + +test("Test Njk Alias", t => { + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions() + }); + t.is(mdLib.render(`\`\`\`njk +{% raw %}hello{% endraw %} +\`\`\``).trim(), `
    {% raw %}hello{% endraw %}
    `); +}); + +test("Test Nunjucks Alias", t => { + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions() + }); + t.is(mdLib.render(`\`\`\`nunjucks +{% raw %}hello{% endraw %} +\`\`\``).trim(), `
    {% raw %}hello{% endraw %}
    `); +}); + +test("Markdown Invalid language", t => { + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions({ + errorOnInvalidLanguage: true + }) + }); + + t.throws(() => { + mdLib.render(`\`\`\`asldkjflksdaj +hello +\`\`\``); + }); +}); + +test("Test loader invalid language with ignore", t => { + let src = `\`\`\`asldkjflksdaj +hello +\`\`\``; + + let mdLib = md(); + mdLib.set({ + highlight: markdownPrismJsOptions() + }); + t.is(mdLib.render(src).trim(), `
    hello
    `); +}); + +// test("Test Markdown Highlighter Block Comment", t => { +// let mdLib = md(); +// mdLib.set({ +// highlight: markdownPrismJsOptions({ alwaysWrapLineHighlights: true }) +// }); +// t.is(mdLib.render(`\`\`\`js +// /* +// * this is a string +// */ +// \`\`\``).trim(), `
    /*
    * this is a string
    */
    `); +// }); + +// TODO this still ain’t working right with the line highlighter. +// test("Test Markdown Highlighter GraphQL Example", t => { +// let mdLib = md(); +// mdLib.set({ +// highlight: markdownPrismJsOptions({ alwaysWrapLineHighlights: true }) +// }); +// t.is(mdLib.render(`\`\`\`js +// var schema = buildSchema(\`type Query { +// hello: String +// }\`); +// \`\`\``).trim(), ``); +// }); diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-75/.eleventy.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-75/.eleventy.js new file mode 100644 index 0000000..40a3b76 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-75/.eleventy.js @@ -0,0 +1,5 @@ +const syntaxHighlight = require("../../"); + +module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin(syntaxHighlight); +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-75/index.njk b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-75/index.njk new file mode 100644 index 0000000..86baee8 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-75/index.njk @@ -0,0 +1,6 @@ +{% highlight "html" %} +

    Hello

    +{% endhighlight %} +{% highlight "diff-html" %} +-

    Hello

    +{% endhighlight %} diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-80/.eleventy.js b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-80/.eleventy.js new file mode 100644 index 0000000..40a3b76 --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-80/.eleventy.js @@ -0,0 +1,5 @@ +const syntaxHighlight = require("../../"); + +module.exports = function(eleventyConfig) { + eleventyConfig.addPlugin(syntaxHighlight); +}; diff --git a/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-80/index.md b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-80/index.md new file mode 100644 index 0000000..54f886e --- /dev/null +++ b/node_modules/@11ty/eleventy-plugin-syntaxhighlight/test/issue-80/index.md @@ -0,0 +1,3 @@ +```diff-javascript +- foo() +``` 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/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.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.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.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/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.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/package.json b/node_modules/@11ty/eleventy/package.json new file mode 100644 index 0000000..f300eec --- /dev/null +++ b/node_modules/@11ty/eleventy/package.json @@ -0,0 +1,166 @@ +{ + "name": "@11ty/eleventy", + "version": "3.1.5", + "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.2", + "@11ty/eleventy-plugin-webc": "^0.12.0-beta.7", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "^10.0.1", + "@iarna/toml": "^2.2.5", + "@mdx-js/node-loader": "^3.1.1", + "@types/node": "^25.5.0", + "@vue/server-renderer": "^3.5.30", + "@zachleat/noop": "^1.0.7", + "ava": "^6.4.1", + "c8": "^11.0.0", + "eslint": "^10.0.3", + "eslint-config-prettier": "^10.1.8", + "globals": "^17.4.0", + "jsx-async-runtime": "^2.0.3", + "markdown-it-abbr": "^2.0.0", + "markdown-it-emoji": "^3.0.0", + "marked": "^17.0.4", + "nano-staged": "^0.9.0", + "prettier": "^3.8.1", + "pretty": "^2.0.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "sass": "^1.98.0", + "simple-git-hooks": "^2.13.1", + "tsx": "^4.21.0", + "typescript": "^5.9.3", + "vue": "^3.5.30", + "zod": "^4.3.6", + "zod-validation-error": "^5.0.0" + }, + "dependencies": { + "@11ty/dependency-tree": "^4.0.2", + "@11ty/dependency-tree-esm": "^2.0.4", + "@11ty/eleventy-dev-server": "^2.0.8", + "@11ty/eleventy-plugin-bundle": "^3.0.7", + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.2", + "@11ty/recursive-copy": "^4.0.4", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", + "debug": "^4.4.3", + "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.1", + "kleur": "^4.1.5", + "liquidjs": "^10.25.0", + "luxon": "^3.7.2", + "markdown-it": "^14.1.1", + "minimist": "^1.2.8", + "moo": "0.5.2", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.3", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.7", + "posthtml-match-helper": "^2.0.3", + "semver": "^7.7.4", + "slugify": "^1.6.8", + "tinyglobby": "^0.2.15" + }, + "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 ` + + + +
    +

    <heading-anchors> Web Component

    +
    +
    +

    Return to the GitHub Repository.

    + +

    Heading 2

    +

    This is simulated content.

    +

    Heading 3

    +

    This is simulated content.

    +

    Heading 4

    +

    This is simulated content.

    +

    Heading 2b

    +

    This is simulated content.

    +

    Heading 2c (Skipped)

    +

    This is simulated content.

    +

    Heading 2d

    +

    This is simulated content.

    +

    Heading 2e This is a very long header that will wrap This is a very long header that will wrap This is a very long header that will wrap

    +

    This is simulated content.

    +
    + + +

    Internationalized accessible link text

    +
    + + +

    Custom Glyph

    +
    + + + +

    Override font-family

    +
    + + + +

    Customize font-variation-settings

    +
    + + + +

    Use a Font Awesome icon

    +

    The above example also shows how to use CSS pseudo elements instead of the `content` attribute.

    + + +
    + +
    + +

    Tabbing to offscreen anchor

    +
    +
    + + \ No newline at end of file diff --git a/node_modules/@zachleat/heading-anchors/heading-anchors.js b/node_modules/@zachleat/heading-anchors/heading-anchors.js new file mode 100644 index 0000000..4f007cf --- /dev/null +++ b/node_modules/@zachleat/heading-anchors/heading-anchors.js @@ -0,0 +1,231 @@ +// Thank you to https://github.com/daviddarnes/heading-anchors +// Thank you to https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/ + +let globalInstanceIndex = 0; + +class HeadingAnchors extends HTMLElement { + static register(tagName = "heading-anchors", registry = window.customElements) { + if(registry && !registry.get(tagName)) { + registry.define(tagName, this); + } + } + + static attributes = { + exclude: "data-ha-exclude", + prefix: "prefix", + content: "content", + } + + static classes = { + anchor: "ha", + placeholder: "ha-placeholder", + srOnly: "ha-visualhide", + } + + static defaultSelector = "h2,h3,h4,h5,h6"; + + static css = ` +.${HeadingAnchors.classes.srOnly} { + clip: rect(0 0 0 0); + height: 1px; + overflow: hidden; + position: absolute; + width: 1px; +} +.${HeadingAnchors.classes.anchor} { + position: absolute; + left: var(--ha_offsetx); + top: var(--ha_offsety); + text-decoration: none; + opacity: 0; +} +.${HeadingAnchors.classes.placeholder} { + opacity: .3; +} +.${HeadingAnchors.classes.anchor}:is(:focus-within, :hover) { + opacity: 1; +} +.${HeadingAnchors.classes.anchor}, +.${HeadingAnchors.classes.placeholder} { + display: inline-block; + padding: 0 .25em; + + /* Disable selection of visually hidden label */ + -webkit-user-select: none; + user-select: none; +} + +@supports (anchor-name: none) { + .${HeadingAnchors.classes.anchor} { + position: absolute; + left: anchor(left); + top: anchor(top); + } +}`; + + get supports() { + return "replaceSync" in CSSStyleSheet.prototype; + } + + get supportsAnchorPosition() { + return CSS.supports("anchor-name: none"); + } + + constructor() { + super(); + + if(!this.supports) { + return; + } + + let sheet = new CSSStyleSheet(); + sheet.replaceSync(HeadingAnchors.css); + document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]; + + this.headingStyles = {}; + this.instanceIndex = globalInstanceIndex++; + } + + connectedCallback() { + if (!this.supports) { + return; + } + + this.headings.forEach((heading, index) => { + if(!heading.hasAttribute(HeadingAnchors.attributes.exclude)) { + let anchor = this.getAnchorElement(heading); + let placeholder = this.getPlaceholderElement(); + + // Prefers anchor position approach for better accessibility + // https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/ + if(this.supportsAnchorPosition) { + let anchorName = `--ha_${this.instanceIndex}_${index}`; + placeholder.style.setProperty("anchor-name", anchorName); + anchor.style.positionAnchor = anchorName; + } + + heading.appendChild(placeholder); + heading.after(anchor); + } + }); + } + + // Polyfill-only + positionAnchorFromPlaceholder(placeholder) { + if(!placeholder) { + return; + } + + let heading = placeholder.closest("h1,h2,h3,h4,h5,h6"); + if(!heading.nextElementSibling) { + return; + } + + // TODO next element could be more defensive + this.positionAnchor(heading.nextElementSibling); + } + + // Polyfill-only + positionAnchor(anchor) { + if(!anchor || !anchor.previousElementSibling) { + return; + } + + // TODO previous element could be more defensive + let heading = anchor.previousElementSibling; + this.setFontProp(heading, anchor); + + if(this.supportsAnchorPosition) { + // quit early + return; + } + + let placeholder = heading.querySelector(`.${HeadingAnchors.classes.placeholder}`); + if(placeholder) { + anchor.style.setProperty("--ha_offsetx", `${placeholder.offsetLeft}px`); + anchor.style.setProperty("--ha_offsety", `${placeholder.offsetTop}px`); + } + } + + setFontProp(heading, anchor) { + let placeholder = heading.querySelector(`.${HeadingAnchors.classes.placeholder}`); + if(placeholder) { + let style = getComputedStyle(placeholder); + let props = ["font-weight", "font-size", "line-height", "font-family"]; + let [weight, size, lh, family] = props.map(name => style.getPropertyValue(name)); + anchor.style.setProperty("font", `${weight} ${size}/${lh} ${family}`); + let vars = style.getPropertyValue("font-variation-settings"); + if(vars) { + anchor.style.setProperty("font-variation-settings", vars); + } + } + } + + getAccessibleTextPrefix() { + // Useful for i18n + return this.getAttribute(HeadingAnchors.attributes.prefix) || "Jump to section titled"; + } + + getContent() { + if(this.hasAttribute(HeadingAnchors.attributes.content)) { + return this.getAttribute(HeadingAnchors.attributes.content); + } + return "#"; + } + + // Placeholder nests inside of heading + getPlaceholderElement() { + let ph = document.createElement("span"); + ph.setAttribute("aria-hidden", true); + ph.classList.add(HeadingAnchors.classes.placeholder); + let content = this.getContent(); + if(content) { + ph.textContent = content; + } + + ph.addEventListener("mouseover", (e) => { + let placeholder = e.target.closest(`.${HeadingAnchors.classes.placeholder}`); + if(placeholder) { + this.positionAnchorFromPlaceholder(placeholder); + } + }); + + return ph; + } + + getAnchorElement(heading) { + let anchor = document.createElement("a"); + anchor.href = `#${heading.id}`; + anchor.classList.add(HeadingAnchors.classes.anchor); + + let content = this.getContent(); + anchor.innerHTML = `${this.getAccessibleTextPrefix()}: ${heading.textContent}${content ? `` : ""}`; + + anchor.addEventListener("focus", e => { + let anchor = e.target.closest(`.${HeadingAnchors.classes.anchor}`); + if(anchor) { + this.positionAnchor(anchor); + } + }); + + anchor.addEventListener("mouseover", (e) => { + // when CSS anchor positioning is supported, this is only used to set the font + let anchor = e.target.closest(`.${HeadingAnchors.classes.anchor}`); + this.positionAnchor(anchor); + }); + + return anchor; + } + + get headings() { + return this.querySelectorAll(this.selector.split(",").map(entry => `${entry.trim()}[id]`)); + } + + get selector() { + return this.getAttribute("selector") || HeadingAnchors.defaultSelector; + } +} + +HeadingAnchors.register(); + +export { HeadingAnchors } diff --git a/node_modules/@zachleat/heading-anchors/package.json b/node_modules/@zachleat/heading-anchors/package.json new file mode 100644 index 0000000..c626357 --- /dev/null +++ b/node_modules/@zachleat/heading-anchors/package.json @@ -0,0 +1,29 @@ +{ + "name": "@zachleat/heading-anchors", + "version": "1.0.5", + "description": "Adds and positions sibling anchor links for heading elements (h1,h2,h3,h4,h5,h6) when they have an `id` attribute.", + "main": "heading-anchors.js", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/zachleat/heading-anchors.git" + }, + "bugs": { + "url": "https://github.com/zachleat/heading-anchors/issues" + }, + "homepage": "https://github.com/zachleat/heading-anchors#readme", + "author": { + "name": "Zach Leatherman", + "email": "zachleatherman@gmail.com", + "url": "https://zachleat.com/" + }, + "scripts": { + "demo": "npx http-server ." + }, + "license": "MIT", + "devDependencies": { + "http-server": "^14.1.1" + } +} diff --git a/node_modules/a-sync-waterfall/LICENSE b/node_modules/a-sync-waterfall/LICENSE new file mode 100644 index 0000000..e684cdb --- /dev/null +++ b/node_modules/a-sync-waterfall/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Elan Shanker + +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/a-sync-waterfall/README.md b/node_modules/a-sync-waterfall/README.md new file mode 100644 index 0000000..e3d5afe --- /dev/null +++ b/node_modules/a-sync-waterfall/README.md @@ -0,0 +1,95 @@ +# a-sync-waterfall + +Simple, isolated sync/async waterfall module for JavaScript. + +Runs an array of functions in series, each passing their results to the next in +the array. However, if any of the functions pass an error to the callback, the +next function is not executed and the main callback is immediately called with +the error. + +For browsers and node.js. + +## Installation +* Just include a-sync-waterfall before your scripts. +* `npm install a-sync-waterfall` if you’re using node.js. + + +## Usage + +* `waterfall(tasks, optionalCallback, forceAsync);` +* **tasks** - An array of functions to run, each function is passed a +`callback(err, result1, result2, ...)` it must call on completion. The first +argument is an error (which can be null) and any further arguments will be +passed as arguments in order to the next task. +* **optionalCallback** - An optional callback to run once all the functions have +completed. This will be passed the results of the last task's callback. +* **forceAsync** An optional flag that force tasks run asynchronously even if they are sync. + +##### Node.js: + +```javascript +var waterfall = require('a-sync-waterfall'); +waterfall(tasks, callback); +``` + +##### Browser: + +```javascript +var waterfall = require('a-sync-waterfall'); +waterfall(tasks, callback); + +// Default: +window.waterfall(tasks, callback); +``` + +##### Tasks as Array of Functions + +```javascript +waterfall([ + function(callback){ + callback(null, 'one', 'two'); + }, + function(arg1, arg2, callback){ + callback(null, 'three'); + }, + function(arg1, callback){ + // arg1 now equals 'three' + callback(null, 'done'); + } +], function (err, result) { + // result now equals 'done' +}); +``` + +##### Derive Tasks from an Array.map + +```javascript +/* basic - no arguments */ +waterfall(myArray.map(function (arrayItem) { + return function (nextCallback) { + // same execution for each item, call the next one when done + doAsyncThingsWith(arrayItem, nextCallback); +}})); + +/* with arguments, initializer function, and final callback */ +waterfall([function initializer (firstMapFunction) { + firstMapFunction(null, initialValue); + }].concat(myArray.map(function (arrayItem) { + return function (lastItemResult, nextCallback) { + // same execution for each item in the array + var itemResult = doThingsWith(arrayItem, lastItemResult); + // results carried along from each to the next + nextCallback(null, itemResult); +}})), function (err, finalResult) { + // final callback +}); +``` + +## Acknowledgements +Hat tip to [Caolan McMahon](https://github.com/caolan) and +[Paul Miller](https://github.com/paulmillr), whose prior contributions this is +based upon. +Also [Elan Shanker](https://github.com/es128) from which this rep is forked + +## License +[MIT](https://raw.github.com/hydiak/a-sync-waterfall/master/LICENSE) diff --git a/node_modules/a-sync-waterfall/index.js b/node_modules/a-sync-waterfall/index.js new file mode 100644 index 0000000..5671213 --- /dev/null +++ b/node_modules/a-sync-waterfall/index.js @@ -0,0 +1,83 @@ +// MIT license (by Elan Shanker). +(function(globals) { + 'use strict'; + + var executeSync = function(){ + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'function'){ + args[0].apply(null, args.splice(1)); + } + }; + + var executeAsync = function(fn){ + if (typeof setImmediate === 'function') { + setImmediate(fn); + } else if (typeof process !== 'undefined' && process.nextTick) { + process.nextTick(fn); + } else { + setTimeout(fn, 0); + } + }; + + var makeIterator = function (tasks) { + var makeCallback = function (index) { + var fn = function () { + if (tasks.length) { + tasks[index].apply(null, arguments); + } + return fn.next(); + }; + fn.next = function () { + return (index < tasks.length - 1) ? makeCallback(index + 1): null; + }; + return fn; + }; + return makeCallback(0); + }; + + var _isArray = Array.isArray || function(maybeArray){ + return Object.prototype.toString.call(maybeArray) === '[object Array]'; + }; + + var waterfall = function (tasks, callback, forceAsync) { + var nextTick = forceAsync ? executeAsync : executeSync; + callback = callback || function () {}; + if (!_isArray(tasks)) { + var err = new Error('First argument to waterfall must be an array of functions'); + return callback(err); + } + if (!tasks.length) { + return callback(); + } + var wrapIterator = function (iterator) { + return function (err) { + if (err) { + callback.apply(null, arguments); + callback = function () {}; + } else { + var args = Array.prototype.slice.call(arguments, 1); + var next = iterator.next(); + if (next) { + args.push(wrapIterator(next)); + } else { + args.push(callback); + } + nextTick(function () { + iterator.apply(null, args); + }); + } + }; + }; + wrapIterator(makeIterator(tasks))(); + }; + + if (typeof define !== 'undefined' && define.amd) { + define([], function () { + return waterfall; + }); // RequireJS + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = waterfall; // CommonJS + } else { + globals.waterfall = waterfall; // +``` + +## Use + +```js +import {basicFilter, extendedFilter, lookup} from 'bcp-47-match' + +const tags = ['en-GB', 'de-CH', 'en', 'de'] + +console.log(basicFilter(tags, '*')) // => [ 'en-GB', 'de-CH', 'en', 'de' ] +console.log(basicFilter(tags, 'en')) // => [ 'en-GB', 'en' ] +console.log(basicFilter(tags, 'en-GB')) // => [ 'en-GB' ] +console.log(basicFilter(tags, ['en-GB', 'en'])) // => [ 'en-GB', 'en' ] +console.log(basicFilter(tags, 'jp')) // => [] + +console.log(extendedFilter(tags, '*')) // => [ 'en-GB', 'de-CH', 'en', 'de' ] +console.log(extendedFilter(tags, 'en')) // => [ 'en-GB', 'en' ] +console.log(extendedFilter(tags, 'en-GB')) // => [ 'en-GB' ] +console.log(extendedFilter(tags, '*-GB')) // => [ 'en-GB' ] +console.log(extendedFilter(tags, ['en-GB', 'en'])) // => [ 'en-GB', 'en' ] +console.log(extendedFilter(tags, 'jp')) // => [] + +console.log(lookup(tags, 'en')) // => 'en' +console.log(lookup(tags, 'en-GB')) // => 'en-GB' +console.log(lookup(tags, ['en-GB', 'en'])) // => 'en-GB' +console.log(lookup(tags, ['en', 'en-GB'])) // => 'en' +console.log(lookup(tags, 'jp')) // => undefined +``` + +## API + +This package exports the identifier `basicFilter`, `extendedFilter`, and +`lookup`. +There is no default export. + +### `basicFilter(tags[, ranges='*'])` + +> 👉 **Note**: See +> [Basic Filtering spec](https://tools.ietf.org/html/rfc4647#section-3.3.1) + +Match language tags to a list of simple ranges. +Searches for matches between the first range and all tags, and continues +with further ranges. +Returns a list of matching tags in the order they matched. + +
    View matching table + +| Basic Filter | `*` | `de` | `de-CH` | `de-DE` | `de-*-DE` | `*-CH` | +| - | - | - | - | - | - | - | +| `de` | ✔︎ | ✔︎ | | | | | +| `de-CH` | ✔︎ | ✔︎ | ✔︎ | | | | +| `de-CH-1996` | ✔︎ | ✔︎ | ✔︎ | | | | +| `de-DE` | ✔︎ | ✔︎ | | ✔︎ | | | +| `de-DE-1996` | ✔︎ | ✔︎ | | ✔︎ | | | +| `de-DE-x-goethe` | ✔︎ | ✔︎ | | ✔︎ | | | +| `de-Deva` | ✔︎ | ✔︎ | | | | | +| `de-Deva-DE` | ✔︎ | ✔︎ | | | | | +| `de-Latf-DE` | ✔︎ | ✔︎ | | | | | +| `de-Latn-DE` | ✔︎ | ✔︎ | | | | | +| `de-Latn-DE-1996` | ✔︎ | ✔︎ | | | | | +| `de-x-DE` | ✔︎ | ✔︎ | | | | | +| `en` | ✔︎ | | | | | | +| `en-GB` | ✔︎ | | | | | | +| `zh` | ✔︎ | | | | | | +| `zh-Hans` | ✔︎ | | | | | | +| `zh-Hant` | ✔︎ | | | | | | + +
    + +###### Parameters + +* `tags` (`string` or `Array`) + — list of BCP 47 tags +* `ranges` (`string` or `Array`, default: `'*'`) + — list of RFC 4647 + [basic ranges][basic-range] + (aka, matching `/^(\*|[a-z]{1,8}(-[a-z0-9]{1,8})*)$/i`) + +###### Returns + +Possibly empty list of matching tags in the order they matched +(`Array`). + +### `extendedFilter(tags[, ranges='*'])` + +> 👉 **Note**: See +> [Extended Filtering spec](https://tools.ietf.org/html/rfc4647#section-3.3.2) + +Match language tags to a list of extended ranges. +Searches for matches between the first range and all tags, and continues +with further ranges. + +
    View matching table + +| Extended Filter | `*` | `de` | `de-CH` | `de-DE` | `de-*-DE` | `*-CH` | +| - | - | - | - | - | - | - | +| `de` | ✔︎ | ✔︎ | | | | | +| `de-CH` | ✔︎ | ✔︎ | ✔︎ | | | ✔︎ | +| `de-CH-1996` | ✔︎ | ✔︎ | ✔︎ | | | ✔︎ | +| `de-DE` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-DE-1996` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-DE-x-goethe` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-Deva` | ✔︎ | ✔︎ | | | | | +| `de-Deva-DE` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-Latf-DE` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-Latn-DE` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-Latn-DE-1996` | ✔︎ | ✔︎ | | ✔︎ | ✔︎ | | +| `de-x-DE` | ✔︎ | ✔︎ | | | | | +| `en` | ✔︎ | | | | | | +| `en-GB` | ✔︎ | | | | | | +| `zh` | ✔︎ | | | | | | +| `zh-Hans` | ✔︎ | | | | | | +| `zh-Hant` | ✔︎ | | | | | | + +
    + +###### Parameters + +* `tags` (`string` or `Array`) + — list of BCP 47 tags +* `ranges` (`string` or `Array`, default: `'*'`) + — list of RFC 4647 [extended ranges][extended-range] + (aka, matching `/^(\*|[a-z]{1,8})(-(\*|[a-z0-9]{1,8}))*$/i`) + +###### Returns + +Possibly empty list of matching tags in the order they matched +(`Array`). + +### `lookup(tags, ranges)` + +> 👉 **Note**: See +> [Lookup spec](https://tools.ietf.org/html/rfc4647#section-3.4) + +Find the best language tag that matches a list of ranges. +Searches for a match between the first range and all tags, and continues +with further ranges. +Returns the first match, if any. + +
    View matching table + +| Lookup | `*` | `de` | `de-CH` | `de-DE` | `de-*-DE` | `*-CH` | +| - | - | - | - | - | - | - | +| `de` | | ✔︎︎ | ✔︎︎ | ✔︎ | ✔︎ | ✔︎ | +| `de-CH` | | | ✔︎ | | | ✔︎ | +| `de-CH-1996` | | | | | | ✔︎ | +| `de-DE` | | | | ✔︎ | | ✔︎ | +| `de-DE-1996` | | | | | | ✔︎ | +| `de-DE-x-goethe` | | | | | | ✔︎ | +| `de-Deva` | | | | | | ✔︎ | +| `de-Deva-DE` | | | | | | ✔︎ | +| `de-Latf-DE` | | | | | | ✔︎ | +| `de-Latn-DE` | | | | | | ✔︎ | +| `de-Latn-DE-1996` | | | | | | ✔︎ | +| `de-x-DE` | | | | | | ✔︎ | +| `en` | | | | | | ✔︎ | +| `en-GB` | | | | | | ✔︎ | +| `zh` | | | | | | ✔︎ | +| `zh-Hans` | | | | | | ✔︎ | +| `zh-Hant` | | | | | | ✔︎ | + +
    + +###### Parameters + +* `tags` (`string` or `Array`) + — list of BCP 47 tags +* `ranges` (`string` or `Array`) + — list of RFC 4647 basic ranges (but `*` is ignored) + +###### Returns + +First matching tag in `tags`, `undefined` otherwise (`string?`). + +## Types + +This package is fully typed with [TypeScript][]. +It exports no additional types. + +## Compatibility + +This package is at least compatible with all maintained versions of Node.js. +As of now, that is Node.js 14.14+ and 16.0+. +It also works in Deno and modern browsers. + +## Security + +This package is safe. + +## Related + +* [`wooorm/bcp-47`](https://github.com/wooorm/bcp-47) + — parse and serialize BCP 47 language tags +* [`wooorm/bcp-47-normalize`](https://github.com/wooorm/bcp-47-normalize) + — normalize, canonicalize, and format BCP 47 tags +* [`wooorm/iso-3166`](https://github.com/wooorm/iso-3166) + — ISO 3166 codes +* [`wooorm/iso-639-2`](https://github.com/wooorm/iso-639-2) + — ISO 639-2 codes +* [`wooorm/iso-639-3`](https://github.com/wooorm/iso-639-3) + — ISO 639-3 codes +* [`wooorm/iso-15924`](https://github.com/wooorm/iso-15924) + — ISO 15924 codes +* [`wooorm/un-m49`](https://github.com/wooorm/un-m49) + — UN M49 codes + +## Contribute + +Yes please! +See [How to Contribute to Open Source][contribute]. + +## License + +[MIT][license] © [Titus Wormer][author] + + + +[build-badge]: https://github.com/wooorm/bcp-47-match/workflows/main/badge.svg + +[build]: https://github.com/wooorm/bcp-47-match/actions + +[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/bcp-47-match.svg + +[coverage]: https://codecov.io/github/wooorm/bcp-47-match + +[downloads-badge]: https://img.shields.io/npm/dm/bcp-47-match.svg + +[downloads]: https://www.npmjs.com/package/bcp-47-match + +[size-badge]: https://img.shields.io/bundlephobia/minzip/bcp-47-match.svg + +[size]: https://bundlephobia.com/result?p=bcp-47-match + +[npm]: https://docs.npmjs.com/cli/install + +[esmsh]: https://esm.sh + +[license]: license + +[author]: https://wooorm.com + +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[typescript]: https://www.typescriptlang.org + +[contribute]: https://opensource.guide/how-to-contribute/ + +[spec]: https://tools.ietf.org/html/bcp47 + +[match]: https://tools.ietf.org/html/rfc4647 + +[basic-range]: https://tools.ietf.org/html/rfc4647#section-2.1 + +[extended-range]: https://tools.ietf.org/html/rfc4647#section-2.2 diff --git a/node_modules/bcp-47-normalize/index.d.ts b/node_modules/bcp-47-normalize/index.d.ts new file mode 100644 index 0000000..94595c4 --- /dev/null +++ b/node_modules/bcp-47-normalize/index.d.ts @@ -0,0 +1,3 @@ +export { bcp47Normalize } from "./lib/index.js"; +export type Warning = import('bcp-47').Warning; +export type Options = import('./lib/index.js').Options; diff --git a/node_modules/bcp-47-normalize/index.js b/node_modules/bcp-47-normalize/index.js new file mode 100644 index 0000000..d72322d --- /dev/null +++ b/node_modules/bcp-47-normalize/index.js @@ -0,0 +1,6 @@ +/** + * @typedef {import('bcp-47').Warning} Warning + * @typedef {import('./lib/index.js').Options} Options + */ + +export {bcp47Normalize} from './lib/index.js' diff --git a/node_modules/bcp-47-normalize/lib/fields.d.ts b/node_modules/bcp-47-normalize/lib/fields.d.ts new file mode 100644 index 0000000..867249b --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/fields.d.ts @@ -0,0 +1,24 @@ +/** + * @typedef {'script'|'region'|'variants'} Field + * + * @typedef AddOrRemove + * @property {Field} field + * @property {string} value + * + * @typedef Change + * @property {AddOrRemove} from + * @property {AddOrRemove} to + */ +/** + * @type {Array} + */ +export const fields: Array; +export type Field = 'script' | 'region' | 'variants'; +export type AddOrRemove = { + field: Field; + value: string; +}; +export type Change = { + from: AddOrRemove; + to: AddOrRemove; +}; diff --git a/node_modules/bcp-47-normalize/lib/fields.js b/node_modules/bcp-47-normalize/lib/fields.js new file mode 100644 index 0000000..0f2c6dd --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/fields.js @@ -0,0 +1,3217 @@ +/** + * @typedef {'script'|'region'|'variants'} Field + * + * @typedef AddOrRemove + * @property {Field} field + * @property {string} value + * + * @typedef Change + * @property {AddOrRemove} from + * @property {AddOrRemove} to + */ + +/** + * @type {Array} + */ +export const fields = [ + { + from: { + field: 'script', + value: 'qaai' + }, + to: { + field: 'script', + value: 'zinh' + } + }, + { + from: { + field: 'region', + value: 'bu' + }, + to: { + field: 'region', + value: 'mm' + } + }, + { + from: { + field: 'region', + value: 'ct' + }, + to: { + field: 'region', + value: 'ki' + } + }, + { + from: { + field: 'region', + value: 'dd' + }, + to: { + field: 'region', + value: 'de' + } + }, + { + from: { + field: 'region', + value: 'dy' + }, + to: { + field: 'region', + value: 'bj' + } + }, + { + from: { + field: 'region', + value: 'fx' + }, + to: { + field: 'region', + value: 'fr' + } + }, + { + from: { + field: 'region', + value: 'hv' + }, + to: { + field: 'region', + value: 'bf' + } + }, + { + from: { + field: 'region', + value: 'jt' + }, + to: { + field: 'region', + value: 'um' + } + }, + { + from: { + field: 'region', + value: 'mi' + }, + to: { + field: 'region', + value: 'um' + } + }, + { + from: { + field: 'region', + value: 'nh' + }, + to: { + field: 'region', + value: 'vu' + } + }, + { + from: { + field: 'region', + value: 'nq' + }, + to: { + field: 'region', + value: 'aq' + } + }, + { + from: { + field: 'region', + value: 'pu' + }, + to: { + field: 'region', + value: 'um' + } + }, + { + from: { + field: 'region', + value: 'pz' + }, + to: { + field: 'region', + value: 'pa' + } + }, + { + from: { + field: 'region', + value: 'qu' + }, + to: { + field: 'region', + value: 'eu' + } + }, + { + from: { + field: 'region', + value: 'rh' + }, + to: { + field: 'region', + value: 'zw' + } + }, + { + from: { + field: 'region', + value: 'tp' + }, + to: { + field: 'region', + value: 'tl' + } + }, + { + from: { + field: 'region', + value: 'uk' + }, + to: { + field: 'region', + value: 'gb' + } + }, + { + from: { + field: 'region', + value: 'vd' + }, + to: { + field: 'region', + value: 'vn' + } + }, + { + from: { + field: 'region', + value: 'wk' + }, + to: { + field: 'region', + value: 'um' + } + }, + { + from: { + field: 'region', + value: 'yd' + }, + to: { + field: 'region', + value: 'ye' + } + }, + { + from: { + field: 'region', + value: 'zr' + }, + to: { + field: 'region', + value: 'cd' + } + }, + { + from: { + field: 'region', + value: '230' + }, + to: { + field: 'region', + value: 'et' + } + }, + { + from: { + field: 'region', + value: '280' + }, + to: { + field: 'region', + value: 'de' + } + }, + { + from: { + field: 'region', + value: '736' + }, + to: { + field: 'region', + value: 'sd' + } + }, + { + from: { + field: 'region', + value: '886' + }, + to: { + field: 'region', + value: 'ye' + } + }, + { + from: { + field: 'region', + value: '958' + }, + to: { + field: 'region', + value: 'aa' + } + }, + { + from: { + field: 'region', + value: '020' + }, + to: { + field: 'region', + value: 'ad' + } + }, + { + from: { + field: 'region', + value: '784' + }, + to: { + field: 'region', + value: 'ae' + } + }, + { + from: { + field: 'region', + value: '004' + }, + to: { + field: 'region', + value: 'af' + } + }, + { + from: { + field: 'region', + value: '028' + }, + to: { + field: 'region', + value: 'ag' + } + }, + { + from: { + field: 'region', + value: '660' + }, + to: { + field: 'region', + value: 'ai' + } + }, + { + from: { + field: 'region', + value: '008' + }, + to: { + field: 'region', + value: 'al' + } + }, + { + from: { + field: 'region', + value: '051' + }, + to: { + field: 'region', + value: 'am' + } + }, + { + from: { + field: 'region', + value: '024' + }, + to: { + field: 'region', + value: 'ao' + } + }, + { + from: { + field: 'region', + value: '010' + }, + to: { + field: 'region', + value: 'aq' + } + }, + { + from: { + field: 'region', + value: '032' + }, + to: { + field: 'region', + value: 'ar' + } + }, + { + from: { + field: 'region', + value: '016' + }, + to: { + field: 'region', + value: 'as' + } + }, + { + from: { + field: 'region', + value: '040' + }, + to: { + field: 'region', + value: 'at' + } + }, + { + from: { + field: 'region', + value: '036' + }, + to: { + field: 'region', + value: 'au' + } + }, + { + from: { + field: 'region', + value: '533' + }, + to: { + field: 'region', + value: 'aw' + } + }, + { + from: { + field: 'region', + value: '248' + }, + to: { + field: 'region', + value: 'ax' + } + }, + { + from: { + field: 'region', + value: '031' + }, + to: { + field: 'region', + value: 'az' + } + }, + { + from: { + field: 'region', + value: '070' + }, + to: { + field: 'region', + value: 'ba' + } + }, + { + from: { + field: 'region', + value: '052' + }, + to: { + field: 'region', + value: 'bb' + } + }, + { + from: { + field: 'region', + value: '050' + }, + to: { + field: 'region', + value: 'bd' + } + }, + { + from: { + field: 'region', + value: '056' + }, + to: { + field: 'region', + value: 'be' + } + }, + { + from: { + field: 'region', + value: '854' + }, + to: { + field: 'region', + value: 'bf' + } + }, + { + from: { + field: 'region', + value: '100' + }, + to: { + field: 'region', + value: 'bg' + } + }, + { + from: { + field: 'region', + value: '048' + }, + to: { + field: 'region', + value: 'bh' + } + }, + { + from: { + field: 'region', + value: '108' + }, + to: { + field: 'region', + value: 'bi' + } + }, + { + from: { + field: 'region', + value: '204' + }, + to: { + field: 'region', + value: 'bj' + } + }, + { + from: { + field: 'region', + value: '652' + }, + to: { + field: 'region', + value: 'bl' + } + }, + { + from: { + field: 'region', + value: '060' + }, + to: { + field: 'region', + value: 'bm' + } + }, + { + from: { + field: 'region', + value: '096' + }, + to: { + field: 'region', + value: 'bn' + } + }, + { + from: { + field: 'region', + value: '068' + }, + to: { + field: 'region', + value: 'bo' + } + }, + { + from: { + field: 'region', + value: '535' + }, + to: { + field: 'region', + value: 'bq' + } + }, + { + from: { + field: 'region', + value: '076' + }, + to: { + field: 'region', + value: 'br' + } + }, + { + from: { + field: 'region', + value: '044' + }, + to: { + field: 'region', + value: 'bs' + } + }, + { + from: { + field: 'region', + value: '064' + }, + to: { + field: 'region', + value: 'bt' + } + }, + { + from: { + field: 'region', + value: '104' + }, + to: { + field: 'region', + value: 'mm' + } + }, + { + from: { + field: 'region', + value: '074' + }, + to: { + field: 'region', + value: 'bv' + } + }, + { + from: { + field: 'region', + value: '072' + }, + to: { + field: 'region', + value: 'bw' + } + }, + { + from: { + field: 'region', + value: '112' + }, + to: { + field: 'region', + value: 'by' + } + }, + { + from: { + field: 'region', + value: '084' + }, + to: { + field: 'region', + value: 'bz' + } + }, + { + from: { + field: 'region', + value: '124' + }, + to: { + field: 'region', + value: 'ca' + } + }, + { + from: { + field: 'region', + value: '166' + }, + to: { + field: 'region', + value: 'cc' + } + }, + { + from: { + field: 'region', + value: '180' + }, + to: { + field: 'region', + value: 'cd' + } + }, + { + from: { + field: 'region', + value: '140' + }, + to: { + field: 'region', + value: 'cf' + } + }, + { + from: { + field: 'region', + value: '178' + }, + to: { + field: 'region', + value: 'cg' + } + }, + { + from: { + field: 'region', + value: '756' + }, + to: { + field: 'region', + value: 'ch' + } + }, + { + from: { + field: 'region', + value: '384' + }, + to: { + field: 'region', + value: 'ci' + } + }, + { + from: { + field: 'region', + value: '184' + }, + to: { + field: 'region', + value: 'ck' + } + }, + { + from: { + field: 'region', + value: '152' + }, + to: { + field: 'region', + value: 'cl' + } + }, + { + from: { + field: 'region', + value: '120' + }, + to: { + field: 'region', + value: 'cm' + } + }, + { + from: { + field: 'region', + value: '156' + }, + to: { + field: 'region', + value: 'cn' + } + }, + { + from: { + field: 'region', + value: '170' + }, + to: { + field: 'region', + value: 'co' + } + }, + { + from: { + field: 'region', + value: '188' + }, + to: { + field: 'region', + value: 'cr' + } + }, + { + from: { + field: 'region', + value: '192' + }, + to: { + field: 'region', + value: 'cu' + } + }, + { + from: { + field: 'region', + value: '132' + }, + to: { + field: 'region', + value: 'cv' + } + }, + { + from: { + field: 'region', + value: '531' + }, + to: { + field: 'region', + value: 'cw' + } + }, + { + from: { + field: 'region', + value: '162' + }, + to: { + field: 'region', + value: 'cx' + } + }, + { + from: { + field: 'region', + value: '196' + }, + to: { + field: 'region', + value: 'cy' + } + }, + { + from: { + field: 'region', + value: '203' + }, + to: { + field: 'region', + value: 'cz' + } + }, + { + from: { + field: 'region', + value: '278' + }, + to: { + field: 'region', + value: 'de' + } + }, + { + from: { + field: 'region', + value: '276' + }, + to: { + field: 'region', + value: 'de' + } + }, + { + from: { + field: 'region', + value: '262' + }, + to: { + field: 'region', + value: 'dj' + } + }, + { + from: { + field: 'region', + value: '208' + }, + to: { + field: 'region', + value: 'dk' + } + }, + { + from: { + field: 'region', + value: '212' + }, + to: { + field: 'region', + value: 'dm' + } + }, + { + from: { + field: 'region', + value: '214' + }, + to: { + field: 'region', + value: 'do' + } + }, + { + from: { + field: 'region', + value: '012' + }, + to: { + field: 'region', + value: 'dz' + } + }, + { + from: { + field: 'region', + value: '218' + }, + to: { + field: 'region', + value: 'ec' + } + }, + { + from: { + field: 'region', + value: '233' + }, + to: { + field: 'region', + value: 'ee' + } + }, + { + from: { + field: 'region', + value: '818' + }, + to: { + field: 'region', + value: 'eg' + } + }, + { + from: { + field: 'region', + value: '732' + }, + to: { + field: 'region', + value: 'eh' + } + }, + { + from: { + field: 'region', + value: '232' + }, + to: { + field: 'region', + value: 'er' + } + }, + { + from: { + field: 'region', + value: '724' + }, + to: { + field: 'region', + value: 'es' + } + }, + { + from: { + field: 'region', + value: '231' + }, + to: { + field: 'region', + value: 'et' + } + }, + { + from: { + field: 'region', + value: '246' + }, + to: { + field: 'region', + value: 'fi' + } + }, + { + from: { + field: 'region', + value: '242' + }, + to: { + field: 'region', + value: 'fj' + } + }, + { + from: { + field: 'region', + value: '238' + }, + to: { + field: 'region', + value: 'fk' + } + }, + { + from: { + field: 'region', + value: '583' + }, + to: { + field: 'region', + value: 'fm' + } + }, + { + from: { + field: 'region', + value: '234' + }, + to: { + field: 'region', + value: 'fo' + } + }, + { + from: { + field: 'region', + value: '250' + }, + to: { + field: 'region', + value: 'fr' + } + }, + { + from: { + field: 'region', + value: '249' + }, + to: { + field: 'region', + value: 'fr' + } + }, + { + from: { + field: 'region', + value: '266' + }, + to: { + field: 'region', + value: 'ga' + } + }, + { + from: { + field: 'region', + value: '826' + }, + to: { + field: 'region', + value: 'gb' + } + }, + { + from: { + field: 'region', + value: '308' + }, + to: { + field: 'region', + value: 'gd' + } + }, + { + from: { + field: 'region', + value: '268' + }, + to: { + field: 'region', + value: 'ge' + } + }, + { + from: { + field: 'region', + value: '254' + }, + to: { + field: 'region', + value: 'gf' + } + }, + { + from: { + field: 'region', + value: '831' + }, + to: { + field: 'region', + value: 'gg' + } + }, + { + from: { + field: 'region', + value: '288' + }, + to: { + field: 'region', + value: 'gh' + } + }, + { + from: { + field: 'region', + value: '292' + }, + to: { + field: 'region', + value: 'gi' + } + }, + { + from: { + field: 'region', + value: '304' + }, + to: { + field: 'region', + value: 'gl' + } + }, + { + from: { + field: 'region', + value: '270' + }, + to: { + field: 'region', + value: 'gm' + } + }, + { + from: { + field: 'region', + value: '324' + }, + to: { + field: 'region', + value: 'gn' + } + }, + { + from: { + field: 'region', + value: '312' + }, + to: { + field: 'region', + value: 'gp' + } + }, + { + from: { + field: 'region', + value: '226' + }, + to: { + field: 'region', + value: 'gq' + } + }, + { + from: { + field: 'region', + value: '300' + }, + to: { + field: 'region', + value: 'gr' + } + }, + { + from: { + field: 'region', + value: '239' + }, + to: { + field: 'region', + value: 'gs' + } + }, + { + from: { + field: 'region', + value: '320' + }, + to: { + field: 'region', + value: 'gt' + } + }, + { + from: { + field: 'region', + value: '316' + }, + to: { + field: 'region', + value: 'gu' + } + }, + { + from: { + field: 'region', + value: '624' + }, + to: { + field: 'region', + value: 'gw' + } + }, + { + from: { + field: 'region', + value: '328' + }, + to: { + field: 'region', + value: 'gy' + } + }, + { + from: { + field: 'region', + value: '344' + }, + to: { + field: 'region', + value: 'hk' + } + }, + { + from: { + field: 'region', + value: '334' + }, + to: { + field: 'region', + value: 'hm' + } + }, + { + from: { + field: 'region', + value: '340' + }, + to: { + field: 'region', + value: 'hn' + } + }, + { + from: { + field: 'region', + value: '191' + }, + to: { + field: 'region', + value: 'hr' + } + }, + { + from: { + field: 'region', + value: '332' + }, + to: { + field: 'region', + value: 'ht' + } + }, + { + from: { + field: 'region', + value: '348' + }, + to: { + field: 'region', + value: 'hu' + } + }, + { + from: { + field: 'region', + value: '360' + }, + to: { + field: 'region', + value: 'id' + } + }, + { + from: { + field: 'region', + value: '372' + }, + to: { + field: 'region', + value: 'ie' + } + }, + { + from: { + field: 'region', + value: '376' + }, + to: { + field: 'region', + value: 'il' + } + }, + { + from: { + field: 'region', + value: '833' + }, + to: { + field: 'region', + value: 'im' + } + }, + { + from: { + field: 'region', + value: '356' + }, + to: { + field: 'region', + value: 'in' + } + }, + { + from: { + field: 'region', + value: '086' + }, + to: { + field: 'region', + value: 'io' + } + }, + { + from: { + field: 'region', + value: '368' + }, + to: { + field: 'region', + value: 'iq' + } + }, + { + from: { + field: 'region', + value: '364' + }, + to: { + field: 'region', + value: 'ir' + } + }, + { + from: { + field: 'region', + value: '352' + }, + to: { + field: 'region', + value: 'is' + } + }, + { + from: { + field: 'region', + value: '380' + }, + to: { + field: 'region', + value: 'it' + } + }, + { + from: { + field: 'region', + value: '832' + }, + to: { + field: 'region', + value: 'je' + } + }, + { + from: { + field: 'region', + value: '388' + }, + to: { + field: 'region', + value: 'jm' + } + }, + { + from: { + field: 'region', + value: '400' + }, + to: { + field: 'region', + value: 'jo' + } + }, + { + from: { + field: 'region', + value: '392' + }, + to: { + field: 'region', + value: 'jp' + } + }, + { + from: { + field: 'region', + value: '404' + }, + to: { + field: 'region', + value: 'ke' + } + }, + { + from: { + field: 'region', + value: '417' + }, + to: { + field: 'region', + value: 'kg' + } + }, + { + from: { + field: 'region', + value: '116' + }, + to: { + field: 'region', + value: 'kh' + } + }, + { + from: { + field: 'region', + value: '296' + }, + to: { + field: 'region', + value: 'ki' + } + }, + { + from: { + field: 'region', + value: '174' + }, + to: { + field: 'region', + value: 'km' + } + }, + { + from: { + field: 'region', + value: '659' + }, + to: { + field: 'region', + value: 'kn' + } + }, + { + from: { + field: 'region', + value: '408' + }, + to: { + field: 'region', + value: 'kp' + } + }, + { + from: { + field: 'region', + value: '410' + }, + to: { + field: 'region', + value: 'kr' + } + }, + { + from: { + field: 'region', + value: '414' + }, + to: { + field: 'region', + value: 'kw' + } + }, + { + from: { + field: 'region', + value: '136' + }, + to: { + field: 'region', + value: 'ky' + } + }, + { + from: { + field: 'region', + value: '398' + }, + to: { + field: 'region', + value: 'kz' + } + }, + { + from: { + field: 'region', + value: '418' + }, + to: { + field: 'region', + value: 'la' + } + }, + { + from: { + field: 'region', + value: '422' + }, + to: { + field: 'region', + value: 'lb' + } + }, + { + from: { + field: 'region', + value: '662' + }, + to: { + field: 'region', + value: 'lc' + } + }, + { + from: { + field: 'region', + value: '438' + }, + to: { + field: 'region', + value: 'li' + } + }, + { + from: { + field: 'region', + value: '144' + }, + to: { + field: 'region', + value: 'lk' + } + }, + { + from: { + field: 'region', + value: '430' + }, + to: { + field: 'region', + value: 'lr' + } + }, + { + from: { + field: 'region', + value: '426' + }, + to: { + field: 'region', + value: 'ls' + } + }, + { + from: { + field: 'region', + value: '440' + }, + to: { + field: 'region', + value: 'lt' + } + }, + { + from: { + field: 'region', + value: '442' + }, + to: { + field: 'region', + value: 'lu' + } + }, + { + from: { + field: 'region', + value: '428' + }, + to: { + field: 'region', + value: 'lv' + } + }, + { + from: { + field: 'region', + value: '434' + }, + to: { + field: 'region', + value: 'ly' + } + }, + { + from: { + field: 'region', + value: '504' + }, + to: { + field: 'region', + value: 'ma' + } + }, + { + from: { + field: 'region', + value: '492' + }, + to: { + field: 'region', + value: 'mc' + } + }, + { + from: { + field: 'region', + value: '498' + }, + to: { + field: 'region', + value: 'md' + } + }, + { + from: { + field: 'region', + value: '499' + }, + to: { + field: 'region', + value: 'me' + } + }, + { + from: { + field: 'region', + value: '663' + }, + to: { + field: 'region', + value: 'mf' + } + }, + { + from: { + field: 'region', + value: '450' + }, + to: { + field: 'region', + value: 'mg' + } + }, + { + from: { + field: 'region', + value: '584' + }, + to: { + field: 'region', + value: 'mh' + } + }, + { + from: { + field: 'region', + value: '807' + }, + to: { + field: 'region', + value: 'mk' + } + }, + { + from: { + field: 'region', + value: '466' + }, + to: { + field: 'region', + value: 'ml' + } + }, + { + from: { + field: 'region', + value: '496' + }, + to: { + field: 'region', + value: 'mn' + } + }, + { + from: { + field: 'region', + value: '446' + }, + to: { + field: 'region', + value: 'mo' + } + }, + { + from: { + field: 'region', + value: '580' + }, + to: { + field: 'region', + value: 'mp' + } + }, + { + from: { + field: 'region', + value: '474' + }, + to: { + field: 'region', + value: 'mq' + } + }, + { + from: { + field: 'region', + value: '478' + }, + to: { + field: 'region', + value: 'mr' + } + }, + { + from: { + field: 'region', + value: '500' + }, + to: { + field: 'region', + value: 'ms' + } + }, + { + from: { + field: 'region', + value: '470' + }, + to: { + field: 'region', + value: 'mt' + } + }, + { + from: { + field: 'region', + value: '480' + }, + to: { + field: 'region', + value: 'mu' + } + }, + { + from: { + field: 'region', + value: '462' + }, + to: { + field: 'region', + value: 'mv' + } + }, + { + from: { + field: 'region', + value: '454' + }, + to: { + field: 'region', + value: 'mw' + } + }, + { + from: { + field: 'region', + value: '484' + }, + to: { + field: 'region', + value: 'mx' + } + }, + { + from: { + field: 'region', + value: '458' + }, + to: { + field: 'region', + value: 'my' + } + }, + { + from: { + field: 'region', + value: '508' + }, + to: { + field: 'region', + value: 'mz' + } + }, + { + from: { + field: 'region', + value: '516' + }, + to: { + field: 'region', + value: 'na' + } + }, + { + from: { + field: 'region', + value: '540' + }, + to: { + field: 'region', + value: 'nc' + } + }, + { + from: { + field: 'region', + value: '562' + }, + to: { + field: 'region', + value: 'ne' + } + }, + { + from: { + field: 'region', + value: '574' + }, + to: { + field: 'region', + value: 'nf' + } + }, + { + from: { + field: 'region', + value: '566' + }, + to: { + field: 'region', + value: 'ng' + } + }, + { + from: { + field: 'region', + value: '558' + }, + to: { + field: 'region', + value: 'ni' + } + }, + { + from: { + field: 'region', + value: '528' + }, + to: { + field: 'region', + value: 'nl' + } + }, + { + from: { + field: 'region', + value: '578' + }, + to: { + field: 'region', + value: 'no' + } + }, + { + from: { + field: 'region', + value: '524' + }, + to: { + field: 'region', + value: 'np' + } + }, + { + from: { + field: 'region', + value: '520' + }, + to: { + field: 'region', + value: 'nr' + } + }, + { + from: { + field: 'region', + value: '570' + }, + to: { + field: 'region', + value: 'nu' + } + }, + { + from: { + field: 'region', + value: '554' + }, + to: { + field: 'region', + value: 'nz' + } + }, + { + from: { + field: 'region', + value: '512' + }, + to: { + field: 'region', + value: 'om' + } + }, + { + from: { + field: 'region', + value: '591' + }, + to: { + field: 'region', + value: 'pa' + } + }, + { + from: { + field: 'region', + value: '604' + }, + to: { + field: 'region', + value: 'pe' + } + }, + { + from: { + field: 'region', + value: '258' + }, + to: { + field: 'region', + value: 'pf' + } + }, + { + from: { + field: 'region', + value: '598' + }, + to: { + field: 'region', + value: 'pg' + } + }, + { + from: { + field: 'region', + value: '608' + }, + to: { + field: 'region', + value: 'ph' + } + }, + { + from: { + field: 'region', + value: '586' + }, + to: { + field: 'region', + value: 'pk' + } + }, + { + from: { + field: 'region', + value: '616' + }, + to: { + field: 'region', + value: 'pl' + } + }, + { + from: { + field: 'region', + value: '666' + }, + to: { + field: 'region', + value: 'pm' + } + }, + { + from: { + field: 'region', + value: '612' + }, + to: { + field: 'region', + value: 'pn' + } + }, + { + from: { + field: 'region', + value: '630' + }, + to: { + field: 'region', + value: 'pr' + } + }, + { + from: { + field: 'region', + value: '275' + }, + to: { + field: 'region', + value: 'ps' + } + }, + { + from: { + field: 'region', + value: '620' + }, + to: { + field: 'region', + value: 'pt' + } + }, + { + from: { + field: 'region', + value: '585' + }, + to: { + field: 'region', + value: 'pw' + } + }, + { + from: { + field: 'region', + value: '600' + }, + to: { + field: 'region', + value: 'py' + } + }, + { + from: { + field: 'region', + value: '634' + }, + to: { + field: 'region', + value: 'qa' + } + }, + { + from: { + field: 'region', + value: '959' + }, + to: { + field: 'region', + value: 'qm' + } + }, + { + from: { + field: 'region', + value: '960' + }, + to: { + field: 'region', + value: 'qn' + } + }, + { + from: { + field: 'region', + value: '962' + }, + to: { + field: 'region', + value: 'qp' + } + }, + { + from: { + field: 'region', + value: '963' + }, + to: { + field: 'region', + value: 'qq' + } + }, + { + from: { + field: 'region', + value: '964' + }, + to: { + field: 'region', + value: 'qr' + } + }, + { + from: { + field: 'region', + value: '965' + }, + to: { + field: 'region', + value: 'qs' + } + }, + { + from: { + field: 'region', + value: '966' + }, + to: { + field: 'region', + value: 'qt' + } + }, + { + from: { + field: 'region', + value: '967' + }, + to: { + field: 'region', + value: 'eu' + } + }, + { + from: { + field: 'region', + value: '968' + }, + to: { + field: 'region', + value: 'qv' + } + }, + { + from: { + field: 'region', + value: '969' + }, + to: { + field: 'region', + value: 'qw' + } + }, + { + from: { + field: 'region', + value: '970' + }, + to: { + field: 'region', + value: 'qx' + } + }, + { + from: { + field: 'region', + value: '971' + }, + to: { + field: 'region', + value: 'qy' + } + }, + { + from: { + field: 'region', + value: '972' + }, + to: { + field: 'region', + value: 'qz' + } + }, + { + from: { + field: 'region', + value: '638' + }, + to: { + field: 'region', + value: 're' + } + }, + { + from: { + field: 'region', + value: '642' + }, + to: { + field: 'region', + value: 'ro' + } + }, + { + from: { + field: 'region', + value: '688' + }, + to: { + field: 'region', + value: 'rs' + } + }, + { + from: { + field: 'region', + value: '643' + }, + to: { + field: 'region', + value: 'ru' + } + }, + { + from: { + field: 'region', + value: '646' + }, + to: { + field: 'region', + value: 'rw' + } + }, + { + from: { + field: 'region', + value: '682' + }, + to: { + field: 'region', + value: 'sa' + } + }, + { + from: { + field: 'region', + value: '090' + }, + to: { + field: 'region', + value: 'sb' + } + }, + { + from: { + field: 'region', + value: '690' + }, + to: { + field: 'region', + value: 'sc' + } + }, + { + from: { + field: 'region', + value: '729' + }, + to: { + field: 'region', + value: 'sd' + } + }, + { + from: { + field: 'region', + value: '752' + }, + to: { + field: 'region', + value: 'se' + } + }, + { + from: { + field: 'region', + value: '702' + }, + to: { + field: 'region', + value: 'sg' + } + }, + { + from: { + field: 'region', + value: '654' + }, + to: { + field: 'region', + value: 'sh' + } + }, + { + from: { + field: 'region', + value: '705' + }, + to: { + field: 'region', + value: 'si' + } + }, + { + from: { + field: 'region', + value: '744' + }, + to: { + field: 'region', + value: 'sj' + } + }, + { + from: { + field: 'region', + value: '703' + }, + to: { + field: 'region', + value: 'sk' + } + }, + { + from: { + field: 'region', + value: '694' + }, + to: { + field: 'region', + value: 'sl' + } + }, + { + from: { + field: 'region', + value: '674' + }, + to: { + field: 'region', + value: 'sm' + } + }, + { + from: { + field: 'region', + value: '686' + }, + to: { + field: 'region', + value: 'sn' + } + }, + { + from: { + field: 'region', + value: '706' + }, + to: { + field: 'region', + value: 'so' + } + }, + { + from: { + field: 'region', + value: '740' + }, + to: { + field: 'region', + value: 'sr' + } + }, + { + from: { + field: 'region', + value: '728' + }, + to: { + field: 'region', + value: 'ss' + } + }, + { + from: { + field: 'region', + value: '678' + }, + to: { + field: 'region', + value: 'st' + } + }, + { + from: { + field: 'region', + value: '222' + }, + to: { + field: 'region', + value: 'sv' + } + }, + { + from: { + field: 'region', + value: '534' + }, + to: { + field: 'region', + value: 'sx' + } + }, + { + from: { + field: 'region', + value: '760' + }, + to: { + field: 'region', + value: 'sy' + } + }, + { + from: { + field: 'region', + value: '748' + }, + to: { + field: 'region', + value: 'sz' + } + }, + { + from: { + field: 'region', + value: '796' + }, + to: { + field: 'region', + value: 'tc' + } + }, + { + from: { + field: 'region', + value: '148' + }, + to: { + field: 'region', + value: 'td' + } + }, + { + from: { + field: 'region', + value: '260' + }, + to: { + field: 'region', + value: 'tf' + } + }, + { + from: { + field: 'region', + value: '768' + }, + to: { + field: 'region', + value: 'tg' + } + }, + { + from: { + field: 'region', + value: '764' + }, + to: { + field: 'region', + value: 'th' + } + }, + { + from: { + field: 'region', + value: '762' + }, + to: { + field: 'region', + value: 'tj' + } + }, + { + from: { + field: 'region', + value: '772' + }, + to: { + field: 'region', + value: 'tk' + } + }, + { + from: { + field: 'region', + value: '626' + }, + to: { + field: 'region', + value: 'tl' + } + }, + { + from: { + field: 'region', + value: '795' + }, + to: { + field: 'region', + value: 'tm' + } + }, + { + from: { + field: 'region', + value: '788' + }, + to: { + field: 'region', + value: 'tn' + } + }, + { + from: { + field: 'region', + value: '776' + }, + to: { + field: 'region', + value: 'to' + } + }, + { + from: { + field: 'region', + value: '792' + }, + to: { + field: 'region', + value: 'tr' + } + }, + { + from: { + field: 'region', + value: '780' + }, + to: { + field: 'region', + value: 'tt' + } + }, + { + from: { + field: 'region', + value: '798' + }, + to: { + field: 'region', + value: 'tv' + } + }, + { + from: { + field: 'region', + value: '158' + }, + to: { + field: 'region', + value: 'tw' + } + }, + { + from: { + field: 'region', + value: '834' + }, + to: { + field: 'region', + value: 'tz' + } + }, + { + from: { + field: 'region', + value: '804' + }, + to: { + field: 'region', + value: 'ua' + } + }, + { + from: { + field: 'region', + value: '800' + }, + to: { + field: 'region', + value: 'ug' + } + }, + { + from: { + field: 'region', + value: '581' + }, + to: { + field: 'region', + value: 'um' + } + }, + { + from: { + field: 'region', + value: '840' + }, + to: { + field: 'region', + value: 'us' + } + }, + { + from: { + field: 'region', + value: '858' + }, + to: { + field: 'region', + value: 'uy' + } + }, + { + from: { + field: 'region', + value: '860' + }, + to: { + field: 'region', + value: 'uz' + } + }, + { + from: { + field: 'region', + value: '336' + }, + to: { + field: 'region', + value: 'va' + } + }, + { + from: { + field: 'region', + value: '670' + }, + to: { + field: 'region', + value: 'vc' + } + }, + { + from: { + field: 'region', + value: '862' + }, + to: { + field: 'region', + value: 've' + } + }, + { + from: { + field: 'region', + value: '092' + }, + to: { + field: 'region', + value: 'vg' + } + }, + { + from: { + field: 'region', + value: '850' + }, + to: { + field: 'region', + value: 'vi' + } + }, + { + from: { + field: 'region', + value: '704' + }, + to: { + field: 'region', + value: 'vn' + } + }, + { + from: { + field: 'region', + value: '548' + }, + to: { + field: 'region', + value: 'vu' + } + }, + { + from: { + field: 'region', + value: '876' + }, + to: { + field: 'region', + value: 'wf' + } + }, + { + from: { + field: 'region', + value: '882' + }, + to: { + field: 'region', + value: 'ws' + } + }, + { + from: { + field: 'region', + value: '973' + }, + to: { + field: 'region', + value: 'xa' + } + }, + { + from: { + field: 'region', + value: '974' + }, + to: { + field: 'region', + value: 'xb' + } + }, + { + from: { + field: 'region', + value: '975' + }, + to: { + field: 'region', + value: 'xc' + } + }, + { + from: { + field: 'region', + value: '976' + }, + to: { + field: 'region', + value: 'xd' + } + }, + { + from: { + field: 'region', + value: '977' + }, + to: { + field: 'region', + value: 'xe' + } + }, + { + from: { + field: 'region', + value: '978' + }, + to: { + field: 'region', + value: 'xf' + } + }, + { + from: { + field: 'region', + value: '979' + }, + to: { + field: 'region', + value: 'xg' + } + }, + { + from: { + field: 'region', + value: '980' + }, + to: { + field: 'region', + value: 'xh' + } + }, + { + from: { + field: 'region', + value: '981' + }, + to: { + field: 'region', + value: 'xi' + } + }, + { + from: { + field: 'region', + value: '982' + }, + to: { + field: 'region', + value: 'xj' + } + }, + { + from: { + field: 'region', + value: '983' + }, + to: { + field: 'region', + value: 'xk' + } + }, + { + from: { + field: 'region', + value: '984' + }, + to: { + field: 'region', + value: 'xl' + } + }, + { + from: { + field: 'region', + value: '985' + }, + to: { + field: 'region', + value: 'xm' + } + }, + { + from: { + field: 'region', + value: '986' + }, + to: { + field: 'region', + value: 'xn' + } + }, + { + from: { + field: 'region', + value: '987' + }, + to: { + field: 'region', + value: 'xo' + } + }, + { + from: { + field: 'region', + value: '988' + }, + to: { + field: 'region', + value: 'xp' + } + }, + { + from: { + field: 'region', + value: '989' + }, + to: { + field: 'region', + value: 'xq' + } + }, + { + from: { + field: 'region', + value: '990' + }, + to: { + field: 'region', + value: 'xr' + } + }, + { + from: { + field: 'region', + value: '991' + }, + to: { + field: 'region', + value: 'xs' + } + }, + { + from: { + field: 'region', + value: '992' + }, + to: { + field: 'region', + value: 'xt' + } + }, + { + from: { + field: 'region', + value: '993' + }, + to: { + field: 'region', + value: 'xu' + } + }, + { + from: { + field: 'region', + value: '994' + }, + to: { + field: 'region', + value: 'xv' + } + }, + { + from: { + field: 'region', + value: '995' + }, + to: { + field: 'region', + value: 'xw' + } + }, + { + from: { + field: 'region', + value: '996' + }, + to: { + field: 'region', + value: 'xx' + } + }, + { + from: { + field: 'region', + value: '997' + }, + to: { + field: 'region', + value: 'xy' + } + }, + { + from: { + field: 'region', + value: '998' + }, + to: { + field: 'region', + value: 'xz' + } + }, + { + from: { + field: 'region', + value: '720' + }, + to: { + field: 'region', + value: 'ye' + } + }, + { + from: { + field: 'region', + value: '887' + }, + to: { + field: 'region', + value: 'ye' + } + }, + { + from: { + field: 'region', + value: '175' + }, + to: { + field: 'region', + value: 'yt' + } + }, + { + from: { + field: 'region', + value: '710' + }, + to: { + field: 'region', + value: 'za' + } + }, + { + from: { + field: 'region', + value: '894' + }, + to: { + field: 'region', + value: 'zm' + } + }, + { + from: { + field: 'region', + value: '716' + }, + to: { + field: 'region', + value: 'zw' + } + }, + { + from: { + field: 'region', + value: '999' + }, + to: { + field: 'region', + value: 'zz' + } + }, + { + from: { + field: 'variants', + value: 'polytoni' + }, + to: { + field: 'variants', + value: 'polyton' + } + }, + { + from: { + field: 'variants', + value: 'heploc' + }, + to: { + field: 'variants', + value: 'alalc97' + } + } +] diff --git a/node_modules/bcp-47-normalize/lib/index.d.ts b/node_modules/bcp-47-normalize/lib/index.d.ts new file mode 100644 index 0000000..c1b935f --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/index.d.ts @@ -0,0 +1,36 @@ +/** + * Normalize the given BCP 47 tag according to Unicode CLDR suggestions. + * + * @param {string} tag + * BCP 47 tag. + * @param {Options} [options] + * Configuration (optional). + * @returns {string} + * Normal, canonical, and pretty BCP 47 tag. + */ +export function bcp47Normalize(tag: string, options?: Options | undefined): string; +export type Warning = import('bcp-47').Warning; +export type Schema = import('bcp-47').Schema; +export type Extension = import('bcp-47').Extension; +/** + * Configuration (optional). + */ +export type Options = { + /** + * Passed to `bcp-47` as `options.forgiving`. + */ + forgiving?: boolean; + /** + * Passed to `bcp-47` as `options.warning`. + * + * One additional warning is given: + * + * | code | reason | + * | :--- | :--------------------------------------------------------- | + * | 7 | Deprecated region `CURRENT`, expected one of `SUGGESTIONS` | + * + * This warning is only given if the region cannot be automatically fixed + * (when regions split into multiple regions). + */ + warning?: Warning; +}; diff --git a/node_modules/bcp-47-normalize/lib/index.js b/node_modules/bcp-47-normalize/lib/index.js new file mode 100644 index 0000000..3d61b7e --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/index.js @@ -0,0 +1,335 @@ +/** + * @typedef {import('bcp-47').Warning} Warning + * @typedef {import('bcp-47').Schema} Schema + * @typedef {import('bcp-47').Extension} Extension + * + * @typedef Options + * Configuration (optional). + * @property {boolean} [forgiving] + * Passed to `bcp-47` as `options.forgiving`. + * @property {Warning} [warning] + * Passed to `bcp-47` as `options.warning`. + * + * One additional warning is given: + * + * | code | reason | + * | :--- | :--------------------------------------------------------- | + * | 7 | Deprecated region `CURRENT`, expected one of `SUGGESTIONS` | + * + * This warning is only given if the region cannot be automatically fixed + * (when regions split into multiple regions). + */ + +import {parse, stringify} from 'bcp-47' +import {extendedFilter} from 'bcp-47-match' +import {matches} from './matches.js' +import {fields} from './fields.js' +import {many} from './many.js' +import {likely} from './likely.js' + +const own = {}.hasOwnProperty + +/** + * @param {Schema} base + * @param {Partial} changes + * @returns {Schema} + */ +function merge(base, changes) { + if (!base.language) base.language = changes.language + if (!base.script) base.script = changes.script + if (!base.region) base.region = changes.region + if (changes.variants) base.variants.push(...changes.variants) + + return base +} + +/** + * Mostly like: + * + * But doesn’t crash. + * + * @param {Schema} schema + * @returns {string} + */ +function addLikelySubtags(schema) { + const {language, script, region} = schema + /** @type {string|undefined} */ + let match + + if ( + script && + region && + (match = likely[stringify({language, script, region})]) + ) { + schema.script = undefined + schema.region = undefined + } else if (script && (match = likely[stringify({language, script})])) { + schema.script = undefined + } else if (region && (match = likely[stringify({language, region})])) { + schema.region = undefined + } else if (language && (match = likely[language])) { + // Empty. + } + + if (match) { + schema.language = undefined + merge(schema, parse(match)) + } + + return stringify(schema) +} + +/** + * @param {Schema} schema + */ +function removeLikelySubtags(schema) { + addLikelySubtags(schema) + + const {language, script, region} = schema + + if (!language) return schema + + const maxLocale = stringify({language, script, region}) + + if (maxLocale === addLikelySubtags(parse(language))) { + schema.script = undefined + schema.region = undefined + } else if ( + region && + maxLocale === addLikelySubtags(parse(language + '-' + region)) + ) { + schema.script = undefined + } else if ( + script && + maxLocale === addLikelySubtags(parse(language + '-' + script)) + ) { + schema.region = undefined + } + + return schema +} + +/** + * Normalize the given BCP 47 tag according to Unicode CLDR suggestions. + * + * @param {string} tag + * BCP 47 tag. + * @param {Options} [options] + * Configuration (optional). + * @returns {string} + * Normal, canonical, and pretty BCP 47 tag. + */ +export function bcp47Normalize(tag, options) { + const settings = options || {} + // 1. normalize and lowercase the tag (`sgn-be-fr` -> `sfb`). + const schema = parse(String(tag || '').toLowerCase(), settings) + const value = stringify(schema) + + if (!value) { + return value + } + + let index = -1 + + // 2. Do fancy, expensive replaces (`ha-latn-gh` -> `ha-gh`). + while (++index < matches.length) { + let from = matches[index].from + + if (from.slice(0, 4) === 'und-' && schema.language) { + from = schema.language + from.slice(3) + } + + if (extendedFilter(value, from).length > 0) { + replace(schema, from, matches[index].to) + } + } + + // 3. Do basic field replaces (`en-840` -> `en-us`). + index = -1 + + while (++index < fields.length) { + if (remove(schema, fields[index].from.field, fields[index].from.value)) { + add(schema, fields[index].to.field, fields[index].to.value) + } + } + + // 4. Minimize. + removeLikelySubtags(schema) + + // 5. Sort variants, and sort extensions on singleton. + schema.variants.sort() + schema.extensions.sort(compareSingleton) + + // 6. Warn if fields (currently only regions) should be updated but have + // multiple choices. + if (settings.warning) { + /** @type {keyof many} */ + let key + + for (key in many) { + if (own.call(many, key)) { + const map = many[key] + const value = schema[key] + if (value && own.call(map, value)) { + const replacements = map[value] + settings.warning( + 'Deprecated ' + + key + + ' `' + + value + + '`, expected one of `' + + replacements.join('`, `') + + '`', + -1, + 7 + ) + } + } + } + } + + // 7. Add proper casing back. + // Format script (ISO 15924) as titlecase (example: `Latn`): + if (schema.script) { + schema.script = + schema.script.charAt(0).toUpperCase() + schema.script.slice(1) + } + + // Format region (ISO 3166) as uppercase (note: this doesn’t affect numeric + // codes, which is fine): + if (schema.region) { + schema.region = schema.region.toUpperCase() + } + + return stringify(schema) +} + +/** + * @param {Schema} schema + * @param {string} from + * @param {string} to + * @returns {void} + */ +function replace(schema, from, to) { + const left = parse(from) + const right = parse(to) + /** @type {Array} */ + const removed = [] + /** @type {string|null|undefined} */ + const lang = left.language + /** @type {keyof schema} */ + let key + + // Remove values from `from`: + for (key in left) { + if (own.call(left, key)) { + const value = left[key] + if (value && remove(schema, key, value)) { + removed.push(key) + } + } + } + + // Add values from `to`: + for (key in right) { + if (own.call(right, key)) { + const value = right[key] + // Only add values that are defined on `to`, and that were either removed by + // `from` or are currently empty. + if (lang && value && (removed.includes(key) || !schema[key])) { + add(schema, key, key === 'language' && value === 'und' ? lang : value) + } + } + } +} + +/** + * @param {Schema} object + * @param {keyof Schema} key + * @param {string|Array|Array} value + * @returns {boolean} + */ +function remove(object, key, value) { + let removed = false + /** @type {string|Array|Array|null|undefined} */ + let result + + if (value) { + const current = object[key] + result = current + + if (Array.isArray(current)) { + result = [] + let index = -1 + + while (++index < current.length) { + const item = current[index] + + // @ts-expect-error: TS can’t handle the two lists. + if (value.includes(item)) { + removed = true + } else { + // @ts-expect-error: TS can’t handle the two lists. + result.push(item) + } + } + } else if (current === value) { + result = null + removed = true + } + + // @ts-expect-error: Assume the value matches. + object[key] = result + } + + return removed +} + +/** + * @param {Schema} object + * @param {keyof Schema} key + * @param {string|Array|Array} value + * @returns {void} + */ +function add(object, key, value) { + /** @type {string|Array|Array|null|undefined} */ + const current = object[key] + + if (Array.isArray(current)) { + const list = Array.isArray(value) ? value : [value] + /** @type {number} */ + let index = -1 + + while (++index < list.length) { + const item = list[index] + + // @ts-expect-error: TS can’t handle the two lists. + if (!current.includes(item)) { + // @ts-expect-error: TS can’t handle the two lists. + current.push(item) + } + } + } else { + // @ts-expect-error: Assume the value matches. + object[key] = value + } +} + +/** + * @param {Extension} left + * @param {Extension} right + * @returns {number} + */ +function compareSingleton(left, right) { + if (left.singleton > right.singleton) { + return 1 + } + + if (left.singleton < right.singleton) { + return -1 + } + + // It is invalid to have more than one extension with the same singleton so + // we should never reach this code. + return 0 +} diff --git a/node_modules/bcp-47-normalize/lib/likely.d.ts b/node_modules/bcp-47-normalize/lib/likely.d.ts new file mode 100644 index 0000000..b0a2ef7 --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/likely.d.ts @@ -0,0 +1,4 @@ +/** + * @type {Record} + */ +export const likely: Record; diff --git a/node_modules/bcp-47-normalize/lib/likely.js b/node_modules/bcp-47-normalize/lib/likely.js new file mode 100644 index 0000000..cfd8f9a --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/likely.js @@ -0,0 +1,8039 @@ +/** + * @type {Record} + */ +export const likely = { + aa: 'aa-latn-et', + aaa: 'aaa-latn-ng', + aab: 'aab-latn-ng', + aac: 'aac-latn-pg', + aad: 'aad-latn-pg', + aae: 'aae-latn-it', + 'aae-grek': 'aae-grek-it', + aaf: 'aaf-mlym-in', + 'aaf-arab': 'aaf-arab-in', + aag: 'aag-latn-pg', + aah: 'aah-latn-pg', + aai: 'aai-latn-zz', + aak: 'aak-latn-zz', + aal: 'aal-latn-cm', + aan: 'aan-latn-br', + aao: 'aao-arab-dz', + aap: 'aap-latn-br', + aaq: 'aaq-latn-us', + aas: 'aas-latn-tz', + aat: 'aat-grek-gr', + aau: 'aau-latn-zz', + aaw: 'aaw-latn-pg', + aax: 'aax-latn-id', + aaz: 'aaz-latn-id', + ab: 'ab-cyrl-ge', + aba: 'aba-latn-ci', + abb: 'abb-latn-cm', + abc: 'abc-latn-ph', + abd: 'abd-latn-ph', + abe: 'abe-latn-ca', + abf: 'abf-latn-my', + abg: 'abg-latn-pg', + abh: 'abh-arab-tj', + abi: 'abi-latn-zz', + abl: 'abl-rjng-id', + 'abl-latn': 'abl-latn-id', + abm: 'abm-latn-ng', + abn: 'abn-latn-ng', + abo: 'abo-latn-ng', + abp: 'abp-latn-ph', + abq: 'abq-cyrl-zz', + abr: 'abr-latn-gh', + abs: 'abs-latn-id', + abt: 'abt-latn-zz', + abu: 'abu-latn-ci', + abv: 'abv-arab-bh', + abw: 'abw-latn-pg', + abx: 'abx-latn-ph', + aby: 'aby-latn-zz', + abz: 'abz-latn-id', + aca: 'aca-latn-co', + acb: 'acb-latn-ng', + acd: 'acd-latn-zz', + ace: 'ace-latn-id', + acf: 'acf-latn-lc', + ach: 'ach-latn-ug', + acm: 'acm-arab-iq', + acn: 'acn-latn-cn', + acp: 'acp-latn-ng', + acq: 'acq-arab-ye', + acr: 'acr-latn-gt', + acs: 'acs-latn-br', + act: 'act-latn-nl', + acu: 'acu-latn-ec', + acv: 'acv-latn-us', + acw: 'acw-arab-sa', + acx: 'acx-arab-om', + acy: 'acy-latn-cy', + 'acy-arab': 'acy-arab-cy', + 'acy-grek': 'acy-grek-cy', + acz: 'acz-latn-sd', + ada: 'ada-latn-gh', + adb: 'adb-latn-tl', + add: 'add-latn-cm', + ade: 'ade-latn-zz', + adf: 'adf-arab-om', + adg: 'adg-latn-au', + adh: 'adh-latn-ug', + adi: 'adi-latn-in', + 'adi-tibt': 'adi-tibt-cn', + adj: 'adj-latn-zz', + adl: 'adl-latn-in', + adn: 'adn-latn-id', + ado: 'ado-latn-pg', + adp: 'adp-tibt-bt', + adq: 'adq-latn-gh', + adr: 'adr-latn-id', + adt: 'adt-latn-au', + adu: 'adu-latn-ng', + adw: 'adw-latn-br', + adx: 'adx-tibt-cn', + ady: 'ady-cyrl-ru', + adz: 'adz-latn-zz', + ae: 'ae-avst-ir', + aea: 'aea-latn-au', + aeb: 'aeb-arab-tn', + aec: 'aec-arab-eg', + aee: 'aee-arab-af', + aek: 'aek-latn-nc', + ael: 'ael-latn-cm', + aem: 'aem-latn-vn', + aeq: 'aeq-arab-pk', + aer: 'aer-latn-au', + aeu: 'aeu-latn-cn', + aew: 'aew-latn-pg', + aey: 'aey-latn-zz', + aez: 'aez-latn-pg', + af: 'af-latn-za', + afb: 'afb-arab-kw', + afd: 'afd-latn-pg', + afe: 'afe-latn-ng', + afh: 'afh-latn-gh', + afi: 'afi-latn-pg', + afk: 'afk-latn-pg', + afn: 'afn-latn-ng', + afo: 'afo-latn-ng', + afp: 'afp-latn-pg', + afs: 'afs-latn-mx', + afu: 'afu-latn-gh', + afz: 'afz-latn-id', + aga: 'aga-latn-pe', + agb: 'agb-latn-ng', + agc: 'agc-latn-zz', + agd: 'agd-latn-zz', + age: 'age-latn-pg', + agf: 'agf-latn-id', + agg: 'agg-latn-zz', + agh: 'agh-latn-cd', + agi: 'agi-deva-in', + agj: 'agj-ethi-et', + 'agj-arab': 'agj-arab-et', + agk: 'agk-latn-ph', + agl: 'agl-latn-pg', + agm: 'agm-latn-zz', + agn: 'agn-latn-ph', + ago: 'ago-latn-zz', + agq: 'agq-latn-cm', + agr: 'agr-latn-pe', + ags: 'ags-latn-cm', + agt: 'agt-latn-ph', + agu: 'agu-latn-gt', + agv: 'agv-latn-ph', + agw: 'agw-latn-sb', + agx: 'agx-cyrl-ru', + agy: 'agy-latn-ph', + agz: 'agz-latn-ph', + aha: 'aha-latn-zz', + ahb: 'ahb-latn-vu', + ahg: 'ahg-ethi-et', + ahh: 'ahh-latn-id', + ahi: 'ahi-latn-ci', + ahk: 'ahk-latn-mm', + 'ahk-mymr': 'ahk-mymr-mm', + 'ahk-th': 'ahk-latn-th', + 'ahk-thai': 'ahk-thai-th', + ahl: 'ahl-latn-zz', + ahm: 'ahm-latn-ci', + ahn: 'ahn-latn-ng', + aho: 'aho-ahom-in', + ahp: 'ahp-latn-ci', + ahr: 'ahr-deva-in', + ahs: 'ahs-latn-ng', + aht: 'aht-latn-us', + aia: 'aia-latn-sb', + aib: 'aib-arab-cn', + aic: 'aic-latn-pg', + aid: 'aid-latn-au', + aie: 'aie-latn-pg', + aif: 'aif-latn-pg', + aig: 'aig-latn-ag', + aij: 'aij-hebr-il', + aik: 'aik-latn-ng', + ail: 'ail-latn-pg', + aim: 'aim-latn-in', + ain: 'ain-kana-jp', + 'ain-latn': 'ain-latn-jp', + aio: 'aio-mymr-in', + aip: 'aip-latn-id', + aiq: 'aiq-arab-af', + air: 'air-latn-id', + ait: 'ait-latn-br', + aiw: 'aiw-latn-et', + 'aiw-arab': 'aiw-arab-et', + 'aiw-ethi': 'aiw-ethi-et', + aix: 'aix-latn-pg', + aiy: 'aiy-latn-cf', + aja: 'aja-latn-ss', + ajg: 'ajg-latn-zz', + aji: 'aji-latn-nc', + ajn: 'ajn-latn-au', + ajp: 'ajp-arab-jo', + ajt: 'ajt-arab-tn', + ajw: 'ajw-latn-ng', + ajz: 'ajz-latn-in', + ak: 'ak-latn-gh', + akb: 'akb-latn-id', + 'akb-batk': 'akb-batk-id', + akc: 'akc-latn-id', + akd: 'akd-latn-ng', + ake: 'ake-latn-gy', + akf: 'akf-latn-ng', + akg: 'akg-latn-id', + akh: 'akh-latn-pg', + aki: 'aki-latn-pg', + akk: 'akk-xsux-iq', + akl: 'akl-latn-ph', + ako: 'ako-latn-sr', + akp: 'akp-latn-gh', + akq: 'akq-latn-pg', + akr: 'akr-latn-vu', + aks: 'aks-latn-tg', + akt: 'akt-latn-pg', + aku: 'aku-latn-cm', + akv: 'akv-cyrl-ru', + akw: 'akw-latn-cg', + akz: 'akz-latn-us', + ala: 'ala-latn-zz', + alc: 'alc-latn-cl', + ald: 'ald-latn-ci', + ale: 'ale-latn-us', + alf: 'alf-latn-ng', + alh: 'alh-latn-au', + ali: 'ali-latn-zz', + alj: 'alj-latn-ph', + alk: 'alk-laoo-la', + all: 'all-mlym-in', + alm: 'alm-latn-vu', + aln: 'aln-latn-xk', + alo: 'alo-latn-id', + alp: 'alp-latn-id', + alq: 'alq-latn-ca', + alr: 'alr-cyrl-ru', + alt: 'alt-cyrl-ru', + alu: 'alu-latn-sb', + alw: 'alw-ethi-et', + alx: 'alx-latn-pg', + aly: 'aly-latn-au', + alz: 'alz-latn-cd', + am: 'am-ethi-et', + ama: 'ama-latn-br', + amb: 'amb-latn-ng', + amc: 'amc-latn-pe', + ame: 'ame-latn-pe', + amf: 'amf-latn-et', + 'amf-ethi': 'amf-ethi-et', + amg: 'amg-latn-au', + ami: 'ami-latn-tw', + amj: 'amj-latn-td', + amk: 'amk-latn-id', + amm: 'amm-latn-zz', + amn: 'amn-latn-zz', + amo: 'amo-latn-ng', + amp: 'amp-latn-zz', + amq: 'amq-latn-id', + amr: 'amr-latn-pe', + ams: 'ams-jpan-jp', + amt: 'amt-latn-pg', + amu: 'amu-latn-mx', + amv: 'amv-latn-id', + amw: 'amw-syrc-sy', + 'amw-arab': 'amw-arab-sy', + 'amw-armi': 'amw-armi-sy', + 'amw-latn': 'amw-latn-sy', + amx: 'amx-latn-au', + amy: 'amy-latn-au', + amz: 'amz-latn-au', + an: 'an-latn-es', + ana: 'ana-latn-co', + anb: 'anb-latn-pe', + anc: 'anc-latn-zz', + and: 'and-latn-id', + ane: 'ane-latn-nc', + anf: 'anf-latn-gh', + ang: 'ang-latn-gb', + anh: 'anh-latn-pg', + ani: 'ani-cyrl-ru', + anj: 'anj-latn-pg', + ank: 'ank-latn-zz', + anl: 'anl-latn-mm', + anm: 'anm-latn-in', + ann: 'ann-latn-ng', + ano: 'ano-latn-co', + anp: 'anp-deva-in', + anr: 'anr-deva-in', + ans: 'ans-latn-co', + ant: 'ant-latn-au', + anu: 'anu-ethi-et', + 'anu-arab': 'anu-arab-ss', + 'anu-latn': 'anu-latn-ss', + anv: 'anv-latn-cm', + anw: 'anw-latn-ng', + anx: 'anx-latn-pg', + any: 'any-latn-zz', + anz: 'anz-latn-pg', + aoa: 'aoa-latn-st', + aob: 'aob-latn-pg', + aoc: 'aoc-latn-ve', + aod: 'aod-latn-pg', + aoe: 'aoe-latn-pg', + aof: 'aof-latn-pg', + aog: 'aog-latn-pg', + aoi: 'aoi-latn-au', + aoj: 'aoj-latn-zz', + aok: 'aok-latn-nc', + aol: 'aol-latn-id', + aom: 'aom-latn-zz', + aon: 'aon-latn-pg', + aor: 'aor-latn-vu', + aos: 'aos-latn-id', + aot: 'aot-beng-bd', + 'aot-latn': 'aot-latn-in', + aox: 'aox-latn-gy', + aoz: 'aoz-latn-id', + apb: 'apb-latn-sb', + apc: 'apc-arab-sy', + apd: 'apd-arab-tg', + ape: 'ape-latn-zz', + apf: 'apf-latn-ph', + apg: 'apg-latn-id', + aph: 'aph-deva-np', + api: 'api-latn-br', + apj: 'apj-latn-us', + apk: 'apk-latn-us', + apl: 'apl-latn-us', + apm: 'apm-latn-us', + apn: 'apn-latn-br', + apo: 'apo-latn-pg', + app: 'app-latn-vu', + apr: 'apr-latn-zz', + aps: 'aps-latn-zz', + apt: 'apt-latn-in', + apu: 'apu-latn-br', + apv: 'apv-latn-br', + apw: 'apw-latn-us', + apx: 'apx-latn-id', + apy: 'apy-latn-br', + apz: 'apz-latn-zz', + aqc: 'aqc-cyrl-ru', + aqd: 'aqd-latn-ml', + aqg: 'aqg-latn-ng', + aqk: 'aqk-latn-ng', + aqm: 'aqm-latn-id', + aqn: 'aqn-latn-ph', + aqr: 'aqr-latn-nc', + aqt: 'aqt-latn-py', + aqz: 'aqz-latn-br', + ar: 'ar-arab-eg', + arc: 'arc-armi-ir', + 'arc-nbat': 'arc-nbat-jo', + 'arc-palm': 'arc-palm-sy', + ard: 'ard-latn-au', + are: 'are-latn-au', + arh: 'arh-latn-zz', + ari: 'ari-latn-us', + arj: 'arj-latn-br', + ark: 'ark-latn-br', + arl: 'arl-latn-pe', + arn: 'arn-latn-cl', + aro: 'aro-latn-bo', + arp: 'arp-latn-us', + arq: 'arq-arab-dz', + arr: 'arr-latn-br', + ars: 'ars-arab-sa', + aru: 'aru-latn-br', + arw: 'arw-latn-sr', + arx: 'arx-latn-br', + ary: 'ary-arab-ma', + arz: 'arz-arab-eg', + as: 'as-beng-in', + asa: 'asa-latn-tz', + asb: 'asb-latn-ca', + asc: 'asc-latn-id', + ase: 'ase-sgnw-us', + asg: 'asg-latn-zz', + ash: 'ash-latn-pe', + asi: 'asi-latn-id', + asj: 'asj-latn-cm', + ask: 'ask-arab-af', + asl: 'asl-latn-id', + asn: 'asn-latn-br', + aso: 'aso-latn-zz', + ass: 'ass-latn-cm', + ast: 'ast-latn-es', + asu: 'asu-latn-br', + asv: 'asv-latn-cd', + asx: 'asx-latn-pg', + asy: 'asy-latn-id', + asz: 'asz-latn-id', + ata: 'ata-latn-zz', + atb: 'atb-latn-cn', + 'atb-lisu': 'atb-lisu-cn', + atc: 'atc-latn-pe', + atd: 'atd-latn-ph', + ate: 'ate-latn-pg', + atg: 'atg-latn-zz', + ati: 'ati-latn-ci', + atj: 'atj-latn-ca', + atk: 'atk-latn-ph', + atl: 'atl-latn-ph', + atm: 'atm-latn-ph', + atn: 'atn-arab-ir', + ato: 'ato-latn-cm', + atp: 'atp-latn-ph', + atq: 'atq-latn-id', + atr: 'atr-latn-br', + ats: 'ats-latn-us', + att: 'att-latn-ph', + atu: 'atu-latn-ss', + atv: 'atv-cyrl-ru', + atw: 'atw-latn-us', + atx: 'atx-latn-br', + aty: 'aty-latn-vu', + atz: 'atz-latn-ph', + aua: 'aua-latn-sb', + auc: 'auc-latn-ec', + aud: 'aud-latn-sb', + aug: 'aug-latn-bj', + auh: 'auh-latn-zm', + aui: 'aui-latn-pg', + auj: 'auj-arab-ly', + 'auj-latn': 'auj-latn-ly', + 'auj-tfng': 'auj-tfng-ly', + auk: 'auk-latn-pg', + aul: 'aul-latn-vu', + aum: 'aum-latn-ng', + aun: 'aun-latn-pg', + auo: 'auo-latn-ng', + aup: 'aup-latn-pg', + auq: 'auq-latn-id', + aur: 'aur-latn-pg', + aut: 'aut-latn-pf', + auu: 'auu-latn-id', + auw: 'auw-latn-id', + auy: 'auy-latn-zz', + auz: 'auz-arab-uz', + av: 'av-cyrl-ru', + avb: 'avb-latn-pg', + avd: 'avd-arab-ir', + avi: 'avi-latn-ci', + avk: 'avk-latn-001', + avl: 'avl-arab-zz', + avm: 'avm-latn-au', + avn: 'avn-latn-zz', + avo: 'avo-latn-br', + avs: 'avs-latn-pe', + avt: 'avt-latn-zz', + avu: 'avu-latn-zz', + avv: 'avv-latn-br', + awa: 'awa-deva-in', + awb: 'awb-latn-zz', + awc: 'awc-latn-ng', + awe: 'awe-latn-br', + awg: 'awg-latn-au', + awh: 'awh-latn-id', + awi: 'awi-latn-pg', + awk: 'awk-latn-au', + awm: 'awm-latn-pg', + awn: 'awn-ethi-et', + awo: 'awo-latn-zz', + awr: 'awr-latn-id', + aws: 'aws-latn-id', + awt: 'awt-latn-br', + awu: 'awu-latn-id', + awv: 'awv-latn-id', + aww: 'aww-latn-pg', + awx: 'awx-latn-zz', + awy: 'awy-latn-id', + axb: 'axb-latn-ar', + axe: 'axe-latn-au', + axg: 'axg-latn-br', + axk: 'axk-latn-cf', + axl: 'axl-latn-au', + axm: 'axm-armn-am', + axx: 'axx-latn-nc', + ay: 'ay-latn-bo', + aya: 'aya-latn-pg', + ayb: 'ayb-latn-zz', + ayc: 'ayc-latn-pe', + ayd: 'ayd-latn-au', + aye: 'aye-latn-ng', + ayg: 'ayg-latn-tg', + ayh: 'ayh-arab-ye', + ayi: 'ayi-latn-ng', + ayk: 'ayk-latn-ng', + ayl: 'ayl-arab-ly', + ayn: 'ayn-arab-ye', + ayo: 'ayo-latn-py', + ayp: 'ayp-arab-iq', + ayq: 'ayq-latn-pg', + ays: 'ays-latn-ph', + ayt: 'ayt-latn-ph', + ayu: 'ayu-latn-ng', + ayz: 'ayz-latn-id', + az: 'az-latn-az', + 'az-arab': 'az-arab-ir', + 'az-iq': 'az-arab-iq', + 'az-ir': 'az-arab-ir', + 'az-ru': 'az-cyrl-ru', + azb: 'azb-arab-ir', + 'azb-cyrl': 'azb-cyrl-az', + 'azb-latn': 'azb-latn-az', + azd: 'azd-latn-mx', + azg: 'azg-latn-mx', + azm: 'azm-latn-mx', + azn: 'azn-latn-mx', + azo: 'azo-latn-cm', + azt: 'azt-latn-ph', + azz: 'azz-latn-mx', + ba: 'ba-cyrl-ru', + baa: 'baa-latn-sb', + bab: 'bab-latn-gw', + bac: 'bac-latn-id', + bae: 'bae-latn-ve', + baf: 'baf-latn-cm', + bag: 'bag-latn-cm', + bah: 'bah-latn-bs', + baj: 'baj-latn-id', + bal: 'bal-arab-pk', + ban: 'ban-latn-id', + bao: 'bao-latn-co', + bap: 'bap-deva-np', + bar: 'bar-latn-at', + bas: 'bas-latn-cm', + bau: 'bau-latn-ng', + bav: 'bav-latn-zz', + baw: 'baw-latn-cm', + bax: 'bax-bamu-cm', + bay: 'bay-latn-id', + bba: 'bba-latn-zz', + bbb: 'bbb-latn-zz', + bbc: 'bbc-latn-id', + bbd: 'bbd-latn-zz', + bbe: 'bbe-latn-cd', + bbf: 'bbf-latn-pg', + bbg: 'bbg-latn-ga', + bbi: 'bbi-latn-cm', + bbj: 'bbj-latn-cm', + bbk: 'bbk-latn-cm', + bbl: 'bbl-geor-ge', + bbm: 'bbm-latn-cd', + bbn: 'bbn-latn-pg', + bbo: 'bbo-latn-bf', + bbp: 'bbp-latn-zz', + bbq: 'bbq-latn-cm', + bbr: 'bbr-latn-zz', + bbs: 'bbs-latn-ng', + bbt: 'bbt-latn-ng', + bbu: 'bbu-latn-ng', + bbv: 'bbv-latn-pg', + bbw: 'bbw-latn-cm', + bbx: 'bbx-latn-cm', + bby: 'bby-latn-cm', + bca: 'bca-latn-cn', + 'bca-hani': 'bca-hani-cn', + bcb: 'bcb-latn-sn', + bcd: 'bcd-latn-id', + bce: 'bce-latn-cm', + bcf: 'bcf-latn-zz', + bcg: 'bcg-latn-gn', + bch: 'bch-latn-zz', + bci: 'bci-latn-ci', + bcj: 'bcj-latn-au', + bck: 'bck-latn-au', + bcm: 'bcm-latn-zz', + bcn: 'bcn-latn-zz', + bco: 'bco-latn-zz', + bcp: 'bcp-latn-cd', + bcq: 'bcq-ethi-zz', + bcr: 'bcr-latn-ca', + bcs: 'bcs-latn-ng', + bct: 'bct-latn-cd', + bcu: 'bcu-latn-zz', + bcv: 'bcv-latn-ng', + bcw: 'bcw-latn-cm', + bcy: 'bcy-latn-ng', + bcz: 'bcz-latn-sn', + bda: 'bda-latn-sn', + bdb: 'bdb-latn-id', + bdc: 'bdc-latn-co', + bdd: 'bdd-latn-zz', + bde: 'bde-latn-ng', + bdf: 'bdf-latn-pg', + bdg: 'bdg-latn-my', + bdh: 'bdh-latn-ss', + bdi: 'bdi-latn-sd', + bdj: 'bdj-latn-ss', + bdk: 'bdk-latn-az', + bdl: 'bdl-latn-id', + bdm: 'bdm-latn-td', + bdn: 'bdn-latn-cm', + bdo: 'bdo-latn-td', + bdp: 'bdp-latn-tz', + bdq: 'bdq-latn-vn', + bdr: 'bdr-latn-my', + bds: 'bds-latn-tz', + bdt: 'bdt-latn-cf', + bdu: 'bdu-latn-cm', + bdv: 'bdv-orya-in', + bdw: 'bdw-latn-id', + bdx: 'bdx-latn-id', + bdy: 'bdy-latn-au', + bdz: 'bdz-arab-pk', + be: 'be-cyrl-by', + bea: 'bea-latn-ca', + 'bea-cans': 'bea-cans-ca', + beb: 'beb-latn-cm', + bec: 'bec-latn-cm', + bed: 'bed-latn-id', + bee: 'bee-deva-in', + bef: 'bef-latn-zz', + beh: 'beh-latn-zz', + bei: 'bei-latn-id', + bej: 'bej-arab-sd', + bek: 'bek-latn-pg', + bem: 'bem-latn-zm', + beo: 'beo-latn-pg', + bep: 'bep-latn-id', + beq: 'beq-latn-cg', + bes: 'bes-latn-td', + bet: 'bet-latn-zz', + beu: 'beu-latn-id', + bev: 'bev-latn-ci', + bew: 'bew-latn-id', + bex: 'bex-latn-zz', + bey: 'bey-latn-pg', + bez: 'bez-latn-tz', + bfa: 'bfa-latn-ss', + 'bfa-arab': 'bfa-arab-ss', + bfb: 'bfb-deva-in', + bfc: 'bfc-latn-cn', + bfd: 'bfd-latn-cm', + bfe: 'bfe-latn-id', + bff: 'bff-latn-cf', + bfg: 'bfg-latn-id', + bfh: 'bfh-latn-pg', + bfj: 'bfj-latn-cm', + bfl: 'bfl-latn-cf', + bfm: 'bfm-latn-cm', + bfn: 'bfn-latn-tl', + bfo: 'bfo-latn-bf', + bfp: 'bfp-latn-cm', + bfq: 'bfq-taml-in', + bfs: 'bfs-latn-cn', + 'bfs-hani': 'bfs-hani-cn', + bft: 'bft-arab-pk', + bfu: 'bfu-tibt-in', + 'bfu-takr': 'bfu-takr-in', + bfw: 'bfw-orya-in', + bfx: 'bfx-latn-ph', + bfy: 'bfy-deva-in', + bfz: 'bfz-deva-in', + bg: 'bg-cyrl-bg', + bga: 'bga-latn-ng', + bgb: 'bgb-latn-id', + bgc: 'bgc-deva-in', + bgd: 'bgd-deva-in', + bgf: 'bgf-latn-cm', + bgg: 'bgg-latn-in', + bgi: 'bgi-latn-ph', + bgj: 'bgj-latn-cm', + bgn: 'bgn-arab-pk', + bgo: 'bgo-latn-gn', + bgp: 'bgp-arab-pk', + bgq: 'bgq-deva-in', + bgr: 'bgr-latn-in', + bgs: 'bgs-latn-ph', + bgt: 'bgt-latn-sb', + bgu: 'bgu-latn-ng', + bgv: 'bgv-latn-id', + bgw: 'bgw-deva-in', + bgx: 'bgx-grek-tr', + bgy: 'bgy-latn-id', + bgz: 'bgz-latn-id', + bha: 'bha-deva-in', + bhb: 'bhb-deva-in', + bhc: 'bhc-latn-id', + bhd: 'bhd-deva-in', + 'bhd-arab': 'bhd-arab-in', + 'bhd-takr': 'bhd-takr-in', + bhe: 'bhe-arab-pk', + bhf: 'bhf-latn-pg', + bhg: 'bhg-latn-zz', + bhh: 'bhh-cyrl-il', + 'bhh-hebr': 'bhh-hebr-il', + 'bhh-latn': 'bhh-latn-il', + bhi: 'bhi-deva-in', + bhj: 'bhj-deva-np', + bhl: 'bhl-latn-zz', + bhm: 'bhm-arab-om', + bhn: 'bhn-syrc-ge', + bho: 'bho-deva-in', + bhp: 'bhp-latn-id', + bhq: 'bhq-latn-id', + bhr: 'bhr-latn-mg', + bhs: 'bhs-latn-cm', + bht: 'bht-takr-in', + 'bht-deva': 'bht-deva-in', + 'bht-latn': 'bht-latn-in', + bhu: 'bhu-deva-in', + bhv: 'bhv-latn-id', + bhw: 'bhw-latn-id', + bhy: 'bhy-latn-zz', + bhz: 'bhz-latn-id', + bi: 'bi-latn-vu', + bia: 'bia-latn-au', + bib: 'bib-latn-zz', + bid: 'bid-latn-td', + bie: 'bie-latn-pg', + bif: 'bif-latn-gw', + big: 'big-latn-zz', + bik: 'bik-latn-ph', + bil: 'bil-latn-ng', + bim: 'bim-latn-zz', + bin: 'bin-latn-ng', + bio: 'bio-latn-zz', + bip: 'bip-latn-cd', + biq: 'biq-latn-zz', + bir: 'bir-latn-pg', + bit: 'bit-latn-pg', + biu: 'biu-latn-in', + biv: 'biv-latn-gh', + biw: 'biw-latn-cm', + biy: 'biy-deva-in', + biz: 'biz-latn-cd', + bja: 'bja-latn-cd', + bjb: 'bjb-latn-au', + bjc: 'bjc-latn-pg', + bjf: 'bjf-syrc-il', + bjg: 'bjg-latn-gw', + bjh: 'bjh-latn-zz', + bji: 'bji-ethi-zz', + bjj: 'bjj-deva-in', + bjk: 'bjk-latn-pg', + bjl: 'bjl-latn-pg', + bjm: 'bjm-arab-iq', + bjn: 'bjn-latn-id', + bjo: 'bjo-latn-zz', + bjp: 'bjp-latn-pg', + bjr: 'bjr-latn-zz', + bjs: 'bjs-latn-bb', + bjt: 'bjt-latn-sn', + bju: 'bju-latn-cm', + bjv: 'bjv-latn-td', + bjw: 'bjw-latn-ci', + bjx: 'bjx-latn-ph', + bjy: 'bjy-latn-au', + bjz: 'bjz-latn-zz', + bka: 'bka-latn-ng', + bkc: 'bkc-latn-zz', + bkd: 'bkd-latn-ph', + bkf: 'bkf-latn-cd', + bkg: 'bkg-latn-cf', + bkh: 'bkh-latn-cm', + bki: 'bki-latn-vu', + bkj: 'bkj-latn-cf', + bkl: 'bkl-latn-id', + bkm: 'bkm-latn-cm', + bkn: 'bkn-latn-id', + bko: 'bko-latn-cm', + bkp: 'bkp-latn-cd', + bkq: 'bkq-latn-zz', + bkr: 'bkr-latn-id', + bks: 'bks-latn-ph', + bkt: 'bkt-latn-cd', + bku: 'bku-latn-ph', + bkv: 'bkv-latn-zz', + bkw: 'bkw-latn-cg', + bkx: 'bkx-latn-tl', + bky: 'bky-latn-ng', + bkz: 'bkz-latn-id', + bla: 'bla-latn-ca', + blb: 'blb-latn-sb', + blc: 'blc-latn-ca', + bld: 'bld-latn-id', + ble: 'ble-latn-gw', + blf: 'blf-latn-id', + blg: 'blg-latn-my', + blh: 'blh-latn-lr', + bli: 'bli-latn-cd', + blj: 'blj-latn-id', + blk: 'blk-mymr-mm', + blm: 'blm-latn-ss', + bln: 'bln-latn-ph', + blo: 'blo-latn-bj', + blp: 'blp-latn-sb', + blq: 'blq-latn-pg', + blr: 'blr-latn-cn', + 'blr-tale': 'blr-tale-cn', + 'blr-thai': 'blr-thai-th', + bls: 'bls-latn-id', + blt: 'blt-tavt-vn', + blv: 'blv-latn-ao', + blw: 'blw-latn-ph', + blx: 'blx-latn-ph', + bly: 'bly-latn-bj', + blz: 'blz-latn-id', + bm: 'bm-latn-ml', + bma: 'bma-latn-ng', + bmb: 'bmb-latn-cd', + bmc: 'bmc-latn-pg', + bmd: 'bmd-latn-gn', + bme: 'bme-latn-cf', + bmf: 'bmf-latn-sl', + bmg: 'bmg-latn-cd', + bmh: 'bmh-latn-zz', + bmi: 'bmi-latn-td', + bmj: 'bmj-deva-np', + bmk: 'bmk-latn-zz', + bml: 'bml-latn-cd', + bmm: 'bmm-latn-mg', + bmn: 'bmn-latn-pg', + bmo: 'bmo-latn-cm', + bmp: 'bmp-latn-pg', + bmq: 'bmq-latn-ml', + bmr: 'bmr-latn-co', + bms: 'bms-latn-ne', + bmu: 'bmu-latn-zz', + bmv: 'bmv-latn-cm', + bmw: 'bmw-latn-cg', + bmx: 'bmx-latn-pg', + bmz: 'bmz-latn-pg', + bn: 'bn-beng-bd', + bna: 'bna-latn-id', + bnb: 'bnb-latn-my', + bnc: 'bnc-latn-ph', + bnd: 'bnd-latn-id', + bne: 'bne-latn-id', + bnf: 'bnf-latn-id', + bng: 'bng-latn-zz', + bni: 'bni-latn-cd', + bnj: 'bnj-latn-ph', + bnk: 'bnk-latn-vu', + bnm: 'bnm-latn-zz', + bnn: 'bnn-latn-tw', + bno: 'bno-latn-ph', + bnp: 'bnp-latn-zz', + bnq: 'bnq-latn-id', + bnr: 'bnr-latn-vu', + bns: 'bns-deva-in', + bnu: 'bnu-latn-id', + bnv: 'bnv-latn-id', + bnw: 'bnw-latn-pg', + bnx: 'bnx-latn-cd', + bny: 'bny-latn-my', + bnz: 'bnz-latn-cm', + bo: 'bo-tibt-cn', + boa: 'boa-latn-pe', + bob: 'bob-latn-ke', + boe: 'boe-latn-cm', + bof: 'bof-latn-bf', + boh: 'boh-latn-cd', + boj: 'boj-latn-zz', + bok: 'bok-latn-cg', + bol: 'bol-latn-ng', + bom: 'bom-latn-zz', + bon: 'bon-latn-zz', + boo: 'boo-latn-ml', + bop: 'bop-latn-pg', + boq: 'boq-latn-pg', + bor: 'bor-latn-br', + bot: 'bot-latn-ss', + bou: 'bou-latn-tz', + bov: 'bov-latn-gh', + bow: 'bow-latn-pg', + box: 'box-latn-bf', + boy: 'boy-latn-cf', + boz: 'boz-latn-ml', + 'boz-arab': 'boz-arab-ml', + bpa: 'bpa-latn-vu', + bpc: 'bpc-latn-cm', + bpd: 'bpd-latn-cf', + bpe: 'bpe-latn-pg', + bpg: 'bpg-latn-id', + bph: 'bph-cyrl-ru', + bpi: 'bpi-latn-pg', + bpj: 'bpj-latn-cd', + bpk: 'bpk-latn-nc', + bpl: 'bpl-latn-au', + bpm: 'bpm-latn-pg', + bpo: 'bpo-latn-id', + bpp: 'bpp-latn-id', + bpq: 'bpq-latn-id', + bpr: 'bpr-latn-ph', + bps: 'bps-latn-ph', + bpt: 'bpt-latn-au', + bpu: 'bpu-latn-pg', + bpv: 'bpv-latn-id', + bpw: 'bpw-latn-pg', + bpx: 'bpx-deva-in', + bpy: 'bpy-beng-in', + bpz: 'bpz-latn-id', + bqa: 'bqa-latn-bj', + bqb: 'bqb-latn-id', + bqc: 'bqc-latn-zz', + bqd: 'bqd-latn-cm', + bqf: 'bqf-latn-gn', + 'bqf-arab': 'bqf-arab-gn', + bqg: 'bqg-latn-tg', + bqi: 'bqi-arab-ir', + bqj: 'bqj-latn-sn', + bqk: 'bqk-latn-cf', + bql: 'bql-latn-pg', + bqm: 'bqm-latn-cm', + bqo: 'bqo-latn-cm', + bqp: 'bqp-latn-zz', + bqq: 'bqq-latn-id', + bqr: 'bqr-latn-id', + bqs: 'bqs-latn-pg', + bqt: 'bqt-latn-cm', + bqu: 'bqu-latn-cd', + bqv: 'bqv-latn-ci', + bqw: 'bqw-latn-ng', + bqx: 'bqx-latn-ng', + bqz: 'bqz-latn-cm', + br: 'br-latn-fr', + bra: 'bra-deva-in', + brb: 'brb-khmr-kh', + 'brb-laoo': 'brb-laoo-la', + 'brb-latn': 'brb-latn-vn', + brc: 'brc-latn-gy', + brd: 'brd-deva-np', + brf: 'brf-latn-cd', + brg: 'brg-latn-bo', + brh: 'brh-arab-pk', + bri: 'bri-latn-cm', + brj: 'brj-latn-vu', + brk: 'brk-arab-sd', + brl: 'brl-latn-bw', + brm: 'brm-latn-cd', + brn: 'brn-latn-cr', + brp: 'brp-latn-id', + brq: 'brq-latn-pg', + brr: 'brr-latn-sb', + brs: 'brs-latn-id', + brt: 'brt-latn-ng', + bru: 'bru-latn-vn', + 'bru-laoo': 'bru-laoo-la', + 'bru-thai': 'bru-thai-la', + brv: 'brv-laoo-la', + brx: 'brx-deva-in', + bry: 'bry-latn-pg', + brz: 'brz-latn-zz', + bs: 'bs-latn-ba', + bsa: 'bsa-latn-id', + bsb: 'bsb-latn-bn', + bsc: 'bsc-latn-sn', + bse: 'bse-latn-cm', + bsf: 'bsf-latn-ng', + bsh: 'bsh-arab-af', + bsi: 'bsi-latn-cm', + bsj: 'bsj-latn-zz', + bsk: 'bsk-arab-pk', + 'bsk-latn': 'bsk-latn-pk', + bsl: 'bsl-latn-ng', + bsm: 'bsm-latn-id', + bsn: 'bsn-latn-co', + bso: 'bso-latn-td', + bsp: 'bsp-latn-gn', + bsq: 'bsq-bass-lr', + bsr: 'bsr-latn-ng', + bss: 'bss-latn-cm', + bst: 'bst-ethi-zz', + bsu: 'bsu-latn-id', + bsv: 'bsv-latn-gn', + 'bsv-arab': 'bsv-arab-gn', + bsw: 'bsw-latn-et', + 'bsw-ethi': 'bsw-ethi-et', + bsx: 'bsx-latn-ng', + bsy: 'bsy-latn-my', + bta: 'bta-latn-ng', + btc: 'btc-latn-cm', + btd: 'btd-batk-id', + bte: 'bte-latn-ng', + btf: 'btf-latn-td', + btg: 'btg-latn-ci', + bth: 'bth-latn-my', + bti: 'bti-latn-id', + btj: 'btj-latn-id', + btm: 'btm-batk-id', + btn: 'btn-latn-ph', + bto: 'bto-latn-ph', + btp: 'btp-latn-pg', + btq: 'btq-latn-my', + btr: 'btr-latn-vu', + bts: 'bts-latn-id', + 'bts-batk': 'bts-batk-id', + btt: 'btt-latn-zz', + btu: 'btu-latn-ng', + btv: 'btv-deva-pk', + btw: 'btw-latn-ph', + btx: 'btx-latn-id', + 'btx-batk': 'btx-batk-id', + bty: 'bty-latn-id', + btz: 'btz-latn-id', + bua: 'bua-cyrl-ru', + bub: 'bub-latn-td', + buc: 'buc-latn-yt', + bud: 'bud-latn-zz', + bue: 'bue-latn-ca', + buf: 'buf-latn-cd', + bug: 'bug-latn-id', + buh: 'buh-latn-cn', + bui: 'bui-latn-cg', + buj: 'buj-latn-ng', + buk: 'buk-latn-zz', + bum: 'bum-latn-cm', + bun: 'bun-latn-sl', + buo: 'buo-latn-zz', + bup: 'bup-latn-id', + buq: 'buq-latn-pg', + bus: 'bus-latn-zz', + but: 'but-latn-pg', + buu: 'buu-latn-zz', + buv: 'buv-latn-pg', + buw: 'buw-latn-ga', + bux: 'bux-latn-ng', + buy: 'buy-latn-sl', + buz: 'buz-latn-ng', + bva: 'bva-latn-td', + bvb: 'bvb-latn-gq', + bvc: 'bvc-latn-sb', + bvd: 'bvd-latn-sb', + bve: 'bve-latn-id', + bvf: 'bvf-latn-td', + bvg: 'bvg-latn-cm', + bvh: 'bvh-latn-ng', + bvi: 'bvi-latn-ss', + bvj: 'bvj-latn-ng', + bvk: 'bvk-latn-id', + bvm: 'bvm-latn-cm', + bvn: 'bvn-latn-pg', + bvo: 'bvo-latn-td', + bvq: 'bvq-latn-cf', + bvr: 'bvr-latn-au', + bvt: 'bvt-latn-id', + bvu: 'bvu-latn-id', + bvv: 'bvv-latn-ve', + bvw: 'bvw-latn-ng', + bvx: 'bvx-latn-cg', + bvy: 'bvy-latn-ph', + bvz: 'bvz-latn-id', + bwa: 'bwa-latn-nc', + bwb: 'bwb-latn-fj', + bwc: 'bwc-latn-zm', + bwd: 'bwd-latn-zz', + bwe: 'bwe-mymr-mm', + 'bwe-latn': 'bwe-latn-mm', + bwf: 'bwf-latn-pg', + bwg: 'bwg-latn-mz', + bwh: 'bwh-latn-cm', + bwi: 'bwi-latn-ve', + bwj: 'bwj-latn-bf', + bwk: 'bwk-latn-pg', + bwl: 'bwl-latn-cd', + bwm: 'bwm-latn-pg', + bwo: 'bwo-latn-et', + 'bwo-ethi': 'bwo-ethi-et', + bwp: 'bwp-latn-id', + bwq: 'bwq-latn-bf', + bwr: 'bwr-latn-zz', + bws: 'bws-latn-cd', + bwt: 'bwt-latn-cm', + bwu: 'bwu-latn-gh', + bww: 'bww-latn-cd', + bwx: 'bwx-latn-cn', + bwy: 'bwy-latn-bf', + bwz: 'bwz-latn-cg', + bxa: 'bxa-latn-sb', + bxb: 'bxb-latn-ss', + bxc: 'bxc-latn-gq', + bxf: 'bxf-latn-pg', + bxg: 'bxg-latn-cd', + bxh: 'bxh-latn-zz', + bxi: 'bxi-latn-au', + bxj: 'bxj-latn-au', + bxl: 'bxl-latn-bf', + bxm: 'bxm-cyrl-mn', + 'bxm-latn': 'bxm-latn-mn', + 'bxm-mong': 'bxm-mong-mn', + bxn: 'bxn-latn-au', + bxo: 'bxo-latn-ng', + bxp: 'bxp-latn-cm', + bxq: 'bxq-latn-ng', + bxs: 'bxs-latn-cm', + bxu: 'bxu-mong-cn', + 'bxu-cyrl': 'bxu-cyrl-cn', + 'bxu-latn': 'bxu-latn-cn', + bxv: 'bxv-latn-td', + bxw: 'bxw-latn-ml', + bxz: 'bxz-latn-pg', + bya: 'bya-latn-ph', + byb: 'byb-latn-cm', + byc: 'byc-latn-ng', + byd: 'byd-latn-id', + bye: 'bye-latn-zz', + byf: 'byf-latn-ng', + byh: 'byh-deva-np', + byi: 'byi-latn-cd', + byj: 'byj-latn-ng', + byk: 'byk-latn-cn', + byl: 'byl-latn-id', + bym: 'bym-latn-au', + byn: 'byn-ethi-er', + byp: 'byp-latn-ng', + byr: 'byr-latn-zz', + bys: 'bys-latn-zz', + byv: 'byv-latn-cm', + byw: 'byw-deva-np', + byx: 'byx-latn-zz', + byz: 'byz-latn-pg', + bza: 'bza-latn-zz', + bzb: 'bzb-latn-id', + bzc: 'bzc-latn-mg', + bzd: 'bzd-latn-cr', + bze: 'bze-latn-ml', + bzf: 'bzf-latn-zz', + bzh: 'bzh-latn-zz', + bzi: 'bzi-thai-th', + bzj: 'bzj-latn-bz', + bzk: 'bzk-latn-ni', + bzl: 'bzl-latn-id', + bzm: 'bzm-latn-cd', + bzn: 'bzn-latn-id', + bzo: 'bzo-latn-cd', + bzp: 'bzp-latn-id', + bzq: 'bzq-latn-id', + bzr: 'bzr-latn-au', + bzt: 'bzt-latn-001', + bzu: 'bzu-latn-id', + bzv: 'bzv-latn-cm', + bzw: 'bzw-latn-zz', + bzx: 'bzx-latn-ml', + bzy: 'bzy-latn-ng', + bzz: 'bzz-latn-ng', + ca: 'ca-latn-es', + caa: 'caa-latn-gt', + cab: 'cab-latn-hn', + cac: 'cac-latn-gt', + cad: 'cad-latn-us', + cae: 'cae-latn-sn', + caf: 'caf-latn-ca', + 'caf-cans': 'caf-cans-ca', + cag: 'cag-latn-py', + cah: 'cah-latn-pe', + caj: 'caj-latn-ar', + cak: 'cak-latn-gt', + cal: 'cal-latn-mp', + cam: 'cam-latn-nc', + can: 'can-latn-zz', + cao: 'cao-latn-bo', + cap: 'cap-latn-bo', + caq: 'caq-latn-in', + car: 'car-latn-ve', + cas: 'cas-latn-bo', + cav: 'cav-latn-bo', + caw: 'caw-latn-bo', + cax: 'cax-latn-bo', + cay: 'cay-latn-ca', + caz: 'caz-latn-bo', + cbb: 'cbb-latn-co', + cbc: 'cbc-latn-co', + cbd: 'cbd-latn-co', + cbg: 'cbg-latn-co', + cbi: 'cbi-latn-ec', + cbj: 'cbj-latn-zz', + cbk: 'cbk-latn-ph', + 'cbk-brai': 'cbk-brai-ph', + cbl: 'cbl-latn-mm', + cbn: 'cbn-thai-th', + cbo: 'cbo-latn-ng', + cbq: 'cbq-latn-ng', + cbr: 'cbr-latn-pe', + cbs: 'cbs-latn-pe', + cbt: 'cbt-latn-pe', + cbu: 'cbu-latn-pe', + cbv: 'cbv-latn-co', + cbw: 'cbw-latn-ph', + cby: 'cby-latn-co', + ccc: 'ccc-latn-pe', + ccd: 'ccd-latn-br', + cce: 'cce-latn-mz', + ccg: 'ccg-latn-ng', + cch: 'cch-latn-ng', + ccj: 'ccj-latn-gw', + ccl: 'ccl-latn-tz', + ccm: 'ccm-latn-my', + cco: 'cco-latn-mx', + ccp: 'ccp-cakm-bd', + ccr: 'ccr-latn-sv', + cde: 'cde-telu-in', + cdf: 'cdf-latn-in', + 'cdf-beng': 'cdf-beng-in', + cdh: 'cdh-deva-in', + 'cdh-takr': 'cdh-takr-in', + cdi: 'cdi-gujr-in', + cdj: 'cdj-deva-in', + cdm: 'cdm-deva-np', + 'cdm-latn': 'cdm-latn-np', + cdo: 'cdo-hans-cn', + 'cdo-hant': 'cdo-hant-cn', + 'cdo-latn': 'cdo-latn-cn', + cdr: 'cdr-latn-ng', + cdz: 'cdz-beng-in', + ce: 'ce-cyrl-ru', + cea: 'cea-latn-us', + ceb: 'ceb-latn-ph', + ceg: 'ceg-latn-py', + cek: 'cek-latn-mm', + cen: 'cen-latn-ng', + cet: 'cet-latn-ng', + cey: 'cey-latn-mm', + cfa: 'cfa-latn-zz', + cfd: 'cfd-latn-ng', + cfg: 'cfg-latn-ng', + cfm: 'cfm-latn-mm', + 'cfm-beng': 'cfm-beng-in', + cga: 'cga-latn-pg', + cgc: 'cgc-latn-ph', + cgg: 'cgg-latn-ug', + cgk: 'cgk-tibt-bt', + ch: 'ch-latn-gu', + chb: 'chb-latn-co', + chd: 'chd-latn-mx', + chf: 'chf-latn-mx', + chg: 'chg-arab-tm', + chh: 'chh-latn-us', + chj: 'chj-latn-mx', + chk: 'chk-latn-fm', + chl: 'chl-latn-us', + chm: 'chm-cyrl-ru', + chn: 'chn-latn-us', + 'chn-dupl': 'chn-dupl-us', + cho: 'cho-latn-us', + chp: 'chp-latn-ca', + chq: 'chq-latn-mx', + chr: 'chr-cher-us', + cht: 'cht-latn-pe', + chw: 'chw-latn-mz', + chx: 'chx-deva-np', + chy: 'chy-latn-us', + chz: 'chz-latn-mx', + cia: 'cia-latn-id', + 'cia-arab': 'cia-arab-id', + 'cia-hang': 'cia-hang-id', + cib: 'cib-latn-bj', + cic: 'cic-latn-us', + cie: 'cie-latn-ng', + cih: 'cih-deva-in', + cim: 'cim-latn-it', + cin: 'cin-latn-br', + cip: 'cip-latn-mx', + cir: 'cir-latn-nc', + ciw: 'ciw-latn-us', + 'ciw-cans': 'ciw-cans-us', + ciy: 'ciy-latn-ve', + cja: 'cja-arab-kh', + cje: 'cje-latn-vn', + cjh: 'cjh-latn-us', + cji: 'cji-cyrl-ru', + cjk: 'cjk-latn-ao', + cjm: 'cjm-cham-vn', + cjn: 'cjn-latn-pg', + cjo: 'cjo-latn-pe', + cjp: 'cjp-latn-cr', + cjs: 'cjs-latn-ru', + 'cjs-cyrl': 'cjs-cyrl-ru', + cjv: 'cjv-latn-zz', + cjy: 'cjy-hans-cn', + 'cjy-hant': 'cjy-hant-cn', + ckb: 'ckb-arab-iq', + ckl: 'ckl-latn-zz', + ckm: 'ckm-latn-hr', + 'ckm-glag': 'ckm-glag-hr', + ckn: 'ckn-latn-mm', + cko: 'cko-latn-zz', + ckq: 'ckq-latn-td', + ckr: 'ckr-latn-pg', + cks: 'cks-latn-nc', + ckt: 'ckt-cyrl-ru', + cku: 'cku-latn-us', + ckv: 'ckv-latn-tw', + ckx: 'ckx-latn-cm', + cky: 'cky-latn-zz', + ckz: 'ckz-latn-gt', + cla: 'cla-latn-zz', + clc: 'clc-latn-ca', + cle: 'cle-latn-mx', + clh: 'clh-arab-pk', + cli: 'cli-latn-gh', + clj: 'clj-latn-mm', + clk: 'clk-latn-in', + 'clk-tibt': 'clk-tibt-cn', + cll: 'cll-latn-gh', + clm: 'clm-latn-us', + clo: 'clo-latn-mx', + clt: 'clt-latn-mm', + clu: 'clu-latn-ph', + clw: 'clw-cyrl-ru', + cly: 'cly-latn-mx', + cma: 'cma-latn-vn', + cme: 'cme-latn-zz', + cmg: 'cmg-soyo-mn', + cmi: 'cmi-latn-co', + cml: 'cml-latn-id', + cmo: 'cmo-latn-vn', + 'cmo-kh': 'cmo-latn-kh', + 'cmo-khmr': 'cmo-khmr-kh', + cmr: 'cmr-latn-mm', + cms: 'cms-latn-it', + cmt: 'cmt-latn-za', + cna: 'cna-tibt-in', + cnb: 'cnb-latn-mm', + cnc: 'cnc-latn-vn', + cng: 'cng-latn-cn', + cnh: 'cnh-latn-mm', + cni: 'cni-latn-pe', + cnk: 'cnk-latn-mm', + cnl: 'cnl-latn-mx', + cnp: 'cnp-hans-cn', + 'cnp-hant': 'cnp-hant-cn', + cnq: 'cnq-latn-cm', + cns: 'cns-latn-id', + cnt: 'cnt-latn-mx', + cnw: 'cnw-latn-mm', + cnx: 'cnx-latn-gb', + co: 'co-latn-fr', + coa: 'coa-latn-au', + cob: 'cob-latn-mx', + coc: 'coc-latn-mx', + cod: 'cod-latn-pe', + coe: 'coe-latn-co', + cof: 'cof-latn-ec', + cog: 'cog-thai-th', + coh: 'coh-latn-ke', + coj: 'coj-latn-mx', + cok: 'cok-latn-mx', + col: 'col-latn-us', + com: 'com-latn-us', + coo: 'coo-latn-ca', + cop: 'cop-copt-eg', + coq: 'coq-latn-us', + cot: 'cot-latn-pe', + cou: 'cou-latn-sn', + cox: 'cox-latn-pe', + coz: 'coz-latn-mx', + cpa: 'cpa-latn-mx', + cpb: 'cpb-latn-pe', + cpc: 'cpc-latn-pe', + cpg: 'cpg-grek-gr', + cpi: 'cpi-latn-nr', + cpn: 'cpn-latn-gh', + cpo: 'cpo-latn-bf', + cps: 'cps-latn-ph', + cpu: 'cpu-latn-pe', + cpx: 'cpx-latn-cn', + cpy: 'cpy-latn-pe', + cqd: 'cqd-latn-cn', + cr: 'cr-cans-ca', + crb: 'crb-latn-vc', + crc: 'crc-latn-vu', + crd: 'crd-latn-us', + crf: 'crf-latn-co', + crg: 'crg-latn-ca', + crh: 'crh-cyrl-ua', + cri: 'cri-latn-st', + crj: 'crj-cans-ca', + 'crj-latn': 'crj-latn-ca', + crk: 'crk-cans-ca', + crl: 'crl-cans-ca', + crm: 'crm-cans-ca', + crn: 'crn-latn-mx', + cro: 'cro-latn-us', + crq: 'crq-latn-ar', + crs: 'crs-latn-sc', + crt: 'crt-latn-ar', + crv: 'crv-latn-in', + crw: 'crw-latn-vn', + crx: 'crx-latn-ca', + 'crx-cans': 'crx-cans-ca', + cry: 'cry-latn-ng', + crz: 'crz-latn-us', + cs: 'cs-latn-cz', + csa: 'csa-latn-mx', + csb: 'csb-latn-pl', + csh: 'csh-mymr-mm', + 'csh-latn': 'csh-latn-mm', + csj: 'csj-latn-mm', + csk: 'csk-latn-sn', + csm: 'csm-latn-us', + cso: 'cso-latn-mx', + csp: 'csp-hans-cn', + 'csp-hant': 'csp-hant-cn', + css: 'css-latn-us', + cst: 'cst-latn-us', + csv: 'csv-latn-mm', + csw: 'csw-cans-ca', + csy: 'csy-latn-mm', + csz: 'csz-latn-us', + cta: 'cta-latn-mx', + ctc: 'ctc-latn-us', + ctd: 'ctd-pauc-mm', + cte: 'cte-latn-mx', + ctg: 'ctg-beng-bd', + 'ctg-arab': 'ctg-arab-bd', + 'ctg-latn': 'ctg-latn-bd', + cth: 'cth-latn-mm', + ctl: 'ctl-latn-mx', + ctm: 'ctm-latn-us', + ctn: 'ctn-deva-np', + cto: 'cto-latn-co', + ctp: 'ctp-latn-mx', + cts: 'cts-latn-ph', + ctt: 'ctt-taml-in', + ctu: 'ctu-latn-mx', + ctz: 'ctz-latn-mx', + cu: 'cu-cyrl-ru', + 'cu-glag': 'cu-glag-bg', + cua: 'cua-latn-vn', + cub: 'cub-latn-co', + cuc: 'cuc-latn-mx', + cuh: 'cuh-latn-ke', + cui: 'cui-latn-co', + cuj: 'cuj-latn-pe', + cuk: 'cuk-latn-pa', + cul: 'cul-latn-br', + cuo: 'cuo-latn-ve', + cup: 'cup-latn-us', + cut: 'cut-latn-mx', + cuu: 'cuu-lana-cn', + cuv: 'cuv-latn-cm', + cux: 'cux-latn-mx', + cv: 'cv-cyrl-ru', + cvg: 'cvg-latn-in', + 'cvg-tibt': 'cvg-tibt-in', + cvn: 'cvn-latn-mx', + cwa: 'cwa-latn-tz', + cwb: 'cwb-latn-mz', + cwe: 'cwe-latn-tz', + cwg: 'cwg-latn-my', + cwt: 'cwt-latn-sn', + cy: 'cy-latn-gb', + cya: 'cya-latn-mx', + cyb: 'cyb-latn-bo', + cyo: 'cyo-latn-ph', + czh: 'czh-hans-cn', + 'czh-hant': 'czh-hant-cn', + czk: 'czk-hebr-cz', + czn: 'czn-latn-mx', + czt: 'czt-latn-mm', + da: 'da-latn-dk', + daa: 'daa-latn-td', + dac: 'dac-latn-pg', + dad: 'dad-latn-zz', + dae: 'dae-latn-cm', + daf: 'daf-latn-ci', + dag: 'dag-latn-zz', + dah: 'dah-latn-zz', + dai: 'dai-latn-td', + daj: 'daj-latn-sd', + dak: 'dak-latn-us', + dal: 'dal-latn-ke', + dam: 'dam-latn-ng', + dao: 'dao-latn-mm', + daq: 'daq-deva-in', + dar: 'dar-cyrl-ru', + das: 'das-latn-ci', + dau: 'dau-latn-td', + dav: 'dav-latn-ke', + daw: 'daw-latn-ph', + dax: 'dax-latn-au', + daz: 'daz-latn-id', + dba: 'dba-latn-ml', + dbb: 'dbb-latn-ng', + dbd: 'dbd-latn-zz', + dbe: 'dbe-latn-id', + dbf: 'dbf-latn-id', + dbg: 'dbg-latn-ml', + dbi: 'dbi-latn-ng', + dbj: 'dbj-latn-my', + 'dbj-arab': 'dbj-arab-my', + dbl: 'dbl-latn-au', + dbm: 'dbm-latn-ng', + dbn: 'dbn-latn-id', + dbo: 'dbo-latn-ng', + dbp: 'dbp-latn-ng', + dbq: 'dbq-latn-zz', + dbt: 'dbt-latn-ml', + dbu: 'dbu-latn-ml', + dbv: 'dbv-latn-ng', + dbw: 'dbw-latn-ml', + dby: 'dby-latn-pg', + dcc: 'dcc-arab-in', + dcr: 'dcr-latn-vi', + dda: 'dda-latn-au', + ddd: 'ddd-latn-ss', + dde: 'dde-latn-cg', + ddg: 'ddg-latn-tl', + ddi: 'ddi-latn-pg', + ddj: 'ddj-latn-au', + ddn: 'ddn-latn-zz', + ddo: 'ddo-cyrl-ru', + ddr: 'ddr-latn-au', + dds: 'dds-latn-ml', + ddw: 'ddw-latn-id', + de: 'de-latn-de', + dec: 'dec-latn-sd', + ded: 'ded-latn-zz', + dee: 'dee-latn-lr', + def: 'def-arab-ir', + deg: 'deg-latn-ng', + deh: 'deh-arab-pk', + dei: 'dei-latn-id', + dek: 'dek-latn-cm', + del: 'del-latn-us', + dem: 'dem-latn-id', + den: 'den-latn-ca', + deq: 'deq-latn-cf', + der: 'der-beng-in', + 'der-latn': 'der-latn-in', + des: 'des-latn-br', + dev: 'dev-latn-pg', + dez: 'dez-latn-cd', + dga: 'dga-latn-zz', + dgb: 'dgb-latn-ml', + dgc: 'dgc-latn-ph', + dgd: 'dgd-latn-bf', + dge: 'dge-latn-pg', + dgg: 'dgg-latn-pg', + dgh: 'dgh-latn-zz', + dgi: 'dgi-latn-zz', + dgk: 'dgk-latn-cf', + dgl: 'dgl-arab-zz', + dgn: 'dgn-latn-au', + dgr: 'dgr-latn-ca', + dgs: 'dgs-latn-bf', + dgt: 'dgt-latn-au', + dgw: 'dgw-latn-au', + dgx: 'dgx-latn-pg', + dgz: 'dgz-latn-zz', + dhg: 'dhg-latn-au', + dhi: 'dhi-deva-np', + dhl: 'dhl-latn-au', + dhm: 'dhm-latn-ao', + dhn: 'dhn-gujr-in', + dho: 'dho-deva-in', + dhr: 'dhr-latn-au', + dhs: 'dhs-latn-tz', + dhu: 'dhu-latn-au', + dhv: 'dhv-latn-nc', + dhw: 'dhw-deva-np', + dhx: 'dhx-latn-au', + dia: 'dia-latn-zz', + dib: 'dib-latn-ss', + dic: 'dic-latn-ci', + did: 'did-latn-ss', + dif: 'dif-latn-au', + dig: 'dig-latn-ke', + dih: 'dih-latn-mx', + dii: 'dii-latn-cm', + dij: 'dij-latn-id', + dil: 'dil-latn-sd', + din: 'din-latn-ss', + 'din-arab': 'din-arab-ss', + dio: 'dio-latn-ng', + dip: 'dip-latn-ss', + dir: 'dir-latn-ng', + dis: 'dis-latn-in', + 'dis-beng': 'dis-beng-in', + diu: 'diu-latn-na', + diw: 'diw-latn-ss', + dix: 'dix-latn-vu', + diy: 'diy-latn-id', + diz: 'diz-latn-cd', + dja: 'dja-latn-au', + djb: 'djb-latn-au', + djc: 'djc-latn-td', + djd: 'djd-latn-au', + dje: 'dje-latn-ne', + djf: 'djf-latn-au', + dji: 'dji-latn-au', + djj: 'djj-latn-au', + djk: 'djk-latn-sr', + djm: 'djm-latn-ml', + djn: 'djn-latn-au', + djo: 'djo-latn-id', + djr: 'djr-latn-au', + dju: 'dju-latn-pg', + djw: 'djw-latn-au', + dka: 'dka-tibt-bt', + dkg: 'dkg-latn-ng', + dkk: 'dkk-latn-id', + dkr: 'dkr-latn-my', + dks: 'dks-latn-ss', + dkx: 'dkx-latn-cm', + dlg: 'dlg-cyrl-ru', + dlm: 'dlm-latn-hr', + dln: 'dln-latn-in', + dma: 'dma-latn-ga', + dmb: 'dmb-latn-ml', + dmc: 'dmc-latn-pg', + dmd: 'dmd-latn-au', + dme: 'dme-latn-cm', + dmf: 'dmf-medf-ng', + dmg: 'dmg-latn-my', + dmk: 'dmk-arab-pk', + dml: 'dml-arab-pk', + dmm: 'dmm-latn-cm', + dmo: 'dmo-latn-cm', + dmr: 'dmr-latn-id', + dms: 'dms-latn-id', + dmu: 'dmu-latn-id', + dmv: 'dmv-latn-my', + dmw: 'dmw-latn-au', + dmx: 'dmx-latn-mz', + dmy: 'dmy-latn-id', + dna: 'dna-latn-id', + dnd: 'dnd-latn-pg', + dne: 'dne-latn-tz', + dng: 'dng-cyrl-kg', + 'dng-arab': 'dng-arab-kg', + dni: 'dni-latn-id', + dnj: 'dnj-latn-ci', + dnk: 'dnk-latn-id', + dnn: 'dnn-latn-bf', + dno: 'dno-latn-cd', + dnr: 'dnr-latn-pg', + dnt: 'dnt-latn-id', + dnu: 'dnu-mymr-mm', + dnv: 'dnv-mymr-mm', + dnw: 'dnw-latn-id', + dny: 'dny-latn-br', + doa: 'doa-latn-pg', + dob: 'dob-latn-zz', + doc: 'doc-latn-cn', + doe: 'doe-latn-tz', + dof: 'dof-latn-pg', + doh: 'doh-latn-ng', + doi: 'doi-deva-in', + dok: 'dok-latn-id', + dol: 'dol-latn-pg', + don: 'don-latn-pg', + doo: 'doo-latn-cd', + dop: 'dop-latn-zz', + dor: 'dor-latn-sb', + dos: 'dos-latn-bf', + dot: 'dot-latn-ng', + dov: 'dov-latn-zw', + dow: 'dow-latn-zz', + dox: 'dox-ethi-et', + doy: 'doy-latn-gh', + dpp: 'dpp-latn-my', + drc: 'drc-latn-pt', + dre: 'dre-tibt-np', + drg: 'drg-latn-my', + drh: 'drh-mong-cn', + dri: 'dri-latn-zz', + drl: 'drl-latn-au', + drn: 'drn-latn-id', + dro: 'dro-latn-my', + drq: 'drq-deva-np', + drs: 'drs-ethi-zz', + drt: 'drt-latn-nl', + dru: 'dru-latn-tw', + dry: 'dry-deva-np', + dsb: 'dsb-latn-de', + dsh: 'dsh-latn-ke', + dsi: 'dsi-latn-td', + dsn: 'dsn-latn-id', + dso: 'dso-orya-in', + dsq: 'dsq-latn-ml', + 'dsq-arab': 'dsq-arab-ml', + dta: 'dta-latn-cn', + 'dta-cyrl': 'dta-cyrl-cn', + 'dta-hans': 'dta-hans-cn', + dtb: 'dtb-latn-my', + dtd: 'dtd-latn-ca', + dth: 'dth-latn-au', + dti: 'dti-latn-ml', + dtk: 'dtk-latn-ml', + dtm: 'dtm-latn-ml', + dto: 'dto-latn-ml', + dtp: 'dtp-latn-my', + dtr: 'dtr-latn-my', + dts: 'dts-latn-zz', + dtt: 'dtt-latn-ml', + dtu: 'dtu-latn-ml', + dty: 'dty-deva-np', + dua: 'dua-latn-cm', + dub: 'dub-gujr-in', + duc: 'duc-latn-zz', + dud: 'dud-latn-zz', + due: 'due-latn-ph', + duf: 'duf-latn-nc', + dug: 'dug-latn-zz', + duh: 'duh-deva-in', + 'duh-gujr': 'duh-gujr-in', + dui: 'dui-latn-pg', + duk: 'duk-latn-pg', + dul: 'dul-latn-ph', + dum: 'dum-latn-nl', + dun: 'dun-latn-id', + duo: 'duo-latn-ph', + dup: 'dup-latn-id', + duq: 'duq-latn-id', + dur: 'dur-latn-cm', + dus: 'dus-deva-np', + duu: 'duu-latn-cn', + duv: 'duv-latn-id', + duw: 'duw-latn-id', + dux: 'dux-latn-ml', + duy: 'duy-latn-ph', + duz: 'duz-latn-cm', + dv: 'dv-thaa-mv', + dva: 'dva-latn-zz', + dwa: 'dwa-latn-ng', + dwk: 'dwk-orya-in', + dwr: 'dwr-latn-et', + 'dwr-ethi': 'dwr-ethi-et', + dws: 'dws-latn-001', + dwu: 'dwu-latn-au', + dww: 'dww-latn-zz', + dwy: 'dwy-latn-au', + dwz: 'dwz-deva-np', + dya: 'dya-latn-bf', + dyb: 'dyb-latn-au', + dyd: 'dyd-latn-au', + dyg: 'dyg-latn-ph', + dyi: 'dyi-latn-ci', + dym: 'dym-latn-ml', + dyn: 'dyn-latn-au', + dyo: 'dyo-latn-sn', + dyu: 'dyu-latn-bf', + dyy: 'dyy-latn-au', + dz: 'dz-tibt-bt', + dza: 'dza-latn-ng', + dze: 'dze-latn-au', + dzg: 'dzg-latn-zz', + dzl: 'dzl-tibt-bt', + dzn: 'dzn-latn-cd', + eaa: 'eaa-latn-au', + ebc: 'ebc-latn-id', + ebg: 'ebg-latn-ng', + ebk: 'ebk-latn-ph', + ebo: 'ebo-latn-cg', + ebr: 'ebr-latn-ci', + ebu: 'ebu-latn-ke', + ecr: 'ecr-grek-gr', + ecy: 'ecy-cprt-cy', + ee: 'ee-latn-gh', + efa: 'efa-latn-ng', + efe: 'efe-latn-cd', + efi: 'efi-latn-ng', + ega: 'ega-latn-ci', + egl: 'egl-latn-it', + egm: 'egm-latn-tz', + ego: 'ego-latn-ng', + egy: 'egy-egyp-eg', + ehu: 'ehu-latn-ng', + eip: 'eip-latn-id', + eit: 'eit-latn-pg', + eiv: 'eiv-latn-pg', + eja: 'eja-latn-gw', + eka: 'eka-latn-zz', + eke: 'eke-latn-ng', + ekg: 'ekg-latn-id', + eki: 'eki-latn-ng', + ekl: 'ekl-latn-bd', + ekm: 'ekm-latn-cm', + eko: 'eko-latn-mz', + 'eko-arab': 'eko-arab-mz', + ekp: 'ekp-latn-ng', + ekr: 'ekr-latn-ng', + eky: 'eky-kali-mm', + el: 'el-grek-gr', + ele: 'ele-latn-pg', + elk: 'elk-latn-pg', + elm: 'elm-latn-ng', + elo: 'elo-latn-ke', + elu: 'elu-latn-pg', + ema: 'ema-latn-zz', + emb: 'emb-latn-id', + eme: 'eme-latn-gf', + emg: 'emg-deva-np', + emi: 'emi-latn-zz', + emm: 'emm-latn-mx', + emn: 'emn-latn-cm', + emp: 'emp-latn-pa', + ems: 'ems-latn-us', + 'ems-cyrl': 'ems-cyrl-us', + emu: 'emu-deva-in', + emw: 'emw-latn-id', + emx: 'emx-latn-fr', + emz: 'emz-latn-cm', + en: 'en-latn-us', + 'en-shaw': 'en-shaw-gb', + ena: 'ena-latn-pg', + enb: 'enb-latn-ke', + enc: 'enc-latn-vn', + end: 'end-latn-id', + enf: 'enf-cyrl-ru', + enh: 'enh-cyrl-ru', + enl: 'enl-latn-py', + enm: 'enm-latn-gb', + enn: 'enn-latn-zz', + eno: 'eno-latn-id', + enq: 'enq-latn-zz', + enr: 'enr-latn-id', + env: 'env-latn-ng', + enw: 'enw-latn-ng', + enx: 'enx-latn-py', + eo: 'eo-latn-001', + eot: 'eot-latn-ci', + epi: 'epi-latn-ng', + era: 'era-taml-in', + erg: 'erg-latn-vu', + erh: 'erh-latn-ng', + eri: 'eri-latn-zz', + erk: 'erk-latn-vu', + err: 'err-latn-au', + ert: 'ert-latn-id', + erw: 'erw-latn-id', + es: 'es-latn-es', + ese: 'ese-latn-bo', + esg: 'esg-gonm-in', + esh: 'esh-arab-ir', + esi: 'esi-latn-us', + esm: 'esm-latn-ci', + ess: 'ess-latn-us', + 'ess-cyrl': 'ess-cyrl-us', + esu: 'esu-latn-us', + esy: 'esy-latn-ph', + et: 'et-latn-ee', + etb: 'etb-latn-ng', + etn: 'etn-latn-vu', + eto: 'eto-latn-cm', + etr: 'etr-latn-zz', + ets: 'ets-latn-ng', + ett: 'ett-ital-it', + etu: 'etu-latn-zz', + etx: 'etx-latn-zz', + etz: 'etz-latn-id', + eu: 'eu-latn-es', + eve: 'eve-cyrl-ru', + evh: 'evh-latn-ng', + evn: 'evn-cyrl-ru', + 'evn-latn': 'evn-latn-cn', + 'evn-mong': 'evn-mong-cn', + ewo: 'ewo-latn-cm', + ext: 'ext-latn-es', + eya: 'eya-latn-us', + eyo: 'eyo-latn-ke', + eza: 'eza-latn-zz', + eze: 'eze-latn-ng', + fa: 'fa-arab-ir', + faa: 'faa-latn-zz', + fab: 'fab-latn-zz', + fad: 'fad-latn-pg', + faf: 'faf-latn-sb', + fag: 'fag-latn-zz', + fah: 'fah-latn-ng', + fai: 'fai-latn-zz', + faj: 'faj-latn-pg', + fak: 'fak-latn-cm', + fal: 'fal-latn-cm', + fam: 'fam-latn-ng', + fan: 'fan-latn-gq', + fap: 'fap-latn-sn', + far: 'far-latn-sb', + fau: 'fau-latn-id', + fax: 'fax-latn-es', + fay: 'fay-arab-ir', + faz: 'faz-arab-ir', + fbl: 'fbl-latn-ph', + fer: 'fer-latn-ss', + ff: 'ff-latn-sn', + 'ff-adlm': 'ff-adlm-gn', + ffi: 'ffi-latn-zz', + ffm: 'ffm-latn-ml', + fgr: 'fgr-latn-td', + fi: 'fi-latn-fi', + fia: 'fia-arab-sd', + fie: 'fie-latn-ng', + fif: 'fif-latn-sa', + fil: 'fil-latn-ph', + fip: 'fip-latn-tz', + fir: 'fir-latn-ng', + fit: 'fit-latn-se', + fiw: 'fiw-latn-pg', + fj: 'fj-latn-fj', + fkk: 'fkk-latn-ng', + fkv: 'fkv-latn-no', + fla: 'fla-latn-us', + flh: 'flh-latn-id', + fli: 'fli-latn-ng', + fll: 'fll-latn-cm', + fln: 'fln-latn-au', + flr: 'flr-latn-zz', + fly: 'fly-latn-za', + fmp: 'fmp-latn-zz', + fmu: 'fmu-deva-in', + fnb: 'fnb-latn-vu', + fng: 'fng-latn-za', + fni: 'fni-latn-td', + fo: 'fo-latn-fo', + fod: 'fod-latn-zz', + foi: 'foi-latn-pg', + fom: 'fom-latn-cd', + fon: 'fon-latn-bj', + for: 'for-latn-zz', + fos: 'fos-latn-tw', + fpe: 'fpe-latn-zz', + fqs: 'fqs-latn-zz', + fr: 'fr-latn-fr', + frc: 'frc-latn-us', + frd: 'frd-latn-id', + frk: 'frk-latn-de', + frm: 'frm-latn-fr', + fro: 'fro-latn-fr', + frp: 'frp-latn-fr', + frq: 'frq-latn-pg', + frr: 'frr-latn-de', + frs: 'frs-latn-de', + frt: 'frt-latn-vu', + fub: 'fub-arab-cm', + fud: 'fud-latn-wf', + fue: 'fue-latn-zz', + fuf: 'fuf-latn-gn', + fuh: 'fuh-latn-zz', + fui: 'fui-latn-td', + fum: 'fum-latn-ng', + fun: 'fun-latn-br', + fuq: 'fuq-latn-ne', + fur: 'fur-latn-it', + fut: 'fut-latn-vu', + fuu: 'fuu-latn-cd', + fuv: 'fuv-latn-ng', + fuy: 'fuy-latn-zz', + fvr: 'fvr-latn-sd', + fwa: 'fwa-latn-nc', + fwe: 'fwe-latn-na', + fy: 'fy-latn-nl', + ga: 'ga-latn-ie', + gaa: 'gaa-latn-gh', + gab: 'gab-latn-td', + gac: 'gac-latn-in', + 'gac-deva': 'gac-deva-in', + gad: 'gad-latn-ph', + gae: 'gae-latn-ve', + gaf: 'gaf-latn-zz', + gag: 'gag-latn-md', + gah: 'gah-latn-zz', + gai: 'gai-latn-pg', + gaj: 'gaj-latn-zz', + gak: 'gak-latn-id', + gal: 'gal-latn-tl', + gam: 'gam-latn-zz', + gan: 'gan-hans-cn', + gao: 'gao-latn-pg', + gap: 'gap-latn-pg', + gaq: 'gaq-orya-in', + gar: 'gar-latn-pg', + gas: 'gas-gujr-in', + gat: 'gat-latn-pg', + gau: 'gau-telu-in', + gaw: 'gaw-latn-zz', + gax: 'gax-latn-et', + 'gax-ethi': 'gax-ethi-et', + gay: 'gay-latn-id', + gba: 'gba-latn-zz', + gbb: 'gbb-latn-au', + gbd: 'gbd-latn-au', + gbe: 'gbe-latn-pg', + gbf: 'gbf-latn-zz', + gbg: 'gbg-latn-cf', + gbh: 'gbh-latn-bj', + gbi: 'gbi-latn-id', + gbj: 'gbj-orya-in', + gbk: 'gbk-deva-in', + 'gbk-takr': 'gbk-takr-in', + gbl: 'gbl-gujr-in', + 'gbl-deva': 'gbl-deva-in', + gbm: 'gbm-deva-in', + gbn: 'gbn-latn-ss', + gbp: 'gbp-latn-cf', + gbq: 'gbq-latn-cf', + gbr: 'gbr-latn-ng', + gbs: 'gbs-latn-bj', + gbu: 'gbu-latn-au', + gbv: 'gbv-latn-cf', + gbw: 'gbw-latn-au', + gbx: 'gbx-latn-bj', + gby: 'gby-latn-zz', + gbz: 'gbz-arab-ir', + gcc: 'gcc-latn-pg', + gcd: 'gcd-latn-au', + gcf: 'gcf-latn-gp', + gcl: 'gcl-latn-gd', + gcn: 'gcn-latn-pg', + gcr: 'gcr-latn-gf', + gct: 'gct-latn-ve', + gd: 'gd-latn-gb', + gdb: 'gdb-orya-in', + 'gdb-telu': 'gdb-telu-in', + gdc: 'gdc-latn-au', + gdd: 'gdd-latn-pg', + gde: 'gde-latn-zz', + gdf: 'gdf-latn-ng', + gdg: 'gdg-latn-ph', + gdh: 'gdh-latn-au', + gdi: 'gdi-latn-cf', + gdj: 'gdj-latn-au', + gdk: 'gdk-latn-td', + gdl: 'gdl-latn-et', + 'gdl-ethi': 'gdl-ethi-et', + gdm: 'gdm-latn-td', + gdn: 'gdn-latn-zz', + gdo: 'gdo-cyrl-ru', + gdq: 'gdq-latn-ye', + gdr: 'gdr-latn-zz', + gdt: 'gdt-latn-au', + gdu: 'gdu-latn-ng', + gdx: 'gdx-deva-in', + gea: 'gea-latn-ng', + geb: 'geb-latn-zz', + gec: 'gec-latn-lr', + ged: 'ged-latn-ng', + gef: 'gef-latn-id', + geg: 'geg-latn-ng', + geh: 'geh-latn-ca', + gei: 'gei-latn-id', + gej: 'gej-latn-zz', + gek: 'gek-latn-ng', + gel: 'gel-latn-zz', + geq: 'geq-latn-cf', + ges: 'ges-latn-id', + gev: 'gev-latn-ga', + gew: 'gew-latn-ng', + gex: 'gex-latn-so', + gey: 'gey-latn-cd', + gez: 'gez-ethi-et', + gfk: 'gfk-latn-zz', + gga: 'gga-latn-sb', + ggb: 'ggb-latn-lr', + ggd: 'ggd-latn-au', + gge: 'gge-latn-au', + ggg: 'ggg-arab-pk', + ggk: 'ggk-latn-au', + ggl: 'ggl-latn-pg', + ggn: 'ggn-deva-np', + ggt: 'ggt-latn-pg', + ggu: 'ggu-latn-ci', + ggw: 'ggw-latn-pg', + gha: 'gha-arab-ly', + 'gha-latn': 'gha-latn-ly', + 'gha-tfng': 'gha-tfng-ly', + ghc: 'ghc-latn-gb', + ghe: 'ghe-deva-np', + ghk: 'ghk-latn-mm', + ghn: 'ghn-latn-sb', + ghr: 'ghr-arab-pk', + ghs: 'ghs-latn-zz', + ght: 'ght-tibt-np', + gia: 'gia-latn-au', + gib: 'gib-latn-ng', + gic: 'gic-latn-za', + gid: 'gid-latn-cm', + gie: 'gie-latn-ci', + gig: 'gig-arab-pk', + gih: 'gih-latn-au', + gil: 'gil-latn-ki', + gim: 'gim-latn-zz', + gin: 'gin-cyrl-ru', + gip: 'gip-latn-pg', + giq: 'giq-latn-vn', + gir: 'gir-latn-vn', + gis: 'gis-latn-cm', + git: 'git-latn-ca', + gix: 'gix-latn-cd', + giy: 'giy-latn-au', + giz: 'giz-latn-cm', + gjk: 'gjk-arab-pk', + gjm: 'gjm-latn-au', + gjn: 'gjn-latn-zz', + gjr: 'gjr-latn-au', + gju: 'gju-arab-pk', + gka: 'gka-latn-pg', + gkd: 'gkd-latn-pg', + gke: 'gke-latn-cm', + gkn: 'gkn-latn-zz', + gko: 'gko-latn-au', + gkp: 'gkp-latn-zz', + gku: 'gku-latn-za', + gl: 'gl-latn-es', + glb: 'glb-latn-ng', + glc: 'glc-latn-td', + gld: 'gld-cyrl-ru', + glh: 'glh-arab-af', + glj: 'glj-latn-td', + glk: 'glk-arab-ir', + gll: 'gll-latn-au', + glo: 'glo-latn-ng', + glr: 'glr-latn-lr', + glu: 'glu-latn-td', + glw: 'glw-latn-ng', + gma: 'gma-latn-au', + gmb: 'gmb-latn-sb', + gmd: 'gmd-latn-ng', + gmg: 'gmg-latn-pg', + gmh: 'gmh-latn-de', + gmm: 'gmm-latn-zz', + gmn: 'gmn-latn-cm', + gmr: 'gmr-latn-au', + gmu: 'gmu-latn-pg', + gmv: 'gmv-ethi-zz', + gmx: 'gmx-latn-tz', + gmy: 'gmy-linb-gr', + gmz: 'gmz-latn-ng', + gn: 'gn-latn-py', + gna: 'gna-latn-bf', + gnb: 'gnb-latn-in', + gnc: 'gnc-latn-es', + gnd: 'gnd-latn-zz', + gne: 'gne-latn-ng', + gng: 'gng-latn-zz', + gnh: 'gnh-latn-ng', + gni: 'gni-latn-au', + gnj: 'gnj-latn-ci', + gnk: 'gnk-latn-bw', + gnl: 'gnl-latn-au', + gnm: 'gnm-latn-pg', + gnn: 'gnn-latn-au', + gnq: 'gnq-latn-my', + gnr: 'gnr-latn-au', + gnt: 'gnt-latn-pg', + gnu: 'gnu-latn-pg', + gnw: 'gnw-latn-bo', + gnz: 'gnz-latn-cf', + goa: 'goa-latn-ci', + gob: 'gob-latn-co', + goc: 'goc-latn-pg', + god: 'god-latn-zz', + goe: 'goe-tibt-bt', + gof: 'gof-ethi-zz', + gog: 'gog-latn-tz', + goh: 'goh-latn-de', + goi: 'goi-latn-zz', + gok: 'gok-deva-in', + gol: 'gol-latn-lr', + gom: 'gom-deva-in', + gon: 'gon-telu-in', + goo: 'goo-latn-fj', + gop: 'gop-latn-id', + goq: 'goq-latn-id', + gor: 'gor-latn-id', + gos: 'gos-latn-nl', + got: 'got-goth-ua', + gou: 'gou-latn-cm', + gov: 'gov-latn-ci', + gow: 'gow-latn-tz', + gox: 'gox-latn-cd', + goy: 'goy-latn-td', + gpa: 'gpa-latn-ng', + gpe: 'gpe-latn-gh', + gpn: 'gpn-latn-pg', + gqa: 'gqa-latn-ng', + gqn: 'gqn-latn-br', + gqr: 'gqr-latn-td', + gra: 'gra-deva-in', + 'gra-gujr': 'gra-gujr-in', + grb: 'grb-latn-zz', + grc: 'grc-cprt-cy', + 'grc-linb': 'grc-linb-gr', + grd: 'grd-latn-ng', + grg: 'grg-latn-pg', + grh: 'grh-latn-ng', + gri: 'gri-latn-sb', + grj: 'grj-latn-lr', + grm: 'grm-latn-my', + grq: 'grq-latn-pg', + grs: 'grs-latn-id', + grt: 'grt-beng-in', + gru: 'gru-ethi-et', + 'gru-latn': 'gru-latn-et', + grv: 'grv-latn-lr', + grw: 'grw-latn-zz', + grx: 'grx-latn-pg', + gry: 'gry-latn-lr', + grz: 'grz-latn-pg', + gsl: 'gsl-latn-sn', + gsn: 'gsn-latn-pg', + gso: 'gso-latn-cf', + gsp: 'gsp-latn-pg', + gsw: 'gsw-latn-ch', + gta: 'gta-latn-br', + gtu: 'gtu-latn-au', + gu: 'gu-gujr-in', + gua: 'gua-latn-ng', + gub: 'gub-latn-br', + guc: 'guc-latn-co', + gud: 'gud-latn-zz', + gue: 'gue-latn-au', + guf: 'guf-latn-au', + guh: 'guh-latn-co', + gui: 'gui-latn-bo', + guk: 'guk-latn-et', + 'guk-ethi': 'guk-ethi-et', + gul: 'gul-latn-us', + gum: 'gum-latn-co', + gun: 'gun-latn-br', + guo: 'guo-latn-co', + gup: 'gup-latn-au', + guq: 'guq-latn-py', + gur: 'gur-latn-gh', + gut: 'gut-latn-cr', + guu: 'guu-latn-ve', + guw: 'guw-latn-zz', + gux: 'gux-latn-zz', + guz: 'guz-latn-ke', + gv: 'gv-latn-im', + gva: 'gva-latn-py', + gvc: 'gvc-latn-br', + gve: 'gve-latn-pg', + gvf: 'gvf-latn-zz', + gvj: 'gvj-latn-br', + gvl: 'gvl-latn-td', + gvm: 'gvm-latn-ng', + gvn: 'gvn-latn-au', + gvo: 'gvo-latn-br', + gvp: 'gvp-latn-br', + gvr: 'gvr-deva-np', + gvs: 'gvs-latn-zz', + gvy: 'gvy-latn-au', + gwa: 'gwa-latn-ci', + gwb: 'gwb-latn-ng', + gwc: 'gwc-arab-zz', + gwd: 'gwd-latn-et', + gwe: 'gwe-latn-tz', + gwf: 'gwf-arab-pk', + gwg: 'gwg-latn-ng', + gwi: 'gwi-latn-ca', + gwj: 'gwj-latn-bw', + gwm: 'gwm-latn-au', + gwn: 'gwn-latn-ng', + gwr: 'gwr-latn-ug', + gwt: 'gwt-arab-zz', + gwu: 'gwu-latn-au', + gww: 'gww-latn-au', + gwx: 'gwx-latn-gh', + gxx: 'gxx-latn-ci', + gyb: 'gyb-latn-pg', + gyd: 'gyd-latn-au', + gye: 'gye-latn-ng', + gyf: 'gyf-latn-au', + gyg: 'gyg-latn-cf', + gyi: 'gyi-latn-zz', + gyl: 'gyl-latn-et', + 'gyl-ethi': 'gyl-ethi-et', + gym: 'gym-latn-pa', + gyn: 'gyn-latn-gy', + gyo: 'gyo-deva-np', + gyr: 'gyr-latn-bo', + gyy: 'gyy-latn-au', + gyz: 'gyz-latn-ng', + gza: 'gza-latn-sd', + gzi: 'gzi-arab-ir', + gzn: 'gzn-latn-id', + ha: 'ha-latn-ng', + 'ha-cm': 'ha-arab-cm', + 'ha-sd': 'ha-arab-sd', + haa: 'haa-latn-us', + hac: 'hac-arab-ir', + had: 'had-latn-id', + hae: 'hae-latn-et', + hag: 'hag-latn-zz', + hah: 'hah-latn-pg', + hai: 'hai-latn-ca', + haj: 'haj-latn-in', + 'haj-beng': 'haj-beng-in', + hak: 'hak-hans-cn', + hal: 'hal-latn-vn', + ham: 'ham-latn-zz', + han: 'han-latn-tz', + hao: 'hao-latn-pg', + hap: 'hap-latn-id', + haq: 'haq-latn-tz', + har: 'har-ethi-et', + 'har-arab': 'har-arab-et', + 'har-latn': 'har-latn-et', + has: 'has-latn-ca', + hav: 'hav-latn-cd', + haw: 'haw-latn-us', + hax: 'hax-latn-ca', + hay: 'hay-latn-tz', + haz: 'haz-arab-af', + hba: 'hba-latn-cd', + hbb: 'hbb-latn-zz', + hbn: 'hbn-latn-sd', + hbo: 'hbo-hebr-il', + hbu: 'hbu-latn-tl', + hch: 'hch-latn-mx', + hdy: 'hdy-ethi-zz', + he: 'he-hebr-il', + hed: 'hed-latn-td', + heg: 'heg-latn-id', + heh: 'heh-latn-tz', + hei: 'hei-latn-ca', + hem: 'hem-latn-cd', + hgm: 'hgm-latn-na', + hgw: 'hgw-latn-pg', + hhi: 'hhi-latn-pg', + hhr: 'hhr-latn-sn', + hhy: 'hhy-latn-zz', + hi: 'hi-deva-in', + 'hi-latn': 'hi-latn-in', + hia: 'hia-latn-zz', + hib: 'hib-latn-pe', + hid: 'hid-latn-us', + hif: 'hif-latn-fj', + hig: 'hig-latn-zz', + hih: 'hih-latn-zz', + hii: 'hii-takr-in', + 'hii-deva': 'hii-deva-in', + hij: 'hij-latn-cm', + hik: 'hik-latn-id', + hil: 'hil-latn-ph', + hio: 'hio-latn-bw', + hir: 'hir-latn-br', + hit: 'hit-xsux-tr', + hiw: 'hiw-latn-vu', + hix: 'hix-latn-br', + hji: 'hji-latn-id', + hka: 'hka-latn-tz', + hke: 'hke-latn-cd', + hkh: 'hkh-arab-in', + 'hkh-deva': 'hkh-deva-in', + 'hkh-latn': 'hkh-latn-in', + hkk: 'hkk-latn-pg', + hla: 'hla-latn-zz', + hlb: 'hlb-deva-in', + hld: 'hld-latn-vn', + hlt: 'hlt-latn-mm', + hlu: 'hlu-hluw-tr', + hma: 'hma-latn-cn', + hmb: 'hmb-latn-ml', + hmd: 'hmd-plrd-cn', + hmf: 'hmf-latn-vn', + hmj: 'hmj-bopo-cn', + hmm: 'hmm-latn-cn', + hmn: 'hmn-latn-cn', + 'hmn-bopo': 'hmn-bopo-cn', + 'hmn-hmng': 'hmn-hmng-cn', + hmp: 'hmp-latn-cn', + hmq: 'hmq-bopo-cn', + hmr: 'hmr-latn-in', + hms: 'hms-latn-cn', + hmt: 'hmt-latn-zz', + hmu: 'hmu-latn-id', + hmv: 'hmv-latn-vn', + hmw: 'hmw-latn-cn', + hmy: 'hmy-latn-cn', + hmz: 'hmz-latn-cn', + 'hmz-plrd': 'hmz-plrd-cn', + hna: 'hna-latn-cm', + hnd: 'hnd-arab-pk', + hne: 'hne-deva-in', + hng: 'hng-latn-ao', + hnh: 'hnh-latn-bw', + hni: 'hni-latn-cn', + hnj: 'hnj-hmnp-us', + 'hnj-au': 'hnj-laoo-au', + 'hnj-cn': 'hnj-laoo-cn', + 'hnj-fr': 'hnj-laoo-fr', + 'hnj-gf': 'hnj-laoo-gf', + 'hnj-la': 'hnj-laoo-la', + 'hnj-laoo': 'hnj-laoo-la', + 'hnj-mm': 'hnj-laoo-mm', + 'hnj-sr': 'hnj-laoo-sr', + 'hnj-th': 'hnj-laoo-th', + 'hnj-us': 'hnj-hmnp-us', + 'hnj-vn': 'hnj-laoo-vn', + hnn: 'hnn-latn-ph', + hno: 'hno-arab-pk', + hns: 'hns-latn-sr', + ho: 'ho-latn-pg', + hoa: 'hoa-latn-sb', + hob: 'hob-latn-pg', + hoc: 'hoc-deva-in', + hod: 'hod-latn-ng', + hoe: 'hoe-latn-ng', + hoh: 'hoh-arab-om', + hoi: 'hoi-latn-us', + hoj: 'hoj-deva-in', + hol: 'hol-latn-ao', + hom: 'hom-latn-ss', + hoo: 'hoo-latn-cd', + hop: 'hop-latn-us', + hor: 'hor-latn-td', + hot: 'hot-latn-zz', + hov: 'hov-latn-id', + how: 'how-hani-cn', + hoy: 'hoy-deva-in', + hpo: 'hpo-mymr-mm', + hr: 'hr-latn-hr', + hra: 'hra-latn-in', + hrc: 'hrc-latn-pg', + hre: 'hre-latn-vn', + hrk: 'hrk-latn-id', + hrm: 'hrm-latn-cn', + 'hrm-hmng': 'hrm-hmng-cn', + hro: 'hro-latn-vn', + hrp: 'hrp-latn-au', + hrt: 'hrt-syrc-tr', + hru: 'hru-latn-in', + hrw: 'hrw-latn-pg', + hrx: 'hrx-latn-br', + hrz: 'hrz-arab-ir', + hsb: 'hsb-latn-de', + hsn: 'hsn-hans-cn', + hss: 'hss-arab-om', + ht: 'ht-latn-ht', + hti: 'hti-latn-id', + hto: 'hto-latn-co', + hts: 'hts-latn-tz', + htu: 'htu-latn-id', + htx: 'htx-xsux-tr', + hu: 'hu-latn-hu', + hub: 'hub-latn-pe', + huc: 'huc-latn-bw', + hud: 'hud-latn-id', + hue: 'hue-latn-mx', + huf: 'huf-latn-pg', + hug: 'hug-latn-pe', + huh: 'huh-latn-cl', + hui: 'hui-latn-zz', + huk: 'huk-latn-id', + hul: 'hul-latn-pg', + hum: 'hum-latn-cd', + hup: 'hup-latn-us', + hur: 'hur-latn-ca', + hus: 'hus-latn-mx', + hut: 'hut-deva-np', + 'hut-tibt': 'hut-tibt-np', + huu: 'huu-latn-pe', + huv: 'huv-latn-mx', + huw: 'huw-latn-id', + hux: 'hux-latn-pe', + huy: 'huy-hebr-il', + huz: 'huz-cyrl-ru', + hvc: 'hvc-latn-ht', + hve: 'hve-latn-mx', + hvk: 'hvk-latn-nc', + hvn: 'hvn-latn-id', + hvv: 'hvv-latn-mx', + hwa: 'hwa-latn-ci', + hwc: 'hwc-latn-us', + hwo: 'hwo-latn-ng', + hy: 'hy-armn-am', + hya: 'hya-latn-cm', + hyw: 'hyw-armn-am', + hz: 'hz-latn-na', + ia: 'ia-latn-001', + iai: 'iai-latn-nc', + ian: 'ian-latn-zz', + iar: 'iar-latn-zz', + iba: 'iba-latn-my', + ibb: 'ibb-latn-ng', + ibd: 'ibd-latn-au', + ibe: 'ibe-latn-ng', + ibg: 'ibg-latn-ph', + ibh: 'ibh-latn-vn', + ibl: 'ibl-latn-ph', + ibm: 'ibm-latn-ng', + ibn: 'ibn-latn-ng', + ibr: 'ibr-latn-ng', + ibu: 'ibu-latn-id', + iby: 'iby-latn-zz', + ica: 'ica-latn-zz', + ich: 'ich-latn-zz', + icr: 'icr-latn-co', + id: 'id-latn-id', + ida: 'ida-latn-ke', + idb: 'idb-latn-in', + idc: 'idc-latn-ng', + idd: 'idd-latn-zz', + ide: 'ide-latn-ng', + idi: 'idi-latn-zz', + idr: 'idr-latn-ss', + ids: 'ids-latn-ng', + idt: 'idt-latn-tl', + idu: 'idu-latn-zz', + ie: 'ie-latn-001', + ifa: 'ifa-latn-ph', + ifb: 'ifb-latn-ph', + ife: 'ife-latn-tg', + iff: 'iff-latn-vu', + ifk: 'ifk-latn-ph', + ifm: 'ifm-latn-cg', + ifu: 'ifu-latn-ph', + ify: 'ify-latn-ph', + ig: 'ig-latn-ng', + igb: 'igb-latn-zz', + ige: 'ige-latn-zz', + igg: 'igg-latn-pg', + igl: 'igl-latn-ng', + igm: 'igm-latn-pg', + ign: 'ign-latn-bo', + igo: 'igo-latn-pg', + igs: 'igs-latn-001', + 'igs-grek': 'igs-grek-001', + igw: 'igw-latn-ng', + ihb: 'ihb-latn-id', + ihi: 'ihi-latn-ng', + ihp: 'ihp-latn-id', + ihw: 'ihw-latn-au', + ii: 'ii-yiii-cn', + iin: 'iin-latn-au', + ijc: 'ijc-latn-ng', + ije: 'ije-latn-ng', + ijj: 'ijj-latn-zz', + ijn: 'ijn-latn-ng', + ijs: 'ijs-latn-ng', + ik: 'ik-latn-us', + iki: 'iki-latn-ng', + ikk: 'ikk-latn-zz', + ikl: 'ikl-latn-ng', + iko: 'iko-latn-ng', + ikp: 'ikp-latn-ng', + ikr: 'ikr-latn-au', + ikt: 'ikt-latn-ca', + 'ikt-cans': 'ikt-cans-ca', + ikv: 'ikv-latn-ng', + ikw: 'ikw-latn-zz', + ikx: 'ikx-latn-zz', + ikz: 'ikz-latn-tz', + ila: 'ila-latn-id', + ilb: 'ilb-latn-zm', + ilg: 'ilg-latn-au', + ili: 'ili-latn-cn', + 'ili-arab': 'ili-arab-cn', + 'ili-cyrl': 'ili-cyrl-kz', + ilk: 'ilk-latn-ph', + ilm: 'ilm-latn-my', + ilo: 'ilo-latn-ph', + ilp: 'ilp-latn-ph', + ilu: 'ilu-latn-id', + ilv: 'ilv-latn-ng', + imi: 'imi-latn-pg', + iml: 'iml-latn-us', + imn: 'imn-latn-pg', + imo: 'imo-latn-zz', + imr: 'imr-latn-id', + ims: 'ims-latn-it', + imt: 'imt-latn-ss', + imy: 'imy-lyci-tr', + in: 'in-latn-id', + inb: 'inb-latn-co', + ing: 'ing-latn-us', + inh: 'inh-cyrl-ru', + inj: 'inj-latn-co', + inn: 'inn-latn-ph', + ino: 'ino-latn-pg', + inp: 'inp-latn-pe', + int: 'int-mymr-mm', + io: 'io-latn-001', + ior: 'ior-ethi-et', + iou: 'iou-latn-zz', + iow: 'iow-latn-us', + ipi: 'ipi-latn-pg', + ipo: 'ipo-latn-pg', + iqu: 'iqu-latn-pe', + iqw: 'iqw-latn-ng', + ire: 'ire-latn-id', + irh: 'irh-latn-id', + iri: 'iri-latn-zz', + irk: 'irk-latn-tz', + irn: 'irn-latn-br', + iru: 'iru-taml-in', + 'iru-mlym': 'iru-mlym-in', + irx: 'irx-latn-id', + iry: 'iry-latn-ph', + is: 'is-latn-is', + isa: 'isa-latn-pg', + isc: 'isc-latn-pe', + isd: 'isd-latn-ph', + ish: 'ish-latn-ng', + isi: 'isi-latn-ng', + isk: 'isk-arab-af', + 'isk-cyrl': 'isk-cyrl-tj', + ism: 'ism-latn-id', + isn: 'isn-latn-tz', + iso: 'iso-latn-ng', + ist: 'ist-latn-hr', + isu: 'isu-latn-cm', + it: 'it-latn-it', + itb: 'itb-latn-ph', + itd: 'itd-latn-id', + ite: 'ite-latn-bo', + iti: 'iti-latn-ph', + itk: 'itk-hebr-it', + itl: 'itl-cyrl-ru', + itm: 'itm-latn-ng', + ito: 'ito-latn-bo', + itr: 'itr-latn-pg', + its: 'its-latn-ng', + itt: 'itt-latn-ph', + itv: 'itv-latn-ph', + itw: 'itw-latn-ng', + itx: 'itx-latn-id', + ity: 'ity-latn-ph', + itz: 'itz-latn-gt', + iu: 'iu-cans-ca', + ium: 'ium-latn-cn', + 'ium-hani': 'ium-hani-cn', + 'ium-laoo': 'ium-laoo-la', + 'ium-thai': 'ium-thai-th', + ivb: 'ivb-latn-ph', + ivv: 'ivv-latn-ph', + iw: 'iw-hebr-il', + iwk: 'iwk-latn-ph', + iwm: 'iwm-latn-zz', + iwo: 'iwo-latn-id', + iws: 'iws-latn-zz', + ixc: 'ixc-latn-mx', + ixl: 'ixl-latn-gt', + iya: 'iya-latn-ng', + iyo: 'iyo-latn-cm', + iyx: 'iyx-latn-cg', + izh: 'izh-latn-ru', + izi: 'izi-latn-zz', + izr: 'izr-latn-ng', + izz: 'izz-latn-ng', + ja: 'ja-jpan-jp', + jaa: 'jaa-latn-br', + jab: 'jab-latn-zz', + jac: 'jac-latn-gt', + jad: 'jad-arab-gn', + jae: 'jae-latn-pg', + jaf: 'jaf-latn-ng', + jah: 'jah-latn-my', + jaj: 'jaj-latn-sb', + jak: 'jak-latn-my', + jal: 'jal-latn-id', + jam: 'jam-latn-jm', + jan: 'jan-latn-au', + jao: 'jao-latn-au', + jaq: 'jaq-latn-id', + jar: 'jar-latn-zz', + jas: 'jas-latn-nc', + jat: 'jat-arab-af', + jau: 'jau-latn-id', + jax: 'jax-latn-id', + jay: 'jay-latn-au', + jaz: 'jaz-latn-nc', + jbe: 'jbe-hebr-il', + jbi: 'jbi-latn-au', + jbj: 'jbj-latn-id', + jbk: 'jbk-latn-pg', + jbm: 'jbm-latn-ng', + jbn: 'jbn-arab-ly', + jbo: 'jbo-latn-001', + jbr: 'jbr-latn-id', + jbt: 'jbt-latn-br', + jbu: 'jbu-latn-zz', + jbw: 'jbw-latn-au', + jct: 'jct-cyrl-ua', + 'jct-latn': 'jct-latn-ua', + jda: 'jda-tibt-in', + jdg: 'jdg-arab-pk', + jdt: 'jdt-cyrl-ru', + 'jdt-hebr': 'jdt-hebr-ru', + 'jdt-latn': 'jdt-latn-az', + jeb: 'jeb-latn-pe', + jee: 'jee-deva-np', + jeh: 'jeh-latn-vn', + 'jeh-laoo': 'jeh-laoo-la', + jei: 'jei-latn-id', + jek: 'jek-latn-ci', + jel: 'jel-latn-id', + jen: 'jen-latn-zz', + jer: 'jer-latn-ng', + jet: 'jet-latn-pg', + jeu: 'jeu-latn-td', + jgb: 'jgb-latn-cd', + jge: 'jge-geor-ge', + 'jge-hebr': 'jge-hebr-il', + jgk: 'jgk-latn-zz', + jgo: 'jgo-latn-cm', + jhi: 'jhi-latn-my', + ji: 'ji-hebr-ua', + jia: 'jia-latn-cm', + jib: 'jib-latn-zz', + jic: 'jic-latn-hn', + jid: 'jid-latn-ng', + jie: 'jie-latn-ng', + jig: 'jig-latn-au', + jil: 'jil-latn-pg', + jim: 'jim-latn-cm', + jit: 'jit-latn-tz', + jiu: 'jiu-latn-cn', + jiv: 'jiv-latn-ec', + jiy: 'jiy-latn-cn', + jje: 'jje-hang-kr', + jjr: 'jjr-latn-ng', + jka: 'jka-latn-id', + jkm: 'jkm-mymr-mm', + 'jkm-brai': 'jkm-brai-mm', + 'jkm-latn': 'jkm-latn-mm', + jko: 'jko-latn-pg', + jku: 'jku-latn-ng', + jle: 'jle-latn-sd', + jma: 'jma-latn-pg', + jmb: 'jmb-latn-ng', + jmc: 'jmc-latn-tz', + jmd: 'jmd-latn-id', + jmi: 'jmi-latn-ng', + jml: 'jml-deva-np', + jmn: 'jmn-latn-mm', + jmr: 'jmr-latn-gh', + jms: 'jms-latn-ng', + jmw: 'jmw-latn-pg', + jmx: 'jmx-latn-mx', + jna: 'jna-takr-in', + jnd: 'jnd-arab-pk', + jng: 'jng-latn-au', + jni: 'jni-latn-ng', + jnj: 'jnj-latn-et', + 'jnj-ethi': 'jnj-ethi-et', + jnl: 'jnl-deva-in', + jns: 'jns-deva-in', + 'jns-latn': 'jns-latn-in', + 'jns-takr': 'jns-takr-in', + job: 'job-latn-cd', + jod: 'jod-latn-ci', + jog: 'jog-arab-pk', + jor: 'jor-latn-bo', + jow: 'jow-latn-ml', + jpa: 'jpa-hebr-ps', + jpr: 'jpr-hebr-il', + jqr: 'jqr-latn-pe', + jra: 'jra-latn-zz', + jrr: 'jrr-latn-ng', + jrt: 'jrt-latn-ng', + jru: 'jru-latn-ve', + jua: 'jua-latn-br', + jub: 'jub-latn-ng', + jud: 'jud-latn-ci', + juh: 'juh-latn-ng', + jui: 'jui-latn-au', + juk: 'juk-latn-ng', + jul: 'jul-deva-np', + jum: 'jum-latn-sd', + jun: 'jun-orya-in', + juo: 'juo-latn-ng', + jup: 'jup-latn-br', + jur: 'jur-latn-br', + jut: 'jut-latn-dk', + juu: 'juu-latn-ng', + juw: 'juw-latn-ng', + juy: 'juy-orya-in', + jv: 'jv-latn-id', + jvd: 'jvd-latn-id', + jvn: 'jvn-latn-sr', + jw: 'jw-latn-id', + jwi: 'jwi-latn-gh', + jya: 'jya-tibt-cn', + jye: 'jye-hebr-il', + jyy: 'jyy-latn-td', + ka: 'ka-geor-ge', + kaa: 'kaa-cyrl-uz', + kab: 'kab-latn-dz', + kac: 'kac-latn-mm', + kad: 'kad-latn-zz', + kag: 'kag-latn-my', + kah: 'kah-latn-cf', + kai: 'kai-latn-zz', + kaj: 'kaj-latn-ng', + kak: 'kak-latn-ph', + kam: 'kam-latn-ke', + kao: 'kao-latn-ml', + kap: 'kap-cyrl-ru', + kaq: 'kaq-latn-pe', + kav: 'kav-latn-br', + kaw: 'kaw-kawi-id', + kax: 'kax-latn-id', + kay: 'kay-latn-br', + kba: 'kba-latn-au', + kbb: 'kbb-latn-br', + kbc: 'kbc-latn-br', + kbd: 'kbd-cyrl-ru', + kbe: 'kbe-latn-au', + kbh: 'kbh-latn-co', + kbi: 'kbi-latn-id', + kbj: 'kbj-latn-cd', + kbk: 'kbk-latn-pg', + kbl: 'kbl-latn-td', + kbm: 'kbm-latn-zz', + kbn: 'kbn-latn-cf', + kbo: 'kbo-latn-ss', + kbp: 'kbp-latn-zz', + kbq: 'kbq-latn-zz', + kbr: 'kbr-latn-et', + 'kbr-ethi': 'kbr-ethi-et', + kbs: 'kbs-latn-ga', + kbt: 'kbt-latn-pg', + kbu: 'kbu-arab-pk', + kbv: 'kbv-latn-id', + kbw: 'kbw-latn-pg', + kbx: 'kbx-latn-zz', + kby: 'kby-arab-ne', + kbz: 'kbz-latn-ng', + kca: 'kca-cyrl-ru', + kcb: 'kcb-latn-pg', + kcc: 'kcc-latn-ng', + kcd: 'kcd-latn-id', + kce: 'kce-latn-ng', + kcf: 'kcf-latn-ng', + kcg: 'kcg-latn-ng', + kch: 'kch-latn-ng', + kci: 'kci-latn-ng', + kcj: 'kcj-latn-gw', + kck: 'kck-latn-zw', + kcl: 'kcl-latn-zz', + kcm: 'kcm-latn-cf', + kcn: 'kcn-latn-ug', + kco: 'kco-latn-pg', + kcp: 'kcp-latn-sd', + kcq: 'kcq-latn-ng', + kcs: 'kcs-latn-ng', + kct: 'kct-latn-zz', + kcu: 'kcu-latn-tz', + kcv: 'kcv-latn-cd', + kcw: 'kcw-latn-cd', + kcz: 'kcz-latn-tz', + kda: 'kda-latn-au', + kdc: 'kdc-latn-tz', + kdd: 'kdd-latn-au', + kde: 'kde-latn-tz', + kdf: 'kdf-latn-pg', + kdg: 'kdg-latn-cd', + kdh: 'kdh-latn-tg', + kdi: 'kdi-latn-ug', + kdj: 'kdj-latn-ug', + kdk: 'kdk-latn-nc', + kdl: 'kdl-latn-zz', + kdm: 'kdm-latn-ng', + kdn: 'kdn-latn-zw', + kdp: 'kdp-latn-ng', + kdq: 'kdq-beng-in', + kdr: 'kdr-latn-lt', + 'kdr-cyrl': 'kdr-cyrl-ua', + kdt: 'kdt-thai-th', + kdw: 'kdw-latn-id', + kdx: 'kdx-latn-ng', + kdy: 'kdy-latn-id', + kdz: 'kdz-latn-cm', + kea: 'kea-latn-cv', + keb: 'keb-latn-ga', + kec: 'kec-latn-sd', + ked: 'ked-latn-tz', + kee: 'kee-latn-us', + kef: 'kef-latn-tg', + keg: 'keg-latn-sd', + keh: 'keh-latn-pg', + kei: 'kei-latn-id', + kek: 'kek-latn-gt', + kel: 'kel-latn-cd', + kem: 'kem-latn-tl', + ken: 'ken-latn-cm', + keo: 'keo-latn-ug', + ker: 'ker-latn-td', + kes: 'kes-latn-ng', + ket: 'ket-cyrl-ru', + keu: 'keu-latn-tg', + kew: 'kew-latn-pg', + kex: 'kex-deva-in', + 'kex-gujr': 'kex-gujr-in', + key: 'key-telu-in', + kez: 'kez-latn-zz', + kfa: 'kfa-knda-in', + kfb: 'kfb-deva-in', + kfc: 'kfc-telu-in', + kfd: 'kfd-knda-in', + kfe: 'kfe-taml-in', + kff: 'kff-latn-in', + 'kff-deva': 'kff-deva-in', + 'kff-orya': 'kff-orya-in', + 'kff-telu': 'kff-telu-in', + kfh: 'kfh-mlym-in', + kfi: 'kfi-taml-in', + 'kfi-knda': 'kfi-knda-in', + kfk: 'kfk-deva-in', + 'kfk-takr': 'kfk-takr-in', + kfl: 'kfl-latn-cm', + kfm: 'kfm-arab-ir', + kfn: 'kfn-latn-cm', + kfo: 'kfo-latn-ci', + kfp: 'kfp-deva-in', + kfq: 'kfq-deva-in', + kfr: 'kfr-deva-in', + kfs: 'kfs-deva-in', + kfv: 'kfv-latn-in', + kfw: 'kfw-latn-in', + kfx: 'kfx-deva-in', + 'kfx-takr': 'kfx-takr-in', + kfy: 'kfy-deva-in', + kfz: 'kfz-latn-bf', + kg: 'kg-latn-cd', + kga: 'kga-latn-ci', + kgb: 'kgb-latn-id', + kge: 'kge-latn-id', + kgf: 'kgf-latn-zz', + kgj: 'kgj-deva-np', + kgk: 'kgk-latn-br', + kgl: 'kgl-latn-au', + kgm: 'kgm-latn-br', + kgo: 'kgo-latn-sd', + kgp: 'kgp-latn-br', + kgq: 'kgq-latn-id', + kgr: 'kgr-latn-id', + kgs: 'kgs-latn-au', + kgt: 'kgt-latn-ng', + kgu: 'kgu-latn-pg', + kgv: 'kgv-latn-id', + kgw: 'kgw-latn-id', + kgx: 'kgx-latn-id', + kgy: 'kgy-deva-np', + kha: 'kha-latn-in', + khb: 'khb-talu-cn', + khc: 'khc-latn-id', + khd: 'khd-latn-id', + khe: 'khe-latn-id', + khf: 'khf-thai-la', + khg: 'khg-tibt-cn', + khh: 'khh-latn-id', + khj: 'khj-latn-ng', + khl: 'khl-latn-pg', + khn: 'khn-deva-in', + khp: 'khp-latn-id', + khq: 'khq-latn-ml', + khr: 'khr-latn-in', + 'khr-deva': 'khr-deva-in', + khs: 'khs-latn-zz', + kht: 'kht-mymr-in', + khu: 'khu-latn-ao', + khv: 'khv-cyrl-ru', + khw: 'khw-arab-pk', + khx: 'khx-latn-cd', + khy: 'khy-latn-cd', + khz: 'khz-latn-zz', + ki: 'ki-latn-ke', + kia: 'kia-latn-td', + kib: 'kib-latn-sd', + kic: 'kic-latn-us', + kid: 'kid-latn-cm', + kie: 'kie-latn-td', + kif: 'kif-deva-np', + kig: 'kig-latn-id', + kih: 'kih-latn-pg', + kij: 'kij-latn-zz', + kil: 'kil-latn-ng', + kim: 'kim-cyrl-ru', + kio: 'kio-latn-us', + kip: 'kip-deva-np', + kiq: 'kiq-latn-id', + kis: 'kis-latn-pg', + kit: 'kit-latn-pg', + kiu: 'kiu-latn-tr', + kiv: 'kiv-latn-tz', + kiw: 'kiw-latn-zz', + kix: 'kix-latn-in', + kiy: 'kiy-latn-id', + kiz: 'kiz-latn-tz', + kj: 'kj-latn-na', + kja: 'kja-latn-id', + kjb: 'kjb-latn-gt', + kjc: 'kjc-latn-id', + kjd: 'kjd-latn-zz', + kje: 'kje-latn-id', + kjg: 'kjg-laoo-la', + kjh: 'kjh-cyrl-ru', + kji: 'kji-latn-sb', + kjj: 'kjj-latn-az', + kjk: 'kjk-latn-id', + kjl: 'kjl-deva-np', + kjm: 'kjm-latn-vn', + kjn: 'kjn-latn-au', + kjo: 'kjo-deva-in', + kjp: 'kjp-mymr-mm', + 'kjp-thai': 'kjp-thai-th', + kjq: 'kjq-latn-us', + kjr: 'kjr-latn-id', + kjs: 'kjs-latn-zz', + kjt: 'kjt-thai-th', + kju: 'kju-latn-us', + kjx: 'kjx-latn-pg', + kjy: 'kjy-latn-zz', + kk: 'kk-cyrl-kz', + 'kk-af': 'kk-arab-af', + 'kk-arab': 'kk-arab-cn', + 'kk-cn': 'kk-arab-cn', + 'kk-ir': 'kk-arab-ir', + 'kk-mn': 'kk-arab-mn', + kka: 'kka-latn-ng', + kkb: 'kkb-latn-id', + kkc: 'kkc-latn-zz', + kkd: 'kkd-latn-ng', + kke: 'kke-latn-gn', + 'kke-arab': 'kke-arab-gn', + kkf: 'kkf-tibt-in', + kkg: 'kkg-latn-ph', + kkh: 'kkh-lana-mm', + kki: 'kki-latn-tz', + kkj: 'kkj-latn-cm', + kkk: 'kkk-latn-sb', + kkl: 'kkl-latn-id', + kkm: 'kkm-latn-ng', + kko: 'kko-latn-sd', + kkp: 'kkp-latn-au', + kkq: 'kkq-latn-cd', + kkr: 'kkr-latn-ng', + kks: 'kks-latn-ng', + kkt: 'kkt-deva-np', + kku: 'kku-latn-ng', + kkv: 'kkv-latn-id', + kkw: 'kkw-latn-cg', + kkx: 'kkx-latn-id', + kky: 'kky-latn-au', + kkz: 'kkz-latn-ca', + kl: 'kl-latn-gl', + kla: 'kla-latn-us', + klb: 'klb-latn-mx', + klc: 'klc-latn-cm', + kld: 'kld-latn-au', + kle: 'kle-deva-np', + klf: 'klf-latn-td', + klg: 'klg-latn-ph', + klh: 'klh-latn-pg', + kli: 'kli-latn-id', + klj: 'klj-arab-ir', + klk: 'klk-latn-ng', + kll: 'kll-latn-ph', + klm: 'klm-latn-pg', + kln: 'kln-latn-ke', + klo: 'klo-latn-ng', + klp: 'klp-latn-pg', + klq: 'klq-latn-zz', + klr: 'klr-deva-np', + kls: 'kls-latn-pk', + 'kls-arab': 'kls-arab-pk', + klt: 'klt-latn-zz', + klu: 'klu-latn-lr', + klv: 'klv-latn-vu', + klw: 'klw-latn-id', + klx: 'klx-latn-zz', + kly: 'kly-latn-id', + klz: 'klz-latn-id', + km: 'km-khmr-kh', + kma: 'kma-latn-gh', + kmb: 'kmb-latn-ao', + kmc: 'kmc-latn-cn', + 'kmc-hani': 'kmc-hani-cn', + kmd: 'kmd-latn-ph', + kme: 'kme-latn-cm', + kmf: 'kmf-latn-pg', + kmg: 'kmg-latn-pg', + kmh: 'kmh-latn-zz', + kmi: 'kmi-latn-ng', + kmj: 'kmj-deva-in', + kmk: 'kmk-latn-ph', + kml: 'kml-latn-ph', + kmm: 'kmm-latn-in', + kmn: 'kmn-latn-pg', + kmo: 'kmo-latn-zz', + kmp: 'kmp-latn-cm', + kmq: 'kmq-latn-et', + kms: 'kms-latn-zz', + kmt: 'kmt-latn-id', + kmu: 'kmu-latn-zz', + kmv: 'kmv-latn-br', + kmw: 'kmw-latn-zz', + kmx: 'kmx-latn-pg', + kmy: 'kmy-latn-ng', + kmz: 'kmz-arab-ir', + kn: 'kn-knda-in', + kna: 'kna-latn-ng', + knb: 'knb-latn-ph', + knd: 'knd-latn-id', + kne: 'kne-latn-ph', + knf: 'knf-latn-gw', + kni: 'kni-latn-ng', + knj: 'knj-latn-gt', + knk: 'knk-latn-sl', + 'knk-arab': 'knk-arab-sl', + knl: 'knl-latn-id', + knm: 'knm-latn-br', + kno: 'kno-latn-sl', + knp: 'knp-latn-zz', + knq: 'knq-latn-my', + knr: 'knr-latn-pg', + kns: 'kns-latn-my', + 'kns-thai': 'kns-thai-th', + knt: 'knt-latn-br', + knu: 'knu-latn-gn', + knv: 'knv-latn-pg', + knw: 'knw-latn-na', + knx: 'knx-latn-id', + kny: 'kny-latn-cd', + knz: 'knz-latn-bf', + ko: 'ko-kore-kr', + koa: 'koa-latn-pg', + koc: 'koc-latn-ng', + kod: 'kod-latn-id', + koe: 'koe-latn-ss', + kof: 'kof-latn-ng', + kog: 'kog-latn-co', + koh: 'koh-latn-cg', + koi: 'koi-cyrl-ru', + kok: 'kok-deva-in', + kol: 'kol-latn-zz', + koo: 'koo-latn-ug', + kop: 'kop-latn-pg', + koq: 'koq-latn-ga', + kos: 'kos-latn-fm', + kot: 'kot-latn-cm', + kou: 'kou-latn-td', + kov: 'kov-latn-ng', + kow: 'kow-latn-ng', + koy: 'koy-latn-us', + koz: 'koz-latn-zz', + kpa: 'kpa-latn-ng', + kpc: 'kpc-latn-co', + kpd: 'kpd-latn-id', + kpe: 'kpe-latn-lr', + kpf: 'kpf-latn-zz', + kpg: 'kpg-latn-fm', + kph: 'kph-latn-gh', + kpi: 'kpi-latn-id', + kpj: 'kpj-latn-br', + kpk: 'kpk-latn-ng', + kpl: 'kpl-latn-cd', + kpm: 'kpm-latn-vn', + kpn: 'kpn-latn-br', + kpo: 'kpo-latn-zz', + kpq: 'kpq-latn-id', + kpr: 'kpr-latn-zz', + kps: 'kps-latn-id', + kpt: 'kpt-cyrl-ru', + kpu: 'kpu-latn-id', + kpw: 'kpw-latn-pg', + kpx: 'kpx-latn-zz', + kpy: 'kpy-cyrl-ru', + kpz: 'kpz-latn-ug', + kqa: 'kqa-latn-pg', + kqb: 'kqb-latn-zz', + kqc: 'kqc-latn-pg', + kqd: 'kqd-syrc-iq', + kqe: 'kqe-latn-ph', + kqf: 'kqf-latn-zz', + kqg: 'kqg-latn-bf', + kqh: 'kqh-latn-tz', + kqi: 'kqi-latn-pg', + kqj: 'kqj-latn-pg', + kqk: 'kqk-latn-bj', + kql: 'kql-latn-pg', + kqm: 'kqm-latn-ci', + kqn: 'kqn-latn-zm', + kqo: 'kqo-latn-lr', + kqp: 'kqp-latn-td', + kqq: 'kqq-latn-br', + kqr: 'kqr-latn-my', + kqs: 'kqs-latn-zz', + kqt: 'kqt-latn-my', + kqu: 'kqu-latn-za', + kqv: 'kqv-latn-id', + kqw: 'kqw-latn-pg', + kqx: 'kqx-latn-cm', + kqy: 'kqy-ethi-zz', + kqz: 'kqz-latn-za', + kr: 'kr-latn-zz', + kra: 'kra-deva-np', + krb: 'krb-latn-us', + krc: 'krc-cyrl-ru', + krd: 'krd-latn-tl', + kre: 'kre-latn-br', + krf: 'krf-latn-vu', + krh: 'krh-latn-ng', + kri: 'kri-latn-sl', + krj: 'krj-latn-ph', + krk: 'krk-cyrl-ru', + krl: 'krl-latn-ru', + krn: 'krn-latn-lr', + krp: 'krp-latn-ng', + krr: 'krr-khmr-kh', + krs: 'krs-latn-zz', + krt: 'krt-latn-ne', + kru: 'kru-deva-in', + krv: 'krv-khmr-kh', + krw: 'krw-latn-lr', + krx: 'krx-latn-sn', + kry: 'kry-latn-az', + krz: 'krz-latn-id', + ks: 'ks-arab-in', + ksa: 'ksa-latn-ng', + ksb: 'ksb-latn-tz', + ksc: 'ksc-latn-ph', + ksd: 'ksd-latn-zz', + kse: 'kse-latn-pg', + ksf: 'ksf-latn-cm', + ksg: 'ksg-latn-sb', + ksh: 'ksh-latn-de', + ksi: 'ksi-latn-pg', + ksj: 'ksj-latn-zz', + ksk: 'ksk-latn-us', + ksl: 'ksl-latn-pg', + ksm: 'ksm-latn-ng', + ksn: 'ksn-latn-ph', + kso: 'kso-latn-ng', + ksp: 'ksp-latn-cf', + ksq: 'ksq-latn-ng', + ksr: 'ksr-latn-zz', + kss: 'kss-latn-lr', + kst: 'kst-latn-bf', + ksu: 'ksu-mymr-in', + ksv: 'ksv-latn-cd', + ksw: 'ksw-mymr-mm', + 'ksw-latn': 'ksw-latn-mm', + ksx: 'ksx-latn-id', + ksz: 'ksz-deva-in', + kta: 'kta-latn-vn', + ktb: 'ktb-ethi-zz', + ktc: 'ktc-latn-ng', + ktd: 'ktd-latn-au', + ktf: 'ktf-latn-cd', + ktg: 'ktg-latn-au', + kth: 'kth-latn-td', + kti: 'kti-latn-id', + ktj: 'ktj-latn-ci', + ktk: 'ktk-latn-pg', + ktl: 'ktl-arab-ir', + ktm: 'ktm-latn-zz', + ktn: 'ktn-latn-br', + kto: 'kto-latn-zz', + ktp: 'ktp-plrd-cn', + ktq: 'ktq-latn-ph', + ktr: 'ktr-latn-my', + kts: 'kts-latn-id', + ktt: 'ktt-latn-id', + ktu: 'ktu-latn-cd', + ktv: 'ktv-latn-vn', + ktw: 'ktw-latn-us', + ktx: 'ktx-latn-br', + kty: 'kty-latn-cd', + ktz: 'ktz-latn-na', + ku: 'ku-latn-tr', + 'ku-arab': 'ku-arab-iq', + 'ku-lb': 'ku-arab-lb', + 'ku-yezi': 'ku-yezi-ge', + kub: 'kub-latn-zz', + kuc: 'kuc-latn-id', + kud: 'kud-latn-zz', + kue: 'kue-latn-zz', + kuf: 'kuf-laoo-la', + kug: 'kug-latn-ng', + kuh: 'kuh-latn-ng', + kui: 'kui-latn-br', + kuj: 'kuj-latn-zz', + kuk: 'kuk-latn-id', + kul: 'kul-latn-ng', + kum: 'kum-cyrl-ru', + kun: 'kun-latn-zz', + kuo: 'kuo-latn-pg', + kup: 'kup-latn-zz', + kuq: 'kuq-latn-br', + kus: 'kus-latn-zz', + kut: 'kut-latn-ca', + kuu: 'kuu-latn-us', + kuv: 'kuv-latn-id', + kuw: 'kuw-latn-cf', + kux: 'kux-latn-au', + kuy: 'kuy-latn-au', + kuz: 'kuz-latn-cl', + kv: 'kv-cyrl-ru', + kva: 'kva-cyrl-ru', + kvb: 'kvb-latn-id', + kvc: 'kvc-latn-pg', + kvd: 'kvd-latn-id', + kve: 'kve-latn-my', + kvf: 'kvf-latn-td', + kvg: 'kvg-latn-zz', + kvh: 'kvh-latn-id', + kvi: 'kvi-latn-td', + kvj: 'kvj-latn-cm', + kvl: 'kvl-latn-mm', + kvm: 'kvm-latn-cm', + kvn: 'kvn-latn-co', + kvo: 'kvo-latn-id', + kvp: 'kvp-latn-id', + kvq: 'kvq-mymr-mm', + 'kvq-latn': 'kvq-latn-mm', + kvr: 'kvr-latn-id', + kvt: 'kvt-mymr-mm', + kvv: 'kvv-latn-id', + kvw: 'kvw-latn-id', + kvx: 'kvx-arab-pk', + kvy: 'kvy-kali-mm', + kvz: 'kvz-latn-id', + kw: 'kw-latn-gb', + kwa: 'kwa-latn-br', + kwb: 'kwb-latn-ng', + kwc: 'kwc-latn-cg', + kwd: 'kwd-latn-sb', + kwe: 'kwe-latn-id', + kwf: 'kwf-latn-sb', + kwg: 'kwg-latn-td', + kwh: 'kwh-latn-id', + kwi: 'kwi-latn-co', + kwj: 'kwj-latn-zz', + kwk: 'kwk-latn-ca', + kwl: 'kwl-latn-ng', + kwm: 'kwm-latn-na', + kwn: 'kwn-latn-na', + kwo: 'kwo-latn-zz', + kwp: 'kwp-latn-ci', + kwq: 'kwq-latn-zz', + kwr: 'kwr-latn-id', + kws: 'kws-latn-cd', + kwt: 'kwt-latn-id', + kwu: 'kwu-latn-cm', + kwv: 'kwv-latn-td', + kww: 'kww-latn-sr', + kwy: 'kwy-latn-cd', + kwz: 'kwz-latn-ao', + kxa: 'kxa-latn-zz', + kxb: 'kxb-latn-ci', + kxc: 'kxc-ethi-zz', + kxd: 'kxd-latn-bn', + 'kxd-arab': 'kxd-arab-bn', + kxe: 'kxe-latn-zz', + kxf: 'kxf-mymr-mm', + 'kxf-latn': 'kxf-latn-mm', + kxi: 'kxi-latn-my', + kxj: 'kxj-latn-td', + kxk: 'kxk-mymr-mm', + kxl: 'kxl-deva-in', + kxm: 'kxm-thai-th', + kxn: 'kxn-latn-my', + kxo: 'kxo-latn-br', + kxp: 'kxp-arab-pk', + kxq: 'kxq-latn-id', + kxr: 'kxr-latn-pg', + kxt: 'kxt-latn-pg', + kxv: 'kxv-orya-in', + 'kxv-latn': 'kxv-latn-in', + 'kxv-telu': 'kxv-telu-in', + kxw: 'kxw-latn-zz', + kxx: 'kxx-latn-cg', + kxy: 'kxy-latn-vn', + kxz: 'kxz-latn-zz', + ky: 'ky-cyrl-kg', + 'ky-arab': 'ky-arab-cn', + 'ky-cn': 'ky-arab-cn', + 'ky-latn': 'ky-latn-tr', + 'ky-tr': 'ky-latn-tr', + kya: 'kya-latn-tz', + kyb: 'kyb-latn-ph', + kyc: 'kyc-latn-pg', + kyd: 'kyd-latn-id', + kye: 'kye-latn-zz', + kyf: 'kyf-latn-ci', + kyg: 'kyg-latn-pg', + kyh: 'kyh-latn-us', + kyi: 'kyi-latn-my', + kyj: 'kyj-latn-ph', + kyk: 'kyk-latn-ph', + kyl: 'kyl-latn-us', + kym: 'kym-latn-cf', + kyn: 'kyn-latn-ph', + kyo: 'kyo-latn-id', + kyq: 'kyq-latn-td', + kyr: 'kyr-latn-br', + kys: 'kys-latn-my', + kyt: 'kyt-latn-id', + kyu: 'kyu-kali-mm', + 'kyu-latn': 'kyu-latn-mm', + 'kyu-mymr': 'kyu-mymr-mm', + kyv: 'kyv-deva-np', + kyw: 'kyw-deva-in', + 'kyw-beng': 'kyw-beng-in', + 'kyw-orya': 'kyw-orya-in', + kyx: 'kyx-latn-zz', + kyy: 'kyy-latn-pg', + kyz: 'kyz-latn-br', + kza: 'kza-latn-bf', + kzb: 'kzb-latn-id', + kzc: 'kzc-latn-ci', + kzd: 'kzd-latn-id', + kze: 'kze-latn-pg', + kzf: 'kzf-latn-id', + kzh: 'kzh-arab-zz', + kzi: 'kzi-latn-my', + kzj: 'kzj-latn-my', + kzk: 'kzk-latn-sb', + kzl: 'kzl-latn-id', + kzm: 'kzm-latn-id', + kzn: 'kzn-latn-mw', + kzo: 'kzo-latn-ga', + kzp: 'kzp-latn-id', + kzr: 'kzr-latn-zz', + kzs: 'kzs-latn-my', + kzt: 'kzt-latn-my', + kzu: 'kzu-latn-id', + kzv: 'kzv-latn-id', + kzw: 'kzw-latn-br', + kzx: 'kzx-latn-id', + kzy: 'kzy-latn-cd', + kzz: 'kzz-latn-id', + la: 'la-latn-va', + laa: 'laa-latn-ph', + lab: 'lab-lina-gr', + lac: 'lac-latn-mx', + lad: 'lad-hebr-il', + lae: 'lae-deva-in', + 'lae-tibt': 'lae-tibt-in', + lag: 'lag-latn-tz', + lah: 'lah-arab-pk', + lai: 'lai-latn-mw', + laj: 'laj-latn-ug', + lal: 'lal-latn-cd', + lam: 'lam-latn-zm', + lan: 'lan-latn-ng', + lap: 'lap-latn-td', + laq: 'laq-latn-vn', + lar: 'lar-latn-gh', + las: 'las-latn-zz', + lau: 'lau-latn-id', + law: 'law-latn-id', + lax: 'lax-latn-in', + 'lax-beng': 'lax-beng-in', + laz: 'laz-latn-pg', + lb: 'lb-latn-lu', + lbb: 'lbb-latn-pg', + lbc: 'lbc-lisu-cn', + lbe: 'lbe-cyrl-ru', + lbf: 'lbf-deva-in', + 'lbf-tibt': 'lbf-tibt-cn', + lbi: 'lbi-latn-cm', + lbj: 'lbj-tibt-in', + 'lbj-arab': 'lbj-arab-in', + lbl: 'lbl-latn-ph', + lbm: 'lbm-deva-in', + lbn: 'lbn-latn-la', + 'lbn-laoo': 'lbn-laoo-la', + lbo: 'lbo-laoo-la', + 'lbo-latn': 'lbo-latn-us', + lbq: 'lbq-latn-pg', + lbr: 'lbr-deva-np', + lbt: 'lbt-latn-vn', + lbu: 'lbu-latn-zz', + lbv: 'lbv-latn-pg', + lbw: 'lbw-latn-id', + lbx: 'lbx-latn-id', + lby: 'lby-latn-au', + lbz: 'lbz-latn-au', + lcc: 'lcc-latn-id', + lcd: 'lcd-latn-id', + lce: 'lce-latn-id', + lcf: 'lcf-latn-id', + lch: 'lch-latn-ao', + lcl: 'lcl-latn-id', + lcm: 'lcm-latn-zz', + lcp: 'lcp-thai-cn', + lcq: 'lcq-latn-id', + lcs: 'lcs-latn-id', + lda: 'lda-latn-ci', + ldb: 'ldb-latn-zz', + ldd: 'ldd-latn-ng', + ldg: 'ldg-latn-ng', + ldh: 'ldh-latn-ng', + ldi: 'ldi-latn-cg', + ldj: 'ldj-latn-ng', + ldk: 'ldk-latn-ng', + ldl: 'ldl-latn-ng', + ldm: 'ldm-latn-gn', + ldn: 'ldn-latn-001', + ldo: 'ldo-latn-ng', + ldp: 'ldp-latn-ng', + ldq: 'ldq-latn-ng', + lea: 'lea-latn-cd', + leb: 'leb-latn-zm', + lec: 'lec-latn-bo', + led: 'led-latn-zz', + lee: 'lee-latn-zz', + lef: 'lef-latn-gh', + leh: 'leh-latn-zm', + lei: 'lei-latn-pg', + lej: 'lej-latn-cd', + lek: 'lek-latn-pg', + lel: 'lel-latn-cd', + lem: 'lem-latn-zz', + len: 'len-latn-hn', + leo: 'leo-latn-cm', + lep: 'lep-lepc-in', + leq: 'leq-latn-zz', + ler: 'ler-latn-pg', + les: 'les-latn-cd', + let: 'let-latn-pg', + leu: 'leu-latn-zz', + lev: 'lev-latn-id', + lew: 'lew-latn-id', + lex: 'lex-latn-id', + ley: 'ley-latn-id', + lez: 'lez-cyrl-ru', + lfa: 'lfa-latn-cm', + lfn: 'lfn-latn-001', + 'lfn-cyrl': 'lfn-cyrl-001', + lg: 'lg-latn-ug', + lga: 'lga-latn-sb', + lgb: 'lgb-latn-sb', + lgg: 'lgg-latn-zz', + lgh: 'lgh-latn-vn', + lgi: 'lgi-latn-id', + lgk: 'lgk-latn-vu', + lgl: 'lgl-latn-sb', + lgm: 'lgm-latn-cd', + lgn: 'lgn-latn-et', + lgo: 'lgo-latn-ss', + lgq: 'lgq-latn-gh', + lgr: 'lgr-latn-sb', + lgt: 'lgt-latn-pg', + lgu: 'lgu-latn-sb', + lgz: 'lgz-latn-cd', + lha: 'lha-latn-vn', + lhh: 'lhh-latn-id', + lhi: 'lhi-latn-cn', + lhm: 'lhm-deva-np', + lhn: 'lhn-latn-my', + lhs: 'lhs-syrc-sy', + lht: 'lht-latn-vu', + lhu: 'lhu-latn-cn', + li: 'li-latn-nl', + lia: 'lia-latn-zz', + lib: 'lib-latn-pg', + lic: 'lic-latn-cn', + lid: 'lid-latn-zz', + lie: 'lie-latn-cd', + lif: 'lif-deva-np', + 'lif-limb': 'lif-limb-in', + lig: 'lig-latn-zz', + lih: 'lih-latn-zz', + lij: 'lij-latn-it', + lik: 'lik-latn-cd', + lil: 'lil-latn-ca', + lio: 'lio-latn-id', + lip: 'lip-latn-gh', + liq: 'liq-latn-et', + lir: 'lir-latn-lr', + lis: 'lis-lisu-cn', + liu: 'liu-latn-sd', + liv: 'liv-latn-lv', + liw: 'liw-latn-id', + lix: 'lix-latn-id', + liy: 'liy-latn-cf', + liz: 'liz-latn-cd', + lja: 'lja-latn-au', + lje: 'lje-latn-id', + lji: 'lji-latn-id', + ljl: 'ljl-latn-id', + ljp: 'ljp-latn-id', + ljw: 'ljw-latn-au', + ljx: 'ljx-latn-au', + lka: 'lka-latn-tl', + lkb: 'lkb-latn-ke', + lkc: 'lkc-latn-vn', + lkd: 'lkd-latn-br', + lke: 'lke-latn-ug', + lkh: 'lkh-tibt-bt', + lki: 'lki-arab-ir', + lkj: 'lkj-latn-my', + lkl: 'lkl-latn-pg', + lkm: 'lkm-latn-au', + lkn: 'lkn-latn-vu', + lko: 'lko-latn-ke', + lkr: 'lkr-latn-ss', + lks: 'lks-latn-ke', + lkt: 'lkt-latn-us', + lku: 'lku-latn-au', + lky: 'lky-latn-ss', + lla: 'lla-latn-ng', + llb: 'llb-latn-mz', + llc: 'llc-latn-gn', + lld: 'lld-latn-it', + lle: 'lle-latn-zz', + llf: 'llf-latn-pg', + llg: 'llg-latn-id', + lli: 'lli-latn-cg', + llj: 'llj-latn-au', + llk: 'llk-latn-my', + lll: 'lll-latn-pg', + llm: 'llm-latn-id', + lln: 'lln-latn-zz', + llp: 'llp-latn-vu', + llq: 'llq-latn-id', + llu: 'llu-latn-sb', + llx: 'llx-latn-fj', + lma: 'lma-latn-gn', + lmb: 'lmb-latn-vu', + lmc: 'lmc-latn-au', + lmd: 'lmd-latn-sd', + lme: 'lme-latn-td', + lmf: 'lmf-latn-id', + lmg: 'lmg-latn-pg', + lmh: 'lmh-deva-np', + lmi: 'lmi-latn-cd', + lmj: 'lmj-latn-id', + lmk: 'lmk-latn-in', + 'lmk-mymr': 'lmk-mymr-in', + lml: 'lml-latn-vu', + lmn: 'lmn-telu-in', + lmo: 'lmo-latn-it', + lmp: 'lmp-latn-zz', + lmq: 'lmq-latn-id', + lmr: 'lmr-latn-id', + lmu: 'lmu-latn-vu', + lmv: 'lmv-latn-fj', + lmw: 'lmw-latn-us', + lmx: 'lmx-latn-cm', + lmy: 'lmy-latn-id', + ln: 'ln-latn-cd', + lna: 'lna-latn-cf', + lnb: 'lnb-latn-na', + lnd: 'lnd-latn-id', + lnh: 'lnh-latn-my', + lni: 'lni-latn-pg', + lnj: 'lnj-latn-au', + lnl: 'lnl-latn-cf', + lnm: 'lnm-latn-pg', + lnn: 'lnn-latn-vu', + lns: 'lns-latn-zz', + lnu: 'lnu-latn-zz', + lnw: 'lnw-latn-au', + lnz: 'lnz-latn-cd', + lo: 'lo-laoo-la', + loa: 'loa-latn-id', + lob: 'lob-latn-bf', + loc: 'loc-latn-ph', + loe: 'loe-latn-id', + log: 'log-latn-cd', + loh: 'loh-latn-ss', + loi: 'loi-latn-ci', + loj: 'loj-latn-zz', + lok: 'lok-latn-zz', + lol: 'lol-latn-cd', + lom: 'lom-latn-lr', + lon: 'lon-latn-mw', + loo: 'loo-latn-cd', + lop: 'lop-latn-ng', + loq: 'loq-latn-cd', + lor: 'lor-latn-zz', + los: 'los-latn-zz', + lot: 'lot-latn-ss', + 'lot-arab': 'lot-arab-ss', + lou: 'lou-latn-us', + low: 'low-latn-my', + lox: 'lox-latn-id', + loy: 'loy-deva-np', + 'loy-tibt': 'loy-tibt-np', + loz: 'loz-latn-zm', + lpa: 'lpa-latn-vu', + lpe: 'lpe-latn-id', + lpn: 'lpn-latn-mm', + lpo: 'lpo-plrd-cn', + 'lpo-lisu': 'lpo-lisu-cn', + lpx: 'lpx-latn-ss', + lqr: 'lqr-latn-ss', + lra: 'lra-latn-my', + lrc: 'lrc-arab-ir', + lrg: 'lrg-latn-au', + lri: 'lri-latn-ke', + lrk: 'lrk-arab-pk', + lrl: 'lrl-arab-ir', + lrm: 'lrm-latn-ke', + lrn: 'lrn-latn-id', + lro: 'lro-latn-sd', + lrt: 'lrt-latn-id', + lrv: 'lrv-latn-vu', + lrz: 'lrz-latn-vu', + lsa: 'lsa-arab-ir', + lsd: 'lsd-hebr-il', + lse: 'lse-latn-cd', + lsi: 'lsi-latn-mm', + lsm: 'lsm-latn-ug', + lsr: 'lsr-latn-pg', + lss: 'lss-arab-pk', + lt: 'lt-latn-lt', + ltg: 'ltg-latn-lv', + lth: 'lth-latn-ug', + lti: 'lti-latn-id', + ltn: 'ltn-latn-br', + lto: 'lto-latn-ke', + lts: 'lts-latn-ke', + ltu: 'ltu-latn-id', + lu: 'lu-latn-cd', + lua: 'lua-latn-cd', + luc: 'luc-latn-ug', + lud: 'lud-latn-ru', + lue: 'lue-latn-zm', + luf: 'luf-latn-pg', + lui: 'lui-latn-us', + luj: 'luj-latn-cd', + luk: 'luk-tibt-bt', + lul: 'lul-latn-ss', + lum: 'lum-latn-ao', + lun: 'lun-latn-zm', + luo: 'luo-latn-ke', + lup: 'lup-latn-ga', + luq: 'luq-latn-cu', + lur: 'lur-latn-id', + lus: 'lus-latn-in', + 'lus-beng': 'lus-beng-bd', + 'lus-brai': 'lus-brai-in', + lut: 'lut-latn-us', + luu: 'luu-deva-np', + luv: 'luv-arab-om', + luw: 'luw-latn-cm', + luy: 'luy-latn-ke', + luz: 'luz-arab-ir', + lv: 'lv-latn-lv', + lva: 'lva-latn-tl', + lvi: 'lvi-latn-la', + lvk: 'lvk-latn-sb', + lvu: 'lvu-latn-id', + lwa: 'lwa-latn-cd', + lwe: 'lwe-latn-id', + lwg: 'lwg-latn-ke', + lwh: 'lwh-latn-vn', + lwl: 'lwl-thai-th', + lwm: 'lwm-thai-cn', + lwo: 'lwo-latn-ss', + 'lwo-za': 'lwo-latn-za', + lwt: 'lwt-latn-id', + lww: 'lww-latn-vu', + lxm: 'lxm-latn-pg', + lya: 'lya-tibt-bt', + lyn: 'lyn-latn-zm', + lzh: 'lzh-hans-cn', + lzl: 'lzl-latn-vu', + lzn: 'lzn-latn-mm', + lzz: 'lzz-latn-tr', + maa: 'maa-latn-mx', + mab: 'mab-latn-mx', + mad: 'mad-latn-id', + mae: 'mae-latn-ng', + maf: 'maf-latn-cm', + mag: 'mag-deva-in', + mai: 'mai-deva-in', + maj: 'maj-latn-mx', + mak: 'mak-latn-id', + mam: 'mam-latn-gt', + man: 'man-latn-gm', + 'man-gn': 'man-nkoo-gn', + 'man-nkoo': 'man-nkoo-gn', + maq: 'maq-latn-mx', + mas: 'mas-latn-ke', + mat: 'mat-latn-mx', + mau: 'mau-latn-mx', + mav: 'mav-latn-br', + maw: 'maw-latn-zz', + max: 'max-latn-id', + maz: 'maz-latn-mx', + mba: 'mba-latn-ph', + mbb: 'mbb-latn-ph', + mbc: 'mbc-latn-br', + mbd: 'mbd-latn-ph', + mbf: 'mbf-latn-sg', + mbh: 'mbh-latn-zz', + mbi: 'mbi-latn-ph', + mbj: 'mbj-latn-br', + mbk: 'mbk-latn-pg', + mbl: 'mbl-latn-br', + mbm: 'mbm-latn-cg', + mbn: 'mbn-latn-co', + mbo: 'mbo-latn-zz', + mbp: 'mbp-latn-co', + mbq: 'mbq-latn-zz', + mbr: 'mbr-latn-co', + mbs: 'mbs-latn-ph', + mbt: 'mbt-latn-ph', + mbu: 'mbu-latn-zz', + mbv: 'mbv-latn-gn', + mbw: 'mbw-latn-zz', + mbx: 'mbx-latn-pg', + mby: 'mby-arab-pk', + mbz: 'mbz-latn-mx', + mca: 'mca-latn-py', + mcb: 'mcb-latn-pe', + mcc: 'mcc-latn-pg', + mcd: 'mcd-latn-pe', + mce: 'mce-latn-mx', + mcf: 'mcf-latn-pe', + mcg: 'mcg-latn-ve', + mch: 'mch-latn-ve', + mci: 'mci-latn-zz', + mcj: 'mcj-latn-ng', + mck: 'mck-latn-ao', + mcl: 'mcl-latn-co', + mcm: 'mcm-latn-my', + mcn: 'mcn-latn-td', + mco: 'mco-latn-mx', + mcp: 'mcp-latn-zz', + mcq: 'mcq-latn-zz', + mcr: 'mcr-latn-zz', + mcs: 'mcs-latn-cm', + mct: 'mct-latn-cm', + mcu: 'mcu-latn-zz', + mcv: 'mcv-latn-pg', + mcw: 'mcw-latn-td', + mcx: 'mcx-latn-cf', + mcy: 'mcy-latn-pg', + mcz: 'mcz-latn-pg', + mda: 'mda-latn-zz', + mdb: 'mdb-latn-pg', + mdc: 'mdc-latn-pg', + mdd: 'mdd-latn-cm', + mde: 'mde-arab-zz', + mdf: 'mdf-cyrl-ru', + mdg: 'mdg-latn-td', + mdh: 'mdh-latn-ph', + mdi: 'mdi-latn-cd', + mdj: 'mdj-latn-zz', + mdk: 'mdk-latn-cd', + mdm: 'mdm-latn-cd', + mdn: 'mdn-latn-cf', + mdp: 'mdp-latn-cd', + mdq: 'mdq-latn-cd', + mdr: 'mdr-latn-id', + mds: 'mds-latn-pg', + mdt: 'mdt-latn-cg', + mdu: 'mdu-latn-cg', + mdv: 'mdv-latn-mx', + mdw: 'mdw-latn-cg', + mdx: 'mdx-ethi-zz', + mdy: 'mdy-ethi-et', + 'mdy-latn': 'mdy-latn-et', + mdz: 'mdz-latn-br', + mea: 'mea-latn-cm', + meb: 'meb-latn-pg', + mec: 'mec-latn-au', + med: 'med-latn-zz', + mee: 'mee-latn-zz', + meh: 'meh-latn-mx', + mej: 'mej-latn-id', + mek: 'mek-latn-zz', + mel: 'mel-latn-my', + mem: 'mem-latn-au', + men: 'men-latn-sl', + meo: 'meo-latn-my', + 'meo-arab': 'meo-arab-my', + mep: 'mep-latn-au', + meq: 'meq-latn-cm', + mer: 'mer-latn-ke', + mes: 'mes-latn-td', + met: 'met-latn-zz', + meu: 'meu-latn-zz', + mev: 'mev-latn-lr', + mew: 'mew-latn-ng', + mey: 'mey-latn-mr', + 'mey-arab': 'mey-arab-mr', + mez: 'mez-latn-us', + mfa: 'mfa-arab-th', + mfb: 'mfb-latn-id', + mfc: 'mfc-latn-cd', + mfd: 'mfd-latn-cm', + mfe: 'mfe-latn-mu', + mff: 'mff-latn-cm', + mfg: 'mfg-latn-gn', + 'mfg-arab': 'mfg-arab-gn', + mfh: 'mfh-latn-cm', + mfi: 'mfi-arab-cm', + 'mfi-latn': 'mfi-latn-cm', + mfj: 'mfj-latn-cm', + mfk: 'mfk-latn-cm', + mfl: 'mfl-latn-ng', + mfm: 'mfm-latn-ng', + mfn: 'mfn-latn-zz', + mfo: 'mfo-latn-zz', + mfp: 'mfp-latn-id', + mfq: 'mfq-latn-zz', + mfr: 'mfr-latn-au', + mft: 'mft-latn-pg', + mfu: 'mfu-latn-ao', + mfv: 'mfv-latn-gw', + mfw: 'mfw-latn-pg', + mfx: 'mfx-latn-et', + 'mfx-ethi': 'mfx-ethi-et', + mfy: 'mfy-latn-mx', + mfz: 'mfz-latn-ss', + mg: 'mg-latn-mg', + mgb: 'mgb-latn-td', + mgc: 'mgc-latn-ss', + mgd: 'mgd-latn-ss', + 'mgd-arab': 'mgd-arab-ss', + mge: 'mge-latn-td', + mgf: 'mgf-latn-id', + mgg: 'mgg-latn-cm', + mgh: 'mgh-latn-mz', + mgi: 'mgi-latn-ng', + mgj: 'mgj-latn-ng', + mgk: 'mgk-latn-id', + mgl: 'mgl-latn-zz', + mgm: 'mgm-latn-tl', + mgn: 'mgn-latn-cf', + mgo: 'mgo-latn-cm', + mgp: 'mgp-deva-np', + mgq: 'mgq-latn-tz', + mgr: 'mgr-latn-zm', + mgs: 'mgs-latn-tz', + mgt: 'mgt-latn-pg', + mgu: 'mgu-latn-pg', + mgv: 'mgv-latn-tz', + mgw: 'mgw-latn-tz', + mgy: 'mgy-latn-tz', + mgz: 'mgz-latn-tz', + mh: 'mh-latn-mh', + mhb: 'mhb-latn-ga', + mhc: 'mhc-latn-mx', + mhd: 'mhd-latn-tz', + mhe: 'mhe-latn-my', + mhf: 'mhf-latn-pg', + mhg: 'mhg-latn-au', + mhi: 'mhi-latn-zz', + mhj: 'mhj-arab-af', + mhk: 'mhk-latn-cm', + mhl: 'mhl-latn-zz', + mhm: 'mhm-latn-mz', + mhn: 'mhn-latn-it', + mho: 'mho-latn-zm', + mhp: 'mhp-latn-id', + mhq: 'mhq-latn-us', + mhs: 'mhs-latn-id', + mht: 'mht-latn-ve', + mhu: 'mhu-latn-in', + mhw: 'mhw-latn-bw', + mhx: 'mhx-latn-mm', + mhy: 'mhy-latn-id', + mhz: 'mhz-latn-id', + mi: 'mi-latn-nz', + mia: 'mia-latn-us', + mib: 'mib-latn-mx', + mic: 'mic-latn-ca', + mid: 'mid-mand-iq', + mie: 'mie-latn-mx', + mif: 'mif-latn-zz', + mig: 'mig-latn-mx', + mih: 'mih-latn-mx', + mii: 'mii-latn-mx', + mij: 'mij-latn-cm', + mik: 'mik-latn-us', + mil: 'mil-latn-mx', + mim: 'mim-latn-mx', + min: 'min-latn-id', + mio: 'mio-latn-mx', + mip: 'mip-latn-mx', + miq: 'miq-latn-ni', + mir: 'mir-latn-mx', + mit: 'mit-latn-mx', + miu: 'miu-latn-mx', + miw: 'miw-latn-zz', + mix: 'mix-latn-mx', + miy: 'miy-latn-mx', + miz: 'miz-latn-mx', + mjb: 'mjb-latn-tl', + mjc: 'mjc-latn-mx', + mjd: 'mjd-latn-us', + mje: 'mje-latn-td', + mjg: 'mjg-latn-cn', + mjh: 'mjh-latn-tz', + mji: 'mji-latn-cn', + mjj: 'mjj-latn-pg', + mjk: 'mjk-latn-pg', + mjl: 'mjl-deva-in', + 'mjl-takr': 'mjl-takr-in', + mjm: 'mjm-latn-pg', + mjn: 'mjn-latn-pg', + mjq: 'mjq-mlym-in', + mjr: 'mjr-mlym-in', + mjs: 'mjs-latn-ng', + mjt: 'mjt-deva-in', + 'mjt-beng': 'mjt-beng-bd', + mju: 'mju-telu-in', + mjv: 'mjv-mlym-in', + mjw: 'mjw-latn-in', + mjx: 'mjx-latn-bd', + 'mjx-beng': 'mjx-beng-bd', + mjy: 'mjy-latn-us', + mjz: 'mjz-deva-np', + mk: 'mk-cyrl-mk', + mka: 'mka-latn-ci', + mkb: 'mkb-deva-in', + mkc: 'mkc-latn-pg', + mke: 'mke-deva-in', + mkf: 'mkf-latn-ng', + mki: 'mki-arab-zz', + mkj: 'mkj-latn-fm', + mkk: 'mkk-latn-cm', + mkl: 'mkl-latn-zz', + mkm: 'mkm-thai-th', + mkn: 'mkn-latn-id', + mko: 'mko-latn-ng', + mkp: 'mkp-latn-zz', + mkr: 'mkr-latn-pg', + mks: 'mks-latn-mx', + mkt: 'mkt-latn-nc', + mku: 'mku-latn-gn', + mkv: 'mkv-latn-vu', + mkw: 'mkw-latn-zz', + mkx: 'mkx-latn-ph', + mky: 'mky-latn-id', + mkz: 'mkz-latn-tl', + ml: 'ml-mlym-in', + mla: 'mla-latn-vu', + mlb: 'mlb-latn-cm', + mlc: 'mlc-latn-vn', + mle: 'mle-latn-zz', + mlf: 'mlf-thai-la', + 'mlf-latn': 'mlf-latn-la', + mlh: 'mlh-latn-pg', + mli: 'mli-latn-id', + mlj: 'mlj-latn-td', + mlk: 'mlk-latn-ke', + mll: 'mll-latn-vu', + mln: 'mln-latn-sb', + mlo: 'mlo-latn-sn', + mlp: 'mlp-latn-zz', + mlq: 'mlq-latn-sn', + 'mlq-arab': 'mlq-arab-sn', + mlr: 'mlr-latn-cm', + mls: 'mls-latn-sd', + mlu: 'mlu-latn-sb', + mlv: 'mlv-latn-vu', + mlw: 'mlw-latn-cm', + mlx: 'mlx-latn-vu', + mlz: 'mlz-latn-ph', + mma: 'mma-latn-ng', + mmb: 'mmb-latn-id', + mmc: 'mmc-latn-mx', + mmd: 'mmd-latn-cn', + 'mmd-hans': 'mmd-hans-cn', + 'mmd-hant': 'mmd-hant-cn', + mme: 'mme-latn-vu', + mmf: 'mmf-latn-ng', + mmg: 'mmg-latn-vu', + mmh: 'mmh-latn-br', + mmi: 'mmi-latn-pg', + mmm: 'mmm-latn-vu', + mmn: 'mmn-latn-ph', + mmo: 'mmo-latn-zz', + mmp: 'mmp-latn-pg', + mmq: 'mmq-latn-pg', + mmr: 'mmr-latn-cn', + mmt: 'mmt-latn-pg', + mmu: 'mmu-latn-zz', + mmv: 'mmv-latn-br', + mmw: 'mmw-latn-vu', + mmx: 'mmx-latn-zz', + mmy: 'mmy-latn-td', + mmz: 'mmz-latn-cd', + mn: 'mn-cyrl-mn', + 'mn-cn': 'mn-mong-cn', + 'mn-mong': 'mn-mong-cn', + mna: 'mna-latn-zz', + mnb: 'mnb-latn-id', + mnd: 'mnd-latn-br', + mne: 'mne-latn-td', + mnf: 'mnf-latn-zz', + mng: 'mng-latn-vn', + mnh: 'mnh-latn-cd', + mni: 'mni-beng-in', + mnj: 'mnj-arab-af', + mnl: 'mnl-latn-vu', + mnm: 'mnm-latn-pg', + mnn: 'mnn-latn-vn', + mnp: 'mnp-latn-cn', + mnq: 'mnq-latn-my', + mnr: 'mnr-latn-us', + mns: 'mns-cyrl-ru', + mnu: 'mnu-latn-id', + mnv: 'mnv-latn-sb', + mnw: 'mnw-mymr-mm', + mnx: 'mnx-latn-id', + mny: 'mny-latn-mz', + mnz: 'mnz-latn-id', + mo: 'mo-latn-ro', + moa: 'moa-latn-zz', + moc: 'moc-latn-ar', + mod: 'mod-latn-us', + moe: 'moe-latn-ca', + mog: 'mog-latn-id', + moh: 'moh-latn-ca', + moi: 'moi-latn-ng', + moj: 'moj-latn-cg', + mok: 'mok-latn-id', + mom: 'mom-latn-ni', + moo: 'moo-latn-vn', + mop: 'mop-latn-bz', + moq: 'moq-latn-id', + mor: 'mor-latn-sd', + mos: 'mos-latn-bf', + mot: 'mot-latn-co', + mou: 'mou-latn-td', + mov: 'mov-latn-us', + mow: 'mow-latn-cg', + mox: 'mox-latn-zz', + moy: 'moy-latn-et', + 'moy-ethi': 'moy-ethi-et', + moz: 'moz-latn-td', + mpa: 'mpa-latn-tz', + mpb: 'mpb-latn-au', + mpc: 'mpc-latn-au', + mpd: 'mpd-latn-br', + mpe: 'mpe-latn-et', + 'mpe-ethi': 'mpe-ethi-et', + mpg: 'mpg-latn-td', + mph: 'mph-latn-au', + mpi: 'mpi-latn-cm', + mpj: 'mpj-latn-au', + mpk: 'mpk-latn-td', + mpl: 'mpl-latn-pg', + mpm: 'mpm-latn-mx', + mpn: 'mpn-latn-pg', + mpo: 'mpo-latn-pg', + mpp: 'mpp-latn-zz', + mpq: 'mpq-latn-br', + mpr: 'mpr-latn-sb', + mps: 'mps-latn-zz', + mpt: 'mpt-latn-zz', + mpu: 'mpu-latn-br', + mpv: 'mpv-latn-pg', + mpw: 'mpw-latn-br', + mpx: 'mpx-latn-zz', + mpy: 'mpy-latn-id', + mpz: 'mpz-thai-th', + mqa: 'mqa-latn-id', + mqb: 'mqb-latn-cm', + mqc: 'mqc-latn-id', + mqe: 'mqe-latn-pg', + mqf: 'mqf-latn-id', + mqg: 'mqg-latn-id', + mqh: 'mqh-latn-mx', + mqi: 'mqi-latn-id', + mqj: 'mqj-latn-id', + mqk: 'mqk-latn-ph', + mql: 'mql-latn-zz', + mqm: 'mqm-latn-pf', + mqn: 'mqn-latn-id', + mqo: 'mqo-latn-id', + mqp: 'mqp-latn-id', + mqq: 'mqq-latn-my', + mqr: 'mqr-latn-id', + mqs: 'mqs-latn-id', + mqu: 'mqu-latn-ss', + mqv: 'mqv-latn-pg', + mqw: 'mqw-latn-pg', + mqx: 'mqx-latn-id', + 'mqx-bugi': 'mqx-bugi-id', + mqy: 'mqy-latn-id', + mqz: 'mqz-latn-pg', + mr: 'mr-deva-in', + mra: 'mra-thai-th', + mrb: 'mrb-latn-vu', + mrc: 'mrc-latn-us', + mrd: 'mrd-deva-np', + mrf: 'mrf-latn-id', + mrg: 'mrg-latn-in', + 'mrg-beng': 'mrg-beng-in', + 'mrg-deva': 'mrg-deva-in', + mrh: 'mrh-latn-in', + mrj: 'mrj-cyrl-ru', + mrk: 'mrk-latn-nc', + mrl: 'mrl-latn-fm', + mrm: 'mrm-latn-vu', + mrn: 'mrn-latn-sb', + mro: 'mro-mroo-bd', + mrp: 'mrp-latn-vu', + mrq: 'mrq-latn-pf', + mrr: 'mrr-deva-in', + mrs: 'mrs-latn-vu', + mrt: 'mrt-latn-ng', + mru: 'mru-latn-cm', + mrv: 'mrv-latn-pf', + mrw: 'mrw-latn-ph', + 'mrw-arab': 'mrw-arab-ph', + mrx: 'mrx-latn-id', + mry: 'mry-latn-ph', + mrz: 'mrz-latn-id', + ms: 'ms-latn-my', + 'ms-cc': 'ms-arab-cc', + msb: 'msb-latn-ph', + msc: 'msc-latn-gn', + mse: 'mse-latn-td', + msf: 'msf-latn-id', + msg: 'msg-latn-id', + msh: 'msh-latn-mg', + msi: 'msi-latn-my', + msj: 'msj-latn-cd', + msk: 'msk-latn-ph', + msl: 'msl-latn-id', + msm: 'msm-latn-ph', + msn: 'msn-latn-vu', + mso: 'mso-latn-id', + msp: 'msp-latn-br', + msq: 'msq-latn-nc', + mss: 'mss-latn-id', + msu: 'msu-latn-pg', + msv: 'msv-latn-cm', + msw: 'msw-latn-gw', + msx: 'msx-latn-pg', + msy: 'msy-latn-pg', + msz: 'msz-latn-pg', + mt: 'mt-latn-mt', + mta: 'mta-latn-ph', + mtb: 'mtb-latn-ci', + mtc: 'mtc-latn-zz', + mtd: 'mtd-latn-id', + mte: 'mte-latn-sb', + mtf: 'mtf-latn-zz', + mtg: 'mtg-latn-id', + mth: 'mth-latn-id', + mti: 'mti-latn-zz', + mtj: 'mtj-latn-id', + mtk: 'mtk-latn-cm', + mtl: 'mtl-latn-ng', + mtm: 'mtm-cyrl-ru', + mtn: 'mtn-latn-ni', + mto: 'mto-latn-mx', + mtp: 'mtp-latn-bo', + mtq: 'mtq-latn-vn', + mtr: 'mtr-deva-in', + mts: 'mts-latn-pe', + mtt: 'mtt-latn-vu', + mtu: 'mtu-latn-mx', + mtv: 'mtv-latn-pg', + mtw: 'mtw-latn-ph', + mtx: 'mtx-latn-mx', + mty: 'mty-latn-pg', + mua: 'mua-latn-cm', + mub: 'mub-latn-td', + muc: 'muc-latn-cm', + mud: 'mud-cyrl-ru', + mue: 'mue-latn-ec', + mug: 'mug-latn-cm', + muh: 'muh-latn-ss', + mui: 'mui-latn-id', + muj: 'muj-latn-td', + muk: 'muk-tibt-np', + mum: 'mum-latn-pg', + muo: 'muo-latn-cm', + muq: 'muq-latn-cn', + mur: 'mur-latn-zz', + mus: 'mus-latn-us', + mut: 'mut-deva-in', + muu: 'muu-latn-ke', + muv: 'muv-taml-in', + mux: 'mux-latn-pg', + muy: 'muy-latn-cm', + muz: 'muz-ethi-et', + 'muz-latn': 'muz-latn-et', + mva: 'mva-latn-zz', + mvd: 'mvd-latn-id', + mvf: 'mvf-mong-cn', + 'mvf-phag': 'mvf-phag-cn', + mvg: 'mvg-latn-mx', + mvh: 'mvh-latn-td', + mvk: 'mvk-latn-pg', + mvl: 'mvl-latn-au', + mvn: 'mvn-latn-zz', + mvo: 'mvo-latn-sb', + mvp: 'mvp-latn-id', + mvq: 'mvq-latn-pg', + mvr: 'mvr-latn-id', + mvs: 'mvs-latn-id', + mvt: 'mvt-latn-vu', + mvu: 'mvu-latn-td', + mvv: 'mvv-latn-my', + mvw: 'mvw-latn-tz', + mvx: 'mvx-latn-id', + mvy: 'mvy-arab-pk', + mvz: 'mvz-ethi-et', + 'mvz-arab': 'mvz-arab-et', + mwa: 'mwa-latn-pg', + mwb: 'mwb-latn-pg', + mwc: 'mwc-latn-pg', + mwe: 'mwe-latn-tz', + mwf: 'mwf-latn-au', + mwg: 'mwg-latn-pg', + mwh: 'mwh-latn-pg', + mwi: 'mwi-latn-vu', + mwk: 'mwk-latn-ml', + mwl: 'mwl-latn-pt', + mwm: 'mwm-latn-td', + mwn: 'mwn-latn-zm', + mwo: 'mwo-latn-vu', + mwp: 'mwp-latn-au', + mwq: 'mwq-latn-mm', + mwr: 'mwr-deva-in', + mws: 'mws-latn-ke', + mwt: 'mwt-mymr-mm', + 'mwt-thai': 'mwt-thai-th', + mwu: 'mwu-latn-ss', + mwv: 'mwv-latn-id', + mww: 'mww-hmnp-us', + mwz: 'mwz-latn-cd', + mxa: 'mxa-latn-mx', + mxb: 'mxb-latn-mx', + mxc: 'mxc-latn-zw', + mxd: 'mxd-latn-id', + mxe: 'mxe-latn-vu', + mxf: 'mxf-latn-cm', + mxg: 'mxg-latn-ao', + mxh: 'mxh-latn-cd', + mxi: 'mxi-latn-es', + mxj: 'mxj-latn-in', + mxk: 'mxk-latn-pg', + mxl: 'mxl-latn-bj', + mxm: 'mxm-latn-zz', + mxn: 'mxn-latn-id', + mxo: 'mxo-latn-zm', + mxp: 'mxp-latn-mx', + mxq: 'mxq-latn-mx', + mxr: 'mxr-latn-my', + mxs: 'mxs-latn-mx', + mxt: 'mxt-latn-mx', + mxu: 'mxu-latn-cm', + mxv: 'mxv-latn-mx', + mxw: 'mxw-latn-pg', + mxx: 'mxx-latn-ci', + mxy: 'mxy-latn-mx', + mxz: 'mxz-latn-id', + my: 'my-mymr-mm', + myb: 'myb-latn-td', + myc: 'myc-latn-cd', + mye: 'mye-latn-ga', + myf: 'myf-latn-et', + myg: 'myg-latn-cm', + myh: 'myh-latn-us', + myj: 'myj-latn-ss', + myk: 'myk-latn-zz', + myl: 'myl-latn-id', + mym: 'mym-ethi-zz', + myp: 'myp-latn-br', + myr: 'myr-latn-pe', + myu: 'myu-latn-br', + myv: 'myv-cyrl-ru', + myw: 'myw-latn-zz', + myx: 'myx-latn-ug', + myy: 'myy-latn-co', + myz: 'myz-mand-ir', + mza: 'mza-latn-mx', + mzd: 'mzd-latn-cm', + mze: 'mze-latn-pg', + mzh: 'mzh-latn-ar', + mzi: 'mzi-latn-mx', + mzj: 'mzj-latn-lr', + mzk: 'mzk-latn-zz', + mzl: 'mzl-latn-mx', + mzm: 'mzm-latn-zz', + mzn: 'mzn-arab-ir', + mzo: 'mzo-latn-br', + mzp: 'mzp-latn-zz', + mzq: 'mzq-latn-id', + mzr: 'mzr-latn-br', + mzt: 'mzt-latn-my', + mzu: 'mzu-latn-pg', + mzv: 'mzv-latn-cf', + mzw: 'mzw-latn-zz', + mzx: 'mzx-latn-gy', + mzz: 'mzz-latn-zz', + na: 'na-latn-nr', + naa: 'naa-latn-id', + nab: 'nab-latn-br', + nac: 'nac-latn-zz', + nae: 'nae-latn-id', + naf: 'naf-latn-zz', + nag: 'nag-latn-in', + naj: 'naj-latn-gn', + nak: 'nak-latn-zz', + nal: 'nal-latn-pg', + nam: 'nam-latn-au', + nan: 'nan-hans-cn', + nao: 'nao-deva-np', + nap: 'nap-latn-it', + naq: 'naq-latn-na', + nar: 'nar-latn-ng', + nas: 'nas-latn-zz', + nat: 'nat-latn-ng', + naw: 'naw-latn-gh', + nax: 'nax-latn-pg', + nay: 'nay-latn-au', + naz: 'naz-latn-mx', + nb: 'nb-latn-no', + nba: 'nba-latn-ao', + nbb: 'nbb-latn-ng', + nbc: 'nbc-latn-in', + nbd: 'nbd-latn-cd', + nbe: 'nbe-latn-in', + nbh: 'nbh-latn-ng', + nbi: 'nbi-latn-in', + nbj: 'nbj-latn-au', + nbk: 'nbk-latn-pg', + nbm: 'nbm-latn-cf', + nbn: 'nbn-latn-id', + nbo: 'nbo-latn-ng', + nbp: 'nbp-latn-ng', + nbq: 'nbq-latn-id', + nbr: 'nbr-latn-ng', + nbt: 'nbt-latn-in', + 'nbt-deva': 'nbt-deva-in', + nbu: 'nbu-latn-in', + nbv: 'nbv-latn-cm', + nbw: 'nbw-latn-cd', + nby: 'nby-latn-pg', + nca: 'nca-latn-zz', + ncb: 'ncb-latn-in', + 'ncb-deva': 'ncb-deva-in', + ncc: 'ncc-latn-pg', + ncd: 'ncd-deva-np', + nce: 'nce-latn-zz', + ncf: 'ncf-latn-zz', + ncg: 'ncg-latn-ca', + nch: 'nch-latn-mx', + nci: 'nci-latn-mx', + ncj: 'ncj-latn-mx', + nck: 'nck-latn-au', + ncl: 'ncl-latn-mx', + ncm: 'ncm-latn-pg', + ncn: 'ncn-latn-pg', + nco: 'nco-latn-zz', + ncq: 'ncq-laoo-la', + 'ncq-thai': 'ncq-thai-la', + ncr: 'ncr-latn-cm', + nct: 'nct-latn-in', + 'nct-beng': 'nct-beng-in', + ncu: 'ncu-latn-zz', + ncx: 'ncx-latn-mx', + ncz: 'ncz-latn-us', + nd: 'nd-latn-zw', + nda: 'nda-latn-cg', + ndb: 'ndb-latn-cm', + ndc: 'ndc-latn-mz', + ndd: 'ndd-latn-ng', + ndf: 'ndf-cyrl-ru', + ndg: 'ndg-latn-tz', + ndh: 'ndh-latn-tz', + ndi: 'ndi-latn-ng', + ndj: 'ndj-latn-tz', + ndk: 'ndk-latn-cd', + ndl: 'ndl-latn-cd', + ndm: 'ndm-latn-td', + ndn: 'ndn-latn-cg', + ndp: 'ndp-latn-ug', + ndq: 'ndq-latn-ao', + ndr: 'ndr-latn-ng', + nds: 'nds-latn-de', + ndt: 'ndt-latn-cd', + ndu: 'ndu-latn-cm', + ndv: 'ndv-latn-sn', + ndw: 'ndw-latn-cd', + ndx: 'ndx-latn-id', + ndy: 'ndy-latn-cf', + 'ndy-td': 'ndy-latn-td', + ndz: 'ndz-latn-ss', + ne: 'ne-deva-np', + nea: 'nea-latn-id', + neb: 'neb-latn-zz', + nec: 'nec-latn-id', + ned: 'ned-latn-ng', + nee: 'nee-latn-nc', + neg: 'neg-cyrl-ru', + neh: 'neh-tibt-bt', + nei: 'nei-xsux-tr', + nej: 'nej-latn-pg', + nek: 'nek-latn-nc', + nem: 'nem-latn-nc', + nen: 'nen-latn-nc', + neo: 'neo-latn-vn', + neq: 'neq-latn-mx', + ner: 'ner-latn-id', + net: 'net-latn-pg', + neu: 'neu-latn-001', + new: 'new-deva-np', + nex: 'nex-latn-zz', + ney: 'ney-latn-ci', + nez: 'nez-latn-us', + nfa: 'nfa-latn-id', + nfd: 'nfd-latn-ng', + nfl: 'nfl-latn-sb', + nfr: 'nfr-latn-zz', + nfu: 'nfu-latn-cm', + ng: 'ng-latn-na', + nga: 'nga-latn-zz', + ngb: 'ngb-latn-zz', + ngc: 'ngc-latn-cd', + ngd: 'ngd-latn-cf', + nge: 'nge-latn-cm', + ngg: 'ngg-latn-cf', + ngh: 'ngh-latn-za', + ngi: 'ngi-latn-ng', + ngj: 'ngj-latn-cm', + ngk: 'ngk-latn-au', + ngl: 'ngl-latn-mz', + ngm: 'ngm-latn-fm', + ngn: 'ngn-latn-cm', + ngp: 'ngp-latn-tz', + ngq: 'ngq-latn-tz', + ngr: 'ngr-latn-sb', + ngs: 'ngs-latn-ng', + ngt: 'ngt-laoo-la', + ngu: 'ngu-latn-mx', + ngv: 'ngv-latn-cm', + ngw: 'ngw-latn-ng', + ngx: 'ngx-latn-ng', + ngy: 'ngy-latn-cm', + ngz: 'ngz-latn-cg', + nha: 'nha-latn-au', + nhb: 'nhb-latn-zz', + nhc: 'nhc-latn-mx', + nhd: 'nhd-latn-py', + nhe: 'nhe-latn-mx', + nhf: 'nhf-latn-au', + nhg: 'nhg-latn-mx', + nhi: 'nhi-latn-mx', + nhk: 'nhk-latn-mx', + nhm: 'nhm-latn-mx', + nhn: 'nhn-latn-mx', + nho: 'nho-latn-pg', + nhp: 'nhp-latn-mx', + nhq: 'nhq-latn-mx', + nhr: 'nhr-latn-bw', + nht: 'nht-latn-mx', + nhu: 'nhu-latn-cm', + nhv: 'nhv-latn-mx', + nhw: 'nhw-latn-mx', + nhx: 'nhx-latn-mx', + nhy: 'nhy-latn-mx', + nhz: 'nhz-latn-mx', + nia: 'nia-latn-id', + nib: 'nib-latn-pg', + nid: 'nid-latn-au', + nie: 'nie-latn-td', + nif: 'nif-latn-zz', + nig: 'nig-latn-au', + nih: 'nih-latn-tz', + nii: 'nii-latn-zz', + nij: 'nij-latn-id', + nil: 'nil-latn-id', + nim: 'nim-latn-tz', + nin: 'nin-latn-zz', + nio: 'nio-cyrl-ru', + niq: 'niq-latn-ke', + nir: 'nir-latn-id', + nis: 'nis-latn-pg', + nit: 'nit-telu-in', + niu: 'niu-latn-nu', + niv: 'niv-cyrl-ru', + 'niv-latn': 'niv-latn-ru', + niw: 'niw-latn-pg', + nix: 'nix-latn-cd', + niy: 'niy-latn-zz', + niz: 'niz-latn-zz', + nja: 'nja-latn-ng', + njb: 'njb-latn-in', + njd: 'njd-latn-tz', + njh: 'njh-latn-in', + nji: 'nji-latn-au', + njj: 'njj-latn-cm', + njl: 'njl-latn-ss', + njm: 'njm-latn-in', + njn: 'njn-latn-in', + njo: 'njo-latn-in', + njr: 'njr-latn-ng', + njs: 'njs-latn-id', + njt: 'njt-latn-sr', + nju: 'nju-latn-au', + njx: 'njx-latn-cg', + njy: 'njy-latn-cm', + njz: 'njz-latn-in', + 'njz-beng': 'njz-beng-in', + nka: 'nka-latn-zm', + nkb: 'nkb-latn-in', + nkc: 'nkc-latn-cm', + nkd: 'nkd-latn-in', + nke: 'nke-latn-sb', + nkf: 'nkf-latn-in', + nkg: 'nkg-latn-zz', + nkh: 'nkh-latn-in', + nki: 'nki-latn-in', + 'nki-beng': 'nki-beng-in', + nkj: 'nkj-latn-id', + nkk: 'nkk-latn-vu', + nkm: 'nkm-latn-pg', + nkn: 'nkn-latn-ao', + nko: 'nko-latn-zz', + nkq: 'nkq-latn-gh', + nkr: 'nkr-latn-fm', + nks: 'nks-latn-id', + nkt: 'nkt-latn-tz', + nku: 'nku-latn-ci', + nkv: 'nkv-latn-mw', + nkw: 'nkw-latn-cd', + nkx: 'nkx-latn-ng', + nkz: 'nkz-latn-ng', + nl: 'nl-latn-nl', + nla: 'nla-latn-cm', + nlc: 'nlc-latn-id', + nle: 'nle-latn-ke', + nlg: 'nlg-latn-sb', + nli: 'nli-arab-af', + nlj: 'nlj-latn-cd', + nlk: 'nlk-latn-id', + nlm: 'nlm-arab-pk', + nlo: 'nlo-latn-cd', + nlq: 'nlq-latn-mm', + nlu: 'nlu-latn-gh', + nlv: 'nlv-latn-mx', + nlw: 'nlw-latn-au', + nlx: 'nlx-deva-in', + nly: 'nly-latn-au', + nlz: 'nlz-latn-sb', + nma: 'nma-latn-in', + nmb: 'nmb-latn-vu', + nmc: 'nmc-latn-td', + nmd: 'nmd-latn-ga', + nme: 'nme-latn-in', + nmf: 'nmf-latn-in', + nmg: 'nmg-latn-cm', + nmh: 'nmh-latn-in', + nmi: 'nmi-latn-ng', + nmj: 'nmj-latn-cf', + nmk: 'nmk-latn-vu', + nml: 'nml-latn-cm', + nmm: 'nmm-deva-np', + 'nmm-tibt': 'nmm-tibt-np', + nmn: 'nmn-latn-bw', + nmo: 'nmo-latn-in', + 'nmo-beng': 'nmo-beng-in', + nmp: 'nmp-latn-au', + nmq: 'nmq-latn-zw', + nmr: 'nmr-latn-cm', + nms: 'nms-latn-vu', + nmt: 'nmt-latn-fm', + nmu: 'nmu-latn-us', + nmv: 'nmv-latn-au', + nmw: 'nmw-latn-pg', + nmx: 'nmx-latn-pg', + nmz: 'nmz-latn-zz', + nn: 'nn-latn-no', + nna: 'nna-latn-au', + nnb: 'nnb-latn-cd', + nnc: 'nnc-latn-td', + nnd: 'nnd-latn-vu', + nne: 'nne-latn-ao', + nnf: 'nnf-latn-zz', + nng: 'nng-latn-in', + 'nng-beng': 'nng-beng-in', + nnh: 'nnh-latn-cm', + nni: 'nni-latn-id', + nnj: 'nnj-latn-et', + nnk: 'nnk-latn-zz', + nnl: 'nnl-latn-in', + nnm: 'nnm-latn-zz', + nnn: 'nnn-latn-td', + nnp: 'nnp-wcho-in', + nnq: 'nnq-latn-tz', + nnr: 'nnr-latn-au', + nnt: 'nnt-latn-us', + nnu: 'nnu-latn-gh', + nnv: 'nnv-latn-au', + nnw: 'nnw-latn-bf', + nny: 'nny-latn-au', + nnz: 'nnz-latn-cm', + no: 'no-latn-no', + noa: 'noa-latn-co', + noc: 'noc-latn-pg', + nod: 'nod-lana-th', + noe: 'noe-deva-in', + nof: 'nof-latn-pg', + nog: 'nog-cyrl-ru', + noh: 'noh-latn-pg', + noi: 'noi-deva-in', + noj: 'noj-latn-co', + nok: 'nok-latn-us', + nom: 'nom-latn-pe', + non: 'non-runr-se', + nop: 'nop-latn-zz', + noq: 'noq-latn-cd', + nos: 'nos-yiii-cn', + not: 'not-latn-pe', + nou: 'nou-latn-zz', + nov: 'nov-latn-001', + now: 'now-latn-tz', + noy: 'noy-latn-td', + npb: 'npb-tibt-bt', + npg: 'npg-latn-mm', + nph: 'nph-latn-in', + npl: 'npl-latn-mx', + npn: 'npn-latn-pg', + npo: 'npo-latn-in', + nps: 'nps-latn-id', + npu: 'npu-latn-in', + npx: 'npx-latn-sb', + npy: 'npy-latn-id', + nqg: 'nqg-latn-bj', + nqk: 'nqk-latn-bj', + nql: 'nql-latn-ao', + nqm: 'nqm-latn-id', + nqn: 'nqn-latn-pg', + nqo: 'nqo-nkoo-gn', + nqq: 'nqq-latn-mm', + nqt: 'nqt-latn-ng', + nqy: 'nqy-latn-mm', + nr: 'nr-latn-za', + nra: 'nra-latn-ga', + nrb: 'nrb-latn-zz', + nre: 'nre-latn-in', + nrf: 'nrf-latn-je', + nrg: 'nrg-latn-vu', + nri: 'nri-latn-in', + nrk: 'nrk-latn-au', + nrl: 'nrl-latn-au', + nrm: 'nrm-latn-my', + nrp: 'nrp-latn-it', + nru: 'nru-latn-cn', + 'nru-hans': 'nru-hans-cn', + 'nru-hant': 'nru-hant-cn', + nrx: 'nrx-latn-au', + nrz: 'nrz-latn-pg', + nsa: 'nsa-latn-in', + nsb: 'nsb-latn-za', + nsc: 'nsc-latn-ng', + nsd: 'nsd-yiii-cn', + nse: 'nse-latn-zm', + nsf: 'nsf-yiii-cn', + nsg: 'nsg-latn-tz', + nsh: 'nsh-latn-cm', + nsk: 'nsk-cans-ca', + nsm: 'nsm-latn-in', + nsn: 'nsn-latn-zz', + nso: 'nso-latn-za', + nsq: 'nsq-latn-us', + nss: 'nss-latn-zz', + nst: 'nst-tnsa-in', + nsu: 'nsu-latn-mx', + nsv: 'nsv-yiii-cn', + nsw: 'nsw-latn-vu', + nsx: 'nsx-latn-ao', + nsy: 'nsy-latn-id', + nsz: 'nsz-latn-us', + ntd: 'ntd-latn-my', + nte: 'nte-latn-mz', + ntg: 'ntg-latn-au', + nti: 'nti-latn-bf', + ntj: 'ntj-latn-au', + ntk: 'ntk-latn-tz', + ntm: 'ntm-latn-zz', + nto: 'nto-latn-cd', + ntp: 'ntp-latn-mx', + ntr: 'ntr-latn-zz', + ntu: 'ntu-latn-sb', + ntx: 'ntx-latn-mm', + nty: 'nty-yiii-vn', + ntz: 'ntz-arab-ir', + nua: 'nua-latn-nc', + nuc: 'nuc-latn-br', + nud: 'nud-latn-pg', + nue: 'nue-latn-cd', + nuf: 'nuf-latn-cn', + nug: 'nug-latn-au', + nuh: 'nuh-latn-ng', + nui: 'nui-latn-zz', + nuj: 'nuj-latn-ug', + nuk: 'nuk-latn-ca', + num: 'num-latn-to', + nun: 'nun-latn-mm', + nuo: 'nuo-latn-vn', + nup: 'nup-latn-zz', + nuq: 'nuq-latn-pg', + nur: 'nur-latn-pg', + nus: 'nus-latn-ss', + nut: 'nut-latn-vn', + nuu: 'nuu-latn-cd', + nuv: 'nuv-latn-zz', + nuw: 'nuw-latn-fm', + nux: 'nux-latn-zz', + nuy: 'nuy-latn-au', + nuz: 'nuz-latn-mx', + nv: 'nv-latn-us', + nvh: 'nvh-latn-vu', + nvm: 'nvm-latn-pg', + nvo: 'nvo-latn-cm', + nwb: 'nwb-latn-zz', + nwc: 'nwc-newa-np', + 'nwc-brah': 'nwc-brah-np', + 'nwc-deva': 'nwc-deva-np', + 'nwc-sidd': 'nwc-sidd-np', + nwe: 'nwe-latn-cm', + nwg: 'nwg-latn-au', + nwi: 'nwi-latn-vu', + nwm: 'nwm-latn-ss', + nwo: 'nwo-latn-au', + nwr: 'nwr-latn-pg', + nww: 'nww-latn-tz', + nwx: 'nwx-deva-np', + nxa: 'nxa-latn-tl', + nxd: 'nxd-latn-cd', + nxe: 'nxe-latn-id', + nxg: 'nxg-latn-id', + nxi: 'nxi-latn-tz', + nxl: 'nxl-latn-id', + nxn: 'nxn-latn-au', + nxo: 'nxo-latn-ga', + nxq: 'nxq-latn-cn', + nxr: 'nxr-latn-zz', + nxx: 'nxx-latn-id', + ny: 'ny-latn-mw', + nyb: 'nyb-latn-gh', + nyc: 'nyc-latn-cd', + nyd: 'nyd-latn-ke', + nye: 'nye-latn-ao', + nyf: 'nyf-latn-ke', + nyg: 'nyg-latn-cd', + nyh: 'nyh-latn-au', + nyi: 'nyi-latn-sd', + nyj: 'nyj-latn-cd', + nyk: 'nyk-latn-ao', + nyl: 'nyl-thai-th', + nym: 'nym-latn-tz', + nyn: 'nyn-latn-ug', + nyo: 'nyo-latn-ug', + nyp: 'nyp-latn-ug', + nyq: 'nyq-arab-ir', + nyr: 'nyr-latn-mw', + nys: 'nys-latn-au', + nyt: 'nyt-latn-au', + nyu: 'nyu-latn-mz', + nyv: 'nyv-latn-au', + nyx: 'nyx-latn-au', + nyy: 'nyy-latn-tz', + nza: 'nza-latn-cm', + nzb: 'nzb-latn-ga', + nzd: 'nzd-latn-cd', + nzi: 'nzi-latn-gh', + nzk: 'nzk-latn-cf', + nzm: 'nzm-latn-in', + nzu: 'nzu-latn-cg', + nzy: 'nzy-latn-td', + nzz: 'nzz-latn-ml', + oaa: 'oaa-cyrl-ru', + oac: 'oac-cyrl-ru', + oar: 'oar-syrc-sy', + oav: 'oav-geor-ge', + obi: 'obi-latn-us', + obk: 'obk-latn-ph', + obl: 'obl-latn-cm', + obm: 'obm-phnx-jo', + obo: 'obo-latn-ph', + obr: 'obr-mymr-mm', + obt: 'obt-latn-fr', + obu: 'obu-latn-ng', + oc: 'oc-latn-fr', + oca: 'oca-latn-pe', + oco: 'oco-latn-gb', + ocu: 'ocu-latn-mx', + oda: 'oda-latn-ng', + odk: 'odk-arab-pk', + odt: 'odt-latn-nl', + odu: 'odu-latn-ng', + ofu: 'ofu-latn-ng', + ogb: 'ogb-latn-ng', + ogc: 'ogc-latn-zz', + ogg: 'ogg-latn-ng', + ogo: 'ogo-latn-ng', + ogu: 'ogu-latn-ng', + oht: 'oht-xsux-tr', + oia: 'oia-latn-id', + oie: 'oie-latn-ss', + oin: 'oin-latn-pg', + oj: 'oj-cans-ca', + ojb: 'ojb-latn-ca', + 'ojb-cans': 'ojb-cans-ca', + ojc: 'ojc-latn-ca', + ojs: 'ojs-cans-ca', + ojv: 'ojv-latn-sb', + ojw: 'ojw-latn-ca', + 'ojw-cans': 'ojw-cans-ca', + oka: 'oka-latn-ca', + okb: 'okb-latn-ng', + okc: 'okc-latn-cd', + okd: 'okd-latn-ng', + oke: 'oke-latn-ng', + okg: 'okg-latn-au', + oki: 'oki-latn-ke', + okk: 'okk-latn-pg', + okm: 'okm-hang-kr', + oko: 'oko-hani-kr', + okr: 'okr-latn-zz', + oks: 'oks-latn-ng', + oku: 'oku-latn-cm', + okv: 'okv-latn-zz', + okx: 'okx-latn-ng', + okz: 'okz-khmr-kh', + ola: 'ola-deva-np', + 'ola-tibt': 'ola-tibt-cn', + old: 'old-latn-tz', + ole: 'ole-tibt-bt', + olk: 'olk-latn-au', + olm: 'olm-latn-ng', + olo: 'olo-latn-ru', + olr: 'olr-latn-vu', + olt: 'olt-latn-lt', + olu: 'olu-latn-ao', + om: 'om-latn-et', + oma: 'oma-latn-us', + omb: 'omb-latn-vu', + omc: 'omc-latn-pe', + omg: 'omg-latn-pe', + omi: 'omi-latn-cd', + omk: 'omk-cyrl-ru', + oml: 'oml-latn-cd', + omo: 'omo-latn-pg', + omp: 'omp-mtei-in', + omr: 'omr-modi-in', + omt: 'omt-latn-ke', + omu: 'omu-latn-pe', + omw: 'omw-latn-pg', + ona: 'ona-latn-ar', + one: 'one-latn-ca', + ong: 'ong-latn-zz', + oni: 'oni-latn-id', + onj: 'onj-latn-pg', + onk: 'onk-latn-pg', + onn: 'onn-latn-zz', + ono: 'ono-latn-ca', + onp: 'onp-latn-in', + 'onp-deva': 'onp-deva-in', + onr: 'onr-latn-pg', + ons: 'ons-latn-zz', + ont: 'ont-latn-pg', + onu: 'onu-latn-vu', + onx: 'onx-latn-id', + ood: 'ood-latn-us', + oon: 'oon-deva-in', + oor: 'oor-latn-za', + opa: 'opa-latn-ng', + opk: 'opk-latn-id', + opm: 'opm-latn-zz', + opo: 'opo-latn-pg', + opt: 'opt-latn-mx', + opy: 'opy-latn-br', + or: 'or-orya-in', + ora: 'ora-latn-sb', + orc: 'orc-latn-ke', + ore: 'ore-latn-pe', + org: 'org-latn-ng', + orn: 'orn-latn-my', + oro: 'oro-latn-zz', + orr: 'orr-latn-ng', + ors: 'ors-latn-my', + ort: 'ort-telu-in', + oru: 'oru-arab-zz', + orv: 'orv-cyrl-ru', + orw: 'orw-latn-br', + orx: 'orx-latn-ng', + orz: 'orz-latn-id', + os: 'os-cyrl-ge', + osa: 'osa-osge-us', + osc: 'osc-ital-it', + 'osc-latn': 'osc-latn-it', + osi: 'osi-java-id', + oso: 'oso-latn-ng', + osp: 'osp-latn-es', + ost: 'ost-latn-cm', + osu: 'osu-latn-pg', + osx: 'osx-latn-de', + ota: 'ota-arab-zz', + otb: 'otb-tibt-cn', + otd: 'otd-latn-id', + ote: 'ote-latn-mx', + oti: 'oti-latn-br', + otk: 'otk-orkh-mn', + otl: 'otl-latn-mx', + otm: 'otm-latn-mx', + otn: 'otn-latn-mx', + otq: 'otq-latn-mx', + otr: 'otr-latn-sd', + ots: 'ots-latn-mx', + ott: 'ott-latn-mx', + otu: 'otu-latn-br', + otw: 'otw-latn-ca', + otx: 'otx-latn-mx', + oty: 'oty-gran-in', + otz: 'otz-latn-mx', + oub: 'oub-latn-lr', + oue: 'oue-latn-pg', + oui: 'oui-ougr-143', + oum: 'oum-latn-pg', + ovd: 'ovd-latn-se', + owi: 'owi-latn-pg', + owl: 'owl-latn-gb', + oyd: 'oyd-latn-et', + oym: 'oym-latn-br', + oyy: 'oyy-latn-pg', + ozm: 'ozm-latn-zz', + pa: 'pa-guru-in', + 'pa-arab': 'pa-arab-pk', + 'pa-pk': 'pa-arab-pk', + pab: 'pab-latn-br', + pac: 'pac-latn-vn', + pad: 'pad-latn-br', + pae: 'pae-latn-cd', + paf: 'paf-latn-br', + pag: 'pag-latn-ph', + pah: 'pah-latn-br', + pai: 'pai-latn-ng', + pak: 'pak-latn-br', + pal: 'pal-phli-ir', + 'pal-phlp': 'pal-phlp-cn', + pam: 'pam-latn-ph', + pao: 'pao-latn-us', + pap: 'pap-latn-cw', + paq: 'paq-cyrl-tj', + par: 'par-latn-us', + pas: 'pas-latn-id', + pau: 'pau-latn-pw', + pav: 'pav-latn-br', + paw: 'paw-latn-us', + pax: 'pax-latn-br', + pay: 'pay-latn-hn', + paz: 'paz-latn-br', + pbb: 'pbb-latn-co', + pbc: 'pbc-latn-gy', + pbe: 'pbe-latn-mx', + pbf: 'pbf-latn-mx', + pbg: 'pbg-latn-ve', + pbh: 'pbh-latn-ve', + pbi: 'pbi-latn-zz', + pbl: 'pbl-latn-ng', + pbm: 'pbm-latn-mx', + pbn: 'pbn-latn-ng', + pbo: 'pbo-latn-gw', + pbp: 'pbp-latn-gn', + pbr: 'pbr-latn-tz', + pbs: 'pbs-latn-mx', + pbt: 'pbt-arab-af', + pbv: 'pbv-latn-in', + pby: 'pby-latn-pg', + pca: 'pca-latn-mx', + pcb: 'pcb-khmr-kh', + pcc: 'pcc-latn-cn', + 'pcc-hani': 'pcc-hani-cn', + pcd: 'pcd-latn-fr', + pce: 'pce-mymr-mm', + 'pce-thai': 'pce-thai-th', + pcf: 'pcf-mlym-in', + pcg: 'pcg-mlym-in', + 'pcg-knda': 'pcg-knda-in', + 'pcg-taml': 'pcg-taml-in', + pch: 'pch-deva-in', + pci: 'pci-deva-in', + 'pci-orya': 'pci-orya-in', + pcj: 'pcj-telu-in', + pck: 'pck-latn-in', + pcm: 'pcm-latn-ng', + pcn: 'pcn-latn-ng', + pcp: 'pcp-latn-bo', + pcw: 'pcw-latn-ng', + pda: 'pda-latn-pg', + pdc: 'pdc-latn-us', + pdn: 'pdn-latn-id', + pdo: 'pdo-latn-id', + pdt: 'pdt-latn-ca', + pdu: 'pdu-latn-mm', + 'pdu-mymr': 'pdu-mymr-mm', + pea: 'pea-latn-id', + peb: 'peb-latn-us', + ped: 'ped-latn-zz', + pee: 'pee-latn-id', + peg: 'peg-orya-in', + pei: 'pei-latn-mx', + pek: 'pek-latn-pg', + pel: 'pel-latn-id', + pem: 'pem-latn-cd', + peo: 'peo-xpeo-ir', + pep: 'pep-latn-pg', + peq: 'peq-latn-us', + pev: 'pev-latn-ve', + pex: 'pex-latn-zz', + pey: 'pey-latn-id', + pez: 'pez-latn-my', + pfa: 'pfa-latn-fm', + pfe: 'pfe-latn-cm', + pfl: 'pfl-latn-de', + pga: 'pga-latn-ss', + pgd: 'pgd-khar-pk', + pgg: 'pgg-deva-in', + pgi: 'pgi-latn-pg', + pgk: 'pgk-latn-vu', + pgl: 'pgl-ogam-ie', + pgn: 'pgn-ital-it', + pgs: 'pgs-latn-ng', + pgu: 'pgu-latn-id', + phd: 'phd-deva-in', + phg: 'phg-latn-vn', + phh: 'phh-latn-vn', + phk: 'phk-mymr-in', + phl: 'phl-arab-zz', + phm: 'phm-latn-mz', + phn: 'phn-phnx-lb', + pho: 'pho-laoo-la', + phr: 'phr-arab-pk', + pht: 'pht-thai-th', + phv: 'phv-arab-af', + phw: 'phw-deva-np', + pi: 'pi-sinh-in', + 'pi-brah': 'pi-brah-in', + 'pi-deva': 'pi-deva-in', + 'pi-khar': 'pi-khar-in', + 'pi-khmr': 'pi-khmr-in', + 'pi-mymr': 'pi-mymr-in', + 'pi-thai': 'pi-thai-in', + pia: 'pia-latn-mx', + pib: 'pib-latn-pe', + pic: 'pic-latn-ga', + pid: 'pid-latn-ve', + pif: 'pif-latn-fm', + pig: 'pig-latn-pe', + pih: 'pih-latn-nf', + pij: 'pij-latn-co', + pil: 'pil-latn-zz', + pim: 'pim-latn-us', + pin: 'pin-latn-pg', + pio: 'pio-latn-co', + pip: 'pip-latn-zz', + pir: 'pir-latn-br', + pis: 'pis-latn-sb', + pit: 'pit-latn-au', + piu: 'piu-latn-au', + piv: 'piv-latn-sb', + piw: 'piw-latn-tz', + pix: 'pix-latn-pg', + piy: 'piy-latn-ng', + piz: 'piz-latn-nc', + pjt: 'pjt-latn-au', + pka: 'pka-brah-in', + pkb: 'pkb-latn-ke', + pkg: 'pkg-latn-pg', + pkh: 'pkh-latn-bd', + 'pkh-deva': 'pkh-deva-bd', + pkn: 'pkn-latn-au', + pko: 'pko-latn-ke', + pkp: 'pkp-latn-ck', + pkr: 'pkr-mlym-in', + pku: 'pku-latn-id', + pl: 'pl-latn-pl', + pla: 'pla-latn-zz', + plb: 'plb-latn-vu', + plc: 'plc-latn-ph', + pld: 'pld-latn-gb', + ple: 'ple-latn-id', + plg: 'plg-latn-ar', + plh: 'plh-latn-id', + plj: 'plj-latn-ng', + plk: 'plk-arab-pk', + pll: 'pll-mymr-mm', + pln: 'pln-latn-co', + plo: 'plo-latn-mx', + plr: 'plr-latn-ci', + pls: 'pls-latn-mx', + plu: 'plu-latn-br', + plv: 'plv-latn-ph', + plw: 'plw-latn-ph', + plz: 'plz-latn-my', + pma: 'pma-latn-vu', + pmb: 'pmb-latn-cd', + pmd: 'pmd-latn-au', + pme: 'pme-latn-nc', + pmf: 'pmf-latn-id', + pmh: 'pmh-brah-in', + pmi: 'pmi-latn-cn', + pmj: 'pmj-latn-cn', + pml: 'pml-latn-tn', + pmm: 'pmm-latn-cm', + pmn: 'pmn-latn-cm', + pmo: 'pmo-latn-id', + pmq: 'pmq-latn-mx', + pmr: 'pmr-latn-pg', + pms: 'pms-latn-it', + pmt: 'pmt-latn-pf', + pmw: 'pmw-latn-us', + pmx: 'pmx-latn-in', + pmy: 'pmy-latn-id', + pmz: 'pmz-latn-mx', + pna: 'pna-latn-my', + pnc: 'pnc-latn-id', + pnd: 'pnd-latn-ao', + pne: 'pne-latn-my', + png: 'png-latn-zz', + pnh: 'pnh-latn-ck', + pni: 'pni-latn-id', + pnj: 'pnj-latn-au', + pnk: 'pnk-latn-bo', + pnl: 'pnl-latn-bf', + pnm: 'pnm-latn-my', + pnn: 'pnn-latn-zz', + pno: 'pno-latn-pe', + pnp: 'pnp-latn-id', + pnq: 'pnq-latn-bf', + pnr: 'pnr-latn-pg', + pns: 'pns-latn-id', + pnt: 'pnt-grek-gr', + pnv: 'pnv-latn-au', + pnw: 'pnw-latn-au', + pny: 'pny-latn-cm', + pnz: 'pnz-latn-cf', + poc: 'poc-latn-gt', + poe: 'poe-latn-mx', + pof: 'pof-latn-cd', + pog: 'pog-latn-br', + poh: 'poh-latn-gt', + poi: 'poi-latn-mx', + pok: 'pok-latn-br', + pom: 'pom-latn-us', + pon: 'pon-latn-fm', + poo: 'poo-latn-us', + pop: 'pop-latn-nc', + poq: 'poq-latn-mx', + pos: 'pos-latn-mx', + pot: 'pot-latn-us', + pov: 'pov-latn-gw', + pow: 'pow-latn-mx', + poy: 'poy-latn-tz', + ppa: 'ppa-deva-in', + ppe: 'ppe-latn-pg', + ppi: 'ppi-latn-mx', + ppk: 'ppk-latn-id', + ppl: 'ppl-latn-sv', + ppm: 'ppm-latn-id', + ppn: 'ppn-latn-pg', + ppo: 'ppo-latn-zz', + ppp: 'ppp-latn-cd', + ppq: 'ppq-latn-pg', + pps: 'pps-latn-mx', + ppt: 'ppt-latn-pg', + pqa: 'pqa-latn-ng', + pqm: 'pqm-latn-ca', + pra: 'pra-khar-pk', + prc: 'prc-arab-af', + prd: 'prd-arab-ir', + pre: 'pre-latn-st', + prf: 'prf-latn-ph', + prg: 'prg-latn-001', + prh: 'prh-latn-ph', + pri: 'pri-latn-nc', + prk: 'prk-latn-mm', + prm: 'prm-latn-pg', + pro: 'pro-latn-fr', + prp: 'prp-gujr-in', + prq: 'prq-latn-pe', + prr: 'prr-latn-br', + prt: 'prt-thai-th', + pru: 'pru-latn-id', + prw: 'prw-latn-pg', + prx: 'prx-arab-in', + 'prx-tibt': 'prx-tibt-in', + ps: 'ps-arab-af', + psa: 'psa-latn-id', + pse: 'pse-latn-id', + psh: 'psh-arab-af', + psi: 'psi-arab-af', + psm: 'psm-latn-bo', + psn: 'psn-latn-id', + psq: 'psq-latn-pg', + pss: 'pss-latn-zz', + pst: 'pst-arab-pk', + psw: 'psw-latn-vu', + pt: 'pt-latn-br', + pta: 'pta-latn-py', + pth: 'pth-latn-br', + pti: 'pti-latn-au', + ptn: 'ptn-latn-id', + pto: 'pto-latn-br', + ptp: 'ptp-latn-zz', + ptr: 'ptr-latn-vu', + ptt: 'ptt-latn-id', + ptu: 'ptu-latn-id', + ptv: 'ptv-latn-vu', + pua: 'pua-latn-mx', + pub: 'pub-latn-in', + puc: 'puc-latn-id', + pud: 'pud-latn-id', + pue: 'pue-latn-ar', + puf: 'puf-latn-id', + pug: 'pug-latn-bf', + pui: 'pui-latn-co', + puj: 'puj-latn-id', + pum: 'pum-deva-np', + puo: 'puo-latn-vn', + pup: 'pup-latn-pg', + puq: 'puq-latn-pe', + pur: 'pur-latn-br', + put: 'put-latn-id', + puu: 'puu-latn-ga', + puw: 'puw-latn-fm', + pux: 'pux-latn-pg', + puy: 'puy-latn-us', + pwa: 'pwa-latn-zz', + pwb: 'pwb-latn-ng', + pwg: 'pwg-latn-pg', + pwm: 'pwm-latn-ph', + pwn: 'pwn-latn-tw', + pwo: 'pwo-mymr-mm', + pwr: 'pwr-deva-in', + pww: 'pww-thai-th', + pxm: 'pxm-latn-mx', + pye: 'pye-latn-ci', + pym: 'pym-latn-ng', + pyn: 'pyn-latn-br', + pyu: 'pyu-latn-tw', + 'pyu-hani': 'pyu-hani-tw', + pyx: 'pyx-mymr-mm', + pyy: 'pyy-latn-mm', + pzh: 'pzh-latn-tw', + pzn: 'pzn-latn-mm', + qu: 'qu-latn-pe', + qua: 'qua-latn-us', + qub: 'qub-latn-pe', + quc: 'quc-latn-gt', + qud: 'qud-latn-ec', + quf: 'quf-latn-pe', + qug: 'qug-latn-ec', + qui: 'qui-latn-us', + quk: 'quk-latn-pe', + qul: 'qul-latn-bo', + qum: 'qum-latn-gt', + qun: 'qun-latn-us', + qup: 'qup-latn-pe', + quq: 'quq-latn-es', + qur: 'qur-latn-pe', + qus: 'qus-latn-ar', + quv: 'quv-latn-gt', + quw: 'quw-latn-ec', + qux: 'qux-latn-pe', + quy: 'quy-latn-pe', + qva: 'qva-latn-pe', + qvc: 'qvc-latn-pe', + qve: 'qve-latn-pe', + qvh: 'qvh-latn-pe', + qvi: 'qvi-latn-ec', + qvj: 'qvj-latn-ec', + qvl: 'qvl-latn-pe', + qvm: 'qvm-latn-pe', + qvn: 'qvn-latn-pe', + qvo: 'qvo-latn-pe', + qvp: 'qvp-latn-pe', + qvs: 'qvs-latn-pe', + qvw: 'qvw-latn-pe', + qvz: 'qvz-latn-ec', + qwa: 'qwa-latn-pe', + qwc: 'qwc-latn-pe', + qwh: 'qwh-latn-pe', + qwm: 'qwm-latn-ru', + 'qwm-cyrl': 'qwm-cyrl-ru', + 'qwm-runr': 'qwm-runr-ru', + qws: 'qws-latn-pe', + qwt: 'qwt-latn-us', + qxa: 'qxa-latn-pe', + qxc: 'qxc-latn-pe', + qxh: 'qxh-latn-pe', + qxl: 'qxl-latn-ec', + qxn: 'qxn-latn-pe', + qxo: 'qxo-latn-pe', + qxp: 'qxp-latn-pe', + qxq: 'qxq-arab-ir', + qxr: 'qxr-latn-ec', + qxt: 'qxt-latn-pe', + qxu: 'qxu-latn-pe', + qxw: 'qxw-latn-pe', + qya: 'qya-latn-001', + qyp: 'qyp-latn-us', + raa: 'raa-deva-np', + rab: 'rab-deva-np', + rac: 'rac-latn-id', + rad: 'rad-latn-vn', + raf: 'raf-deva-np', + rag: 'rag-latn-ke', + rah: 'rah-beng-in', + 'rah-latn': 'rah-latn-in', + rai: 'rai-latn-zz', + raj: 'raj-deva-in', + rak: 'rak-latn-pg', + ram: 'ram-latn-br', + ran: 'ran-latn-id', + rao: 'rao-latn-zz', + rap: 'rap-latn-cl', + rar: 'rar-latn-ck', + rav: 'rav-deva-np', + raw: 'raw-latn-mm', + rax: 'rax-latn-ng', + ray: 'ray-latn-pf', + raz: 'raz-latn-id', + rbb: 'rbb-mymr-mm', + rbk: 'rbk-latn-ph', + rbl: 'rbl-latn-ph', + rbp: 'rbp-latn-au', + rcf: 'rcf-latn-re', + rdb: 'rdb-arab-ir', + rea: 'rea-latn-pg', + reb: 'reb-latn-id', + ree: 'ree-latn-my', + reg: 'reg-latn-tz', + rei: 'rei-orya-in', + 'rei-telu': 'rei-telu-in', + rej: 'rej-latn-id', + rel: 'rel-latn-zz', + rem: 'rem-latn-pe', + ren: 'ren-latn-vn', + res: 'res-latn-zz', + ret: 'ret-latn-id', + rey: 'rey-latn-bo', + rga: 'rga-latn-vu', + rgn: 'rgn-latn-it', + rgr: 'rgr-latn-pe', + rgs: 'rgs-latn-vn', + rgu: 'rgu-latn-id', + rhg: 'rhg-rohg-mm', + rhp: 'rhp-latn-pg', + ria: 'ria-latn-in', + rif: 'rif-latn-ma', + ril: 'ril-latn-mm', + rim: 'rim-latn-tz', + rin: 'rin-latn-ng', + rir: 'rir-latn-id', + rit: 'rit-latn-au', + riu: 'riu-latn-id', + rjg: 'rjg-latn-id', + rji: 'rji-deva-np', + rjs: 'rjs-deva-np', + rka: 'rka-khmr-kh', + rkb: 'rkb-latn-br', + rkh: 'rkh-latn-ck', + rki: 'rki-mymr-mm', + rkm: 'rkm-latn-bf', + rkt: 'rkt-beng-bd', + rkw: 'rkw-latn-au', + rm: 'rm-latn-ch', + rma: 'rma-latn-ni', + rmb: 'rmb-latn-au', + rmc: 'rmc-latn-sk', + rmd: 'rmd-latn-dk', + rme: 'rme-latn-gb', + rmf: 'rmf-latn-fi', + rmg: 'rmg-latn-no', + rmh: 'rmh-latn-id', + rmi: 'rmi-armn-am', + rmk: 'rmk-latn-pg', + rml: 'rml-latn-pl', + 'rml-cyrl': 'rml-cyrl-by', + rmm: 'rmm-latn-id', + rmn: 'rmn-latn-rs', + 'rmn-cyrl': 'rmn-cyrl-bg', + 'rmn-grek': 'rmn-grek-gr', + rmo: 'rmo-latn-ch', + rmp: 'rmp-latn-pg', + rmq: 'rmq-latn-es', + rmt: 'rmt-arab-ir', + rmu: 'rmu-latn-se', + rmw: 'rmw-latn-gb', + rmx: 'rmx-latn-vn', + rmz: 'rmz-mymr-in', + rn: 'rn-latn-bi', + rna: 'rna-latn-zz', + rnd: 'rnd-latn-cd', + rng: 'rng-latn-mz', + rnl: 'rnl-latn-in', + rnn: 'rnn-latn-id', + rnr: 'rnr-latn-au', + rnw: 'rnw-latn-tz', + ro: 'ro-latn-ro', + rob: 'rob-latn-id', + roc: 'roc-latn-vn', + rod: 'rod-latn-ng', + roe: 'roe-latn-pg', + rof: 'rof-latn-tz', + rog: 'rog-latn-vn', + rol: 'rol-latn-ph', + rom: 'rom-latn-ro', + 'rom-cyrl': 'rom-cyrl-ro', + roo: 'roo-latn-zz', + rop: 'rop-latn-au', + ror: 'ror-latn-id', + rou: 'rou-latn-td', + row: 'row-latn-id', + rpn: 'rpn-latn-vu', + rpt: 'rpt-latn-pg', + rri: 'rri-latn-sb', + rro: 'rro-latn-zz', + rrt: 'rrt-latn-au', + rsk: 'rsk-cyrl-rs', + rtc: 'rtc-latn-mm', + rth: 'rth-latn-id', + rtm: 'rtm-latn-fj', + rtw: 'rtw-deva-in', + ru: 'ru-cyrl-ru', + rub: 'rub-latn-ug', + ruc: 'ruc-latn-ug', + rue: 'rue-cyrl-ua', + ruf: 'ruf-latn-tz', + rug: 'rug-latn-sb', + rui: 'rui-latn-tz', + ruk: 'ruk-latn-ng', + ruo: 'ruo-latn-hr', + rup: 'rup-latn-ro', + 'rup-grek': 'rup-grek-gr', + ruq: 'ruq-latn-gr', + rut: 'rut-cyrl-ru', + 'rut-latn': 'rut-latn-az', + ruu: 'ruu-latn-my', + ruy: 'ruy-latn-ng', + ruz: 'ruz-latn-ng', + rw: 'rw-latn-rw', + rwa: 'rwa-latn-pg', + rwk: 'rwk-latn-tz', + rwl: 'rwl-latn-tz', + rwm: 'rwm-latn-ug', + rwo: 'rwo-latn-zz', + rwr: 'rwr-deva-in', + rxd: 'rxd-latn-au', + rxw: 'rxw-latn-au', + ryu: 'ryu-kana-jp', + sa: 'sa-deva-in', + saa: 'saa-latn-td', + sab: 'sab-latn-pa', + sac: 'sac-latn-us', + sad: 'sad-latn-tz', + sae: 'sae-latn-br', + saf: 'saf-latn-gh', + sah: 'sah-cyrl-ru', + saj: 'saj-latn-id', + sak: 'sak-latn-ga', + sam: 'sam-samr-ps', + 'sam-hebr': 'sam-hebr-ps', + 'sam-syrc': 'sam-syrc-ps', + sao: 'sao-latn-id', + saq: 'saq-latn-ke', + sar: 'sar-latn-bo', + sas: 'sas-latn-id', + sat: 'sat-olck-in', + sau: 'sau-latn-id', + sav: 'sav-latn-sn', + saw: 'saw-latn-id', + sax: 'sax-latn-vu', + say: 'say-latn-ng', + saz: 'saz-saur-in', + sba: 'sba-latn-zz', + sbb: 'sbb-latn-sb', + sbc: 'sbc-latn-pg', + sbd: 'sbd-latn-bf', + sbe: 'sbe-latn-zz', + sbg: 'sbg-latn-id', + sbh: 'sbh-latn-pg', + sbi: 'sbi-latn-pg', + sbj: 'sbj-latn-td', + sbk: 'sbk-latn-tz', + sbl: 'sbl-latn-ph', + sbm: 'sbm-latn-tz', + sbn: 'sbn-arab-pk', + sbo: 'sbo-latn-my', + sbp: 'sbp-latn-tz', + sbq: 'sbq-latn-pg', + sbr: 'sbr-latn-id', + sbs: 'sbs-latn-na', + sbt: 'sbt-latn-id', + sbu: 'sbu-tibt-in', + 'sbu-deva': 'sbu-deva-in', + sbv: 'sbv-latn-it', + sbw: 'sbw-latn-ga', + sbx: 'sbx-latn-id', + sby: 'sby-latn-zm', + sbz: 'sbz-latn-cf', + sc: 'sc-latn-it', + scb: 'scb-latn-vn', + sce: 'sce-latn-cn', + 'sce-arab': 'sce-arab-cn', + scf: 'scf-latn-pa', + scg: 'scg-latn-id', + sch: 'sch-latn-in', + sci: 'sci-latn-lk', + sck: 'sck-deva-in', + scl: 'scl-arab-zz', + scn: 'scn-latn-it', + sco: 'sco-latn-gb', + scp: 'scp-deva-np', + scs: 'scs-latn-ca', + 'scs-cans': 'scs-cans-ca', + sct: 'sct-laoo-la', + scu: 'scu-takr-in', + scv: 'scv-latn-ng', + scw: 'scw-latn-ng', + scx: 'scx-grek-it', + sd: 'sd-arab-pk', + 'sd-deva': 'sd-deva-in', + 'sd-in': 'sd-deva-in', + 'sd-khoj': 'sd-khoj-in', + 'sd-sind': 'sd-sind-in', + sda: 'sda-latn-id', + sdb: 'sdb-arab-iq', + sdc: 'sdc-latn-it', + sde: 'sde-latn-ng', + sdf: 'sdf-arab-iq', + sdg: 'sdg-arab-af', + sdh: 'sdh-arab-ir', + sdj: 'sdj-latn-cg', + sdk: 'sdk-latn-pg', + sdn: 'sdn-latn-it', + sdo: 'sdo-latn-my', + sdq: 'sdq-latn-id', + sds: 'sds-arab-tn', + sdu: 'sdu-latn-id', + sdx: 'sdx-latn-my', + se: 'se-latn-no', + sea: 'sea-latn-my', + seb: 'seb-latn-ci', + sec: 'sec-latn-ca', + sed: 'sed-latn-vn', + see: 'see-latn-us', + sef: 'sef-latn-ci', + seg: 'seg-latn-tz', + seh: 'seh-latn-mz', + sei: 'sei-latn-mx', + sej: 'sej-latn-pg', + sek: 'sek-latn-ca', + 'sek-cans': 'sek-cans-ca', + sel: 'sel-cyrl-ru', + sen: 'sen-latn-bf', + seo: 'seo-latn-pg', + sep: 'sep-latn-bf', + seq: 'seq-latn-bf', + ser: 'ser-latn-us', + ses: 'ses-latn-ml', + set: 'set-latn-id', + seu: 'seu-latn-id', + sev: 'sev-latn-ci', + sew: 'sew-latn-pg', + sey: 'sey-latn-ec', + sez: 'sez-latn-mm', + sfe: 'sfe-latn-ph', + sfm: 'sfm-plrd-cn', + sfw: 'sfw-latn-gh', + sg: 'sg-latn-cf', + sga: 'sga-ogam-ie', + sgb: 'sgb-latn-ph', + sgc: 'sgc-latn-ke', + sgd: 'sgd-latn-ph', + sge: 'sge-latn-id', + sgh: 'sgh-cyrl-tj', + 'sgh-arab': 'sgh-arab-af', + 'sgh-latn': 'sgh-latn-tj', + sgi: 'sgi-latn-cm', + sgj: 'sgj-deva-in', + sgm: 'sgm-latn-ke', + sgp: 'sgp-latn-in', + sgr: 'sgr-arab-ir', + sgs: 'sgs-latn-lt', + sgt: 'sgt-tibt-bt', + sgu: 'sgu-latn-id', + sgw: 'sgw-ethi-zz', + sgy: 'sgy-arab-af', + sgz: 'sgz-latn-zz', + sha: 'sha-latn-ng', + shb: 'shb-latn-br', + shc: 'shc-latn-cd', + shd: 'shd-arab-pk', + she: 'she-latn-et', + shg: 'shg-latn-bw', + shh: 'shh-latn-us', + shi: 'shi-tfng-ma', + shj: 'shj-latn-sd', + shk: 'shk-latn-zz', + shm: 'shm-arab-ir', + shn: 'shn-mymr-mm', + sho: 'sho-latn-ng', + shp: 'shp-latn-pe', + shq: 'shq-latn-zm', + shr: 'shr-latn-cd', + shs: 'shs-latn-ca', + sht: 'sht-latn-us', + shu: 'shu-arab-zz', + shv: 'shv-arab-om', + shw: 'shw-latn-sd', + shy: 'shy-latn-dz', + 'shy-arab': 'shy-arab-dz', + 'shy-tfng': 'shy-tfng-dz', + shz: 'shz-latn-ml', + si: 'si-sinh-lk', + sia: 'sia-cyrl-ru', + sib: 'sib-latn-my', + sid: 'sid-latn-et', + sie: 'sie-latn-zm', + sif: 'sif-latn-bf', + sig: 'sig-latn-zz', + sih: 'sih-latn-nc', + sii: 'sii-latn-in', + sij: 'sij-latn-pg', + sik: 'sik-latn-br', + sil: 'sil-latn-zz', + sim: 'sim-latn-zz', + sip: 'sip-tibt-in', + siq: 'siq-latn-pg', + sir: 'sir-latn-ng', + sis: 'sis-latn-us', + siu: 'siu-latn-pg', + siv: 'siv-latn-pg', + siw: 'siw-latn-pg', + six: 'six-latn-pg', + siy: 'siy-arab-ir', + siz: 'siz-arab-eg', + sja: 'sja-latn-co', + sjb: 'sjb-latn-id', + sjd: 'sjd-cyrl-ru', + sje: 'sje-latn-se', + sjg: 'sjg-latn-td', + sjl: 'sjl-latn-in', + sjm: 'sjm-latn-ph', + sjp: 'sjp-deva-in', + 'sjp-beng': 'sjp-beng-in', + sjr: 'sjr-latn-zz', + sjt: 'sjt-cyrl-ru', + sju: 'sju-latn-se', + sjw: 'sjw-latn-us', + sk: 'sk-latn-sk', + ska: 'ska-latn-us', + skb: 'skb-thai-th', + skc: 'skc-latn-zz', + skd: 'skd-latn-us', + ske: 'ske-latn-vu', + skf: 'skf-latn-br', + skg: 'skg-latn-mg', + skh: 'skh-latn-id', + ski: 'ski-latn-id', + skj: 'skj-deva-np', + skm: 'skm-latn-pg', + skn: 'skn-latn-ph', + sko: 'sko-latn-id', + skp: 'skp-latn-my', + skq: 'skq-latn-bf', + skr: 'skr-arab-pk', + sks: 'sks-latn-zz', + skt: 'skt-latn-cd', + sku: 'sku-latn-vu', + skv: 'skv-latn-id', + skw: 'skw-latn-gy', + skx: 'skx-latn-id', + sky: 'sky-latn-sb', + skz: 'skz-latn-id', + sl: 'sl-latn-si', + slc: 'slc-latn-co', + sld: 'sld-latn-zz', + slg: 'slg-latn-id', + slh: 'slh-latn-us', + sli: 'sli-latn-pl', + slj: 'slj-latn-br', + sll: 'sll-latn-zz', + slm: 'slm-latn-ph', + sln: 'sln-latn-us', + slp: 'slp-latn-id', + slq: 'slq-arab-ir', + slr: 'slr-latn-cn', + slu: 'slu-latn-id', + slw: 'slw-latn-pg', + slx: 'slx-latn-cd', + sly: 'sly-latn-id', + slz: 'slz-latn-id', + sm: 'sm-latn-ws', + sma: 'sma-latn-se', + smb: 'smb-latn-pg', + smc: 'smc-latn-pg', + smd: 'smd-latn-ao', + smf: 'smf-latn-pg', + smg: 'smg-latn-pg', + smh: 'smh-yiii-cn', + smj: 'smj-latn-se', + smk: 'smk-latn-ph', + sml: 'sml-latn-ph', + smn: 'smn-latn-fi', + smp: 'smp-samr-il', + smq: 'smq-latn-zz', + smr: 'smr-latn-id', + sms: 'sms-latn-fi', + smt: 'smt-latn-in', + smu: 'smu-khmr-kh', + smw: 'smw-latn-id', + smx: 'smx-latn-cd', + smy: 'smy-arab-ir', + smz: 'smz-latn-pg', + sn: 'sn-latn-zw', + snb: 'snb-latn-my', + snc: 'snc-latn-zz', + sne: 'sne-latn-my', + snf: 'snf-latn-sn', + sng: 'sng-latn-cd', + 'sng-brai': 'sng-brai-cd', + sni: 'sni-latn-pe', + snj: 'snj-latn-cf', + snk: 'snk-latn-ml', + snl: 'snl-latn-ph', + snm: 'snm-latn-ug', + snn: 'snn-latn-co', + sno: 'sno-latn-us', + snp: 'snp-latn-zz', + snq: 'snq-latn-ga', + snr: 'snr-latn-pg', + sns: 'sns-latn-vu', + snu: 'snu-latn-id', + snv: 'snv-latn-my', + snw: 'snw-latn-gh', + snx: 'snx-latn-zz', + sny: 'sny-latn-zz', + snz: 'snz-latn-pg', + so: 'so-latn-so', + soa: 'soa-tavt-th', + 'soa-thai': 'soa-thai-th', + sob: 'sob-latn-id', + soc: 'soc-latn-cd', + sod: 'sod-latn-cd', + soe: 'soe-latn-cd', + sog: 'sog-sogd-uz', + soi: 'soi-deva-np', + sok: 'sok-latn-zz', + sol: 'sol-latn-pg', + soo: 'soo-latn-cd', + sop: 'sop-latn-cd', + soq: 'soq-latn-zz', + sor: 'sor-latn-td', + sos: 'sos-latn-bf', + sou: 'sou-thai-th', + sov: 'sov-latn-pw', + sow: 'sow-latn-pg', + sox: 'sox-latn-cm', + soy: 'soy-latn-zz', + soz: 'soz-latn-tz', + spb: 'spb-latn-id', + spc: 'spc-latn-ve', + spd: 'spd-latn-zz', + spe: 'spe-latn-pg', + spg: 'spg-latn-my', + spi: 'spi-latn-id', + spk: 'spk-latn-pg', + spl: 'spl-latn-zz', + spm: 'spm-latn-pg', + spn: 'spn-latn-py', + spo: 'spo-latn-us', + spp: 'spp-latn-ml', + spq: 'spq-latn-pe', + spr: 'spr-latn-id', + sps: 'sps-latn-zz', + spt: 'spt-tibt-in', + spv: 'spv-orya-in', + sq: 'sq-latn-al', + sqa: 'sqa-latn-ng', + sqh: 'sqh-latn-ng', + sqm: 'sqm-latn-cf', + sqo: 'sqo-arab-ir', + sqq: 'sqq-laoo-la', + sqt: 'sqt-arab-ye', + 'sqt-latn': 'sqt-latn-ye', + squ: 'squ-latn-ca', + sr: 'sr-cyrl-rs', + 'sr-me': 'sr-latn-me', + 'sr-ro': 'sr-latn-ro', + 'sr-ru': 'sr-latn-ru', + 'sr-tr': 'sr-latn-tr', + sra: 'sra-latn-pg', + srb: 'srb-sora-in', + sre: 'sre-latn-id', + srf: 'srf-latn-pg', + srg: 'srg-latn-ph', + srh: 'srh-arab-cn', + sri: 'sri-latn-co', + srk: 'srk-latn-my', + srl: 'srl-latn-id', + srm: 'srm-latn-sr', + srn: 'srn-latn-sr', + sro: 'sro-latn-it', + srq: 'srq-latn-bo', + srr: 'srr-latn-sn', + srs: 'srs-latn-ca', + srt: 'srt-latn-id', + sru: 'sru-latn-br', + srv: 'srv-latn-ph', + srw: 'srw-latn-id', + srx: 'srx-deva-in', + sry: 'sry-latn-pg', + srz: 'srz-arab-ir', + ss: 'ss-latn-za', + ssb: 'ssb-latn-ph', + ssc: 'ssc-latn-tz', + ssd: 'ssd-latn-zz', + sse: 'sse-latn-ph', + 'sse-arab': 'sse-arab-ph', + ssf: 'ssf-latn-tw', + ssg: 'ssg-latn-zz', + ssh: 'ssh-arab-ae', + ssj: 'ssj-latn-pg', + ssl: 'ssl-latn-gh', + ssm: 'ssm-latn-my', + ssn: 'ssn-latn-ke', + sso: 'sso-latn-pg', + ssq: 'ssq-latn-id', + sss: 'sss-laoo-la', + 'sss-thai': 'sss-thai-th', + sst: 'sst-latn-pg', + ssu: 'ssu-latn-pg', + ssv: 'ssv-latn-vu', + ssx: 'ssx-latn-pg', + ssy: 'ssy-latn-er', + ssz: 'ssz-latn-pg', + st: 'st-latn-za', + sta: 'sta-latn-zm', + stb: 'stb-latn-ph', + ste: 'ste-latn-id', + stf: 'stf-latn-pg', + stg: 'stg-latn-vn', + sth: 'sth-latn-ie', + sti: 'sti-latn-vn', + 'sti-kh': 'sti-latn-kh', + stj: 'stj-latn-bf', + stk: 'stk-latn-zz', + stl: 'stl-latn-nl', + stm: 'stm-latn-pg', + stn: 'stn-latn-sb', + sto: 'sto-latn-ca', + stp: 'stp-latn-mx', + stq: 'stq-latn-de', + str: 'str-latn-ca', + sts: 'sts-arab-af', + stt: 'stt-latn-vn', + stv: 'stv-ethi-et', + 'stv-arab': 'stv-arab-et', + stw: 'stw-latn-fm', + sty: 'sty-cyrl-ru', + su: 'su-latn-id', + sua: 'sua-latn-zz', + sub: 'sub-latn-cd', + suc: 'suc-latn-ph', + sue: 'sue-latn-zz', + sug: 'sug-latn-pg', + sui: 'sui-latn-pg', + suj: 'suj-latn-tz', + suk: 'suk-latn-tz', + suo: 'suo-latn-pg', + suq: 'suq-latn-et', + 'suq-ethi': 'suq-ethi-et', + sur: 'sur-latn-zz', + sus: 'sus-latn-gn', + sut: 'sut-latn-ni', + suv: 'suv-latn-in', + 'suv-beng': 'suv-beng-in', + 'suv-deva': 'suv-deva-in', + suw: 'suw-latn-tz', + suy: 'suy-latn-br', + suz: 'suz-deva-np', + sv: 'sv-latn-se', + sva: 'sva-geor-ge', + 'sva-cyrl': 'sva-cyrl-ge', + 'sva-latn': 'sva-latn-ge', + svb: 'svb-latn-pg', + svc: 'svc-latn-vc', + sve: 'sve-latn-id', + svm: 'svm-latn-it', + svs: 'svs-latn-sb', + sw: 'sw-latn-tz', + swb: 'swb-arab-yt', + swc: 'swc-latn-cd', + swf: 'swf-latn-cd', + swg: 'swg-latn-de', + swi: 'swi-hani-cn', + swj: 'swj-latn-ga', + swk: 'swk-latn-mw', + swm: 'swm-latn-pg', + swo: 'swo-latn-br', + swp: 'swp-latn-zz', + swq: 'swq-latn-cm', + swr: 'swr-latn-id', + sws: 'sws-latn-id', + swt: 'swt-latn-id', + swu: 'swu-latn-id', + swv: 'swv-deva-in', + sww: 'sww-latn-vu', + swx: 'swx-latn-br', + swy: 'swy-latn-td', + sxb: 'sxb-latn-ke', + sxe: 'sxe-latn-ga', + sxn: 'sxn-latn-id', + sxr: 'sxr-latn-tw', + sxs: 'sxs-latn-ng', + sxu: 'sxu-latn-de', + 'sxu-runr': 'sxu-runr-de', + sxw: 'sxw-latn-zz', + sya: 'sya-latn-id', + syb: 'syb-latn-ph', + syc: 'syc-syrc-tr', + syi: 'syi-latn-ga', + syk: 'syk-latn-ng', + syl: 'syl-beng-bd', + sym: 'sym-latn-bf', + syn: 'syn-syrc-ir', + syo: 'syo-latn-kh', + syr: 'syr-syrc-iq', + sys: 'sys-latn-td', + syw: 'syw-deva-np', + syx: 'syx-latn-ga', + sza: 'sza-latn-my', + szb: 'szb-latn-id', + szc: 'szc-latn-my', + szd: 'szd-latn-my', + szg: 'szg-latn-cd', + szl: 'szl-latn-pl', + szn: 'szn-latn-id', + szp: 'szp-latn-id', + szv: 'szv-latn-cm', + szw: 'szw-latn-id', + szy: 'szy-latn-tw', + ta: 'ta-taml-in', + taa: 'taa-latn-us', + tab: 'tab-cyrl-ru', + tac: 'tac-latn-mx', + tad: 'tad-latn-id', + tae: 'tae-latn-br', + taf: 'taf-latn-br', + tag: 'tag-latn-sd', + taj: 'taj-deva-np', + tak: 'tak-latn-ng', + tal: 'tal-latn-zz', + tan: 'tan-latn-zz', + tao: 'tao-latn-tw', + tap: 'tap-latn-cd', + taq: 'taq-latn-zz', + tar: 'tar-latn-mx', + tas: 'tas-latn-vn', + tau: 'tau-latn-us', + tav: 'tav-latn-co', + taw: 'taw-latn-pg', + tax: 'tax-latn-td', + tay: 'tay-latn-tw', + 'tay-hans': 'tay-hans-tw', + 'tay-hant': 'tay-hant-tw', + taz: 'taz-latn-sd', + tba: 'tba-latn-br', + tbc: 'tbc-latn-zz', + tbd: 'tbd-latn-zz', + tbe: 'tbe-latn-sb', + tbf: 'tbf-latn-zz', + tbg: 'tbg-latn-zz', + tbh: 'tbh-latn-au', + tbi: 'tbi-latn-sd', + tbj: 'tbj-latn-pg', + tbk: 'tbk-tagb-ph', + 'tbk-hano': 'tbk-hano-ph', + 'tbk-latn': 'tbk-latn-ph', + tbl: 'tbl-latn-ph', + tbm: 'tbm-latn-cd', + tbn: 'tbn-latn-co', + tbo: 'tbo-latn-zz', + tbp: 'tbp-latn-id', + tbs: 'tbs-latn-pg', + tbt: 'tbt-latn-cd', + tbu: 'tbu-latn-mx', + tbv: 'tbv-latn-pg', + tbw: 'tbw-latn-ph', + tbx: 'tbx-latn-pg', + tby: 'tby-latn-id', + tbz: 'tbz-latn-zz', + tca: 'tca-latn-br', + tcb: 'tcb-latn-us', + tcc: 'tcc-latn-tz', + tcd: 'tcd-latn-gh', + tce: 'tce-latn-ca', + tcf: 'tcf-latn-mx', + tcg: 'tcg-latn-id', + tch: 'tch-latn-tc', + tci: 'tci-latn-zz', + tck: 'tck-latn-ga', + tcm: 'tcm-latn-id', + tcn: 'tcn-tibt-np', + tco: 'tco-mymr-mm', + tcp: 'tcp-latn-mm', + tcq: 'tcq-latn-id', + tcs: 'tcs-latn-au', + tcu: 'tcu-latn-mx', + tcw: 'tcw-latn-mx', + tcx: 'tcx-taml-in', + tcy: 'tcy-knda-in', + tcz: 'tcz-latn-in', + tda: 'tda-tfng-ne', + 'tda-arab': 'tda-arab-ne', + 'tda-latn': 'tda-latn-ne', + tdb: 'tdb-deva-in', + 'tdb-beng': 'tdb-beng-in', + 'tdb-kthi': 'tdb-kthi-in', + tdc: 'tdc-latn-co', + tdd: 'tdd-tale-cn', + tde: 'tde-latn-ml', + tdg: 'tdg-deva-np', + tdh: 'tdh-deva-np', + tdi: 'tdi-latn-id', + tdj: 'tdj-latn-id', + tdk: 'tdk-latn-ng', + tdl: 'tdl-latn-ng', + tdm: 'tdm-latn-gy', + tdn: 'tdn-latn-id', + tdo: 'tdo-latn-ng', + tdq: 'tdq-latn-ng', + tdr: 'tdr-latn-vn', + tds: 'tds-latn-id', + tdt: 'tdt-latn-tl', + tdu: 'tdu-latn-my', + tdv: 'tdv-latn-ng', + tdx: 'tdx-latn-mg', + tdy: 'tdy-latn-ph', + te: 'te-telu-in', + tea: 'tea-latn-my', + teb: 'teb-latn-ec', + tec: 'tec-latn-ke', + ted: 'ted-latn-zz', + tee: 'tee-latn-mx', + teg: 'teg-latn-ga', + teh: 'teh-latn-ar', + tei: 'tei-latn-pg', + tek: 'tek-latn-cd', + tem: 'tem-latn-sl', + ten: 'ten-latn-co', + teo: 'teo-latn-ug', + tep: 'tep-latn-mx', + teq: 'teq-latn-sd', + ter: 'ter-latn-br', + tes: 'tes-java-id', + tet: 'tet-latn-tl', + teu: 'teu-latn-ug', + tev: 'tev-latn-id', + tew: 'tew-latn-us', + tex: 'tex-latn-ss', + tey: 'tey-latn-sd', + tfi: 'tfi-latn-zz', + tfn: 'tfn-latn-us', + tfo: 'tfo-latn-id', + tfr: 'tfr-latn-pa', + tft: 'tft-latn-id', + tg: 'tg-cyrl-tj', + 'tg-arab': 'tg-arab-pk', + 'tg-pk': 'tg-arab-pk', + tga: 'tga-latn-ke', + tgb: 'tgb-latn-my', + tgc: 'tgc-latn-zz', + tgd: 'tgd-latn-ng', + tge: 'tge-deva-np', + tgf: 'tgf-tibt-bt', + tgh: 'tgh-latn-tt', + tgi: 'tgi-latn-pg', + tgj: 'tgj-latn-in', + tgn: 'tgn-latn-ph', + tgo: 'tgo-latn-zz', + tgp: 'tgp-latn-vu', + tgq: 'tgq-latn-my', + tgs: 'tgs-latn-vu', + tgt: 'tgt-latn-ph', + 'tgt-hano': 'tgt-hano-ph', + 'tgt-tagb': 'tgt-tagb-ph', + tgu: 'tgu-latn-zz', + tgv: 'tgv-latn-br', + tgw: 'tgw-latn-ci', + tgx: 'tgx-latn-ca', + tgy: 'tgy-latn-ss', + tgz: 'tgz-latn-au', + th: 'th-thai-th', + thd: 'thd-latn-au', + the: 'the-deva-np', + thf: 'thf-deva-np', + thh: 'thh-latn-mx', + thi: 'thi-tale-la', + thk: 'thk-latn-ke', + thl: 'thl-deva-np', + thm: 'thm-thai-th', + thp: 'thp-latn-ca', + 'thp-dupl': 'thp-dupl-ca', + thq: 'thq-deva-np', + thr: 'thr-deva-np', + ths: 'ths-deva-np', + tht: 'tht-latn-ca', + thu: 'thu-latn-ss', + thv: 'thv-latn-dz', + 'thv-arab': 'thv-arab-dz', + 'thv-tfng': 'thv-tfng-dz', + thy: 'thy-latn-ng', + thz: 'thz-latn-ne', + 'thz-tfng': 'thz-tfng-ne', + ti: 'ti-ethi-et', + tic: 'tic-latn-sd', + tif: 'tif-latn-zz', + tig: 'tig-ethi-er', + tih: 'tih-latn-my', + tii: 'tii-latn-cd', + tij: 'tij-deva-np', + tik: 'tik-latn-zz', + til: 'til-latn-us', + tim: 'tim-latn-zz', + tin: 'tin-cyrl-ru', + tio: 'tio-latn-zz', + tip: 'tip-latn-id', + tiq: 'tiq-latn-bf', + tis: 'tis-latn-ph', + tit: 'tit-latn-co', + tiu: 'tiu-latn-ph', + tiv: 'tiv-latn-ng', + tiw: 'tiw-latn-au', + tix: 'tix-latn-us', + tiy: 'tiy-latn-ph', + tja: 'tja-latn-lr', + tjg: 'tjg-latn-id', + tji: 'tji-latn-cn', + tjj: 'tjj-latn-au', + tjl: 'tjl-mymr-mm', + tjn: 'tjn-latn-ci', + tjo: 'tjo-arab-dz', + tjp: 'tjp-latn-au', + tjs: 'tjs-latn-cn', + tju: 'tju-latn-au', + tjw: 'tjw-latn-au', + tk: 'tk-latn-tm', + tka: 'tka-latn-br', + tkb: 'tkb-deva-in', + tkd: 'tkd-latn-tl', + tke: 'tke-latn-mz', + tkf: 'tkf-latn-br', + tkg: 'tkg-latn-mg', + tkl: 'tkl-latn-tk', + tkp: 'tkp-latn-sb', + tkq: 'tkq-latn-ng', + tkr: 'tkr-latn-az', + tks: 'tks-arab-ir', + tkt: 'tkt-deva-np', + tku: 'tku-latn-mx', + tkv: 'tkv-latn-pg', + tkw: 'tkw-latn-sb', + tkx: 'tkx-latn-id', + tkz: 'tkz-latn-vn', + tl: 'tl-latn-ph', + tla: 'tla-latn-mx', + tlb: 'tlb-latn-id', + tlc: 'tlc-latn-mx', + tld: 'tld-latn-id', + tlf: 'tlf-latn-zz', + tlg: 'tlg-latn-id', + tli: 'tli-latn-us', + 'tli-cyrl': 'tli-cyrl-us', + tlj: 'tlj-latn-ug', + tlk: 'tlk-latn-id', + tll: 'tll-latn-cd', + tlm: 'tlm-latn-vu', + tln: 'tln-latn-id', + tlp: 'tlp-latn-mx', + tlq: 'tlq-latn-mm', + tlr: 'tlr-latn-sb', + tls: 'tls-latn-vu', + tlt: 'tlt-latn-id', + tlu: 'tlu-latn-id', + tlv: 'tlv-latn-id', + tlx: 'tlx-latn-zz', + tly: 'tly-latn-az', + tma: 'tma-latn-td', + tmb: 'tmb-latn-vu', + tmc: 'tmc-latn-td', + tmd: 'tmd-latn-pg', + tme: 'tme-latn-br', + tmf: 'tmf-latn-py', + tmg: 'tmg-latn-id', + tmh: 'tmh-latn-ne', + tmi: 'tmi-latn-vu', + tmj: 'tmj-latn-id', + tmk: 'tmk-deva-np', + tml: 'tml-latn-id', + tmm: 'tmm-latn-vn', + tmn: 'tmn-latn-id', + tmo: 'tmo-latn-my', + tmq: 'tmq-latn-pg', + tmr: 'tmr-syrc-il', + tmt: 'tmt-latn-vu', + tmu: 'tmu-latn-id', + tmv: 'tmv-latn-cd', + tmw: 'tmw-latn-my', + tmy: 'tmy-latn-zz', + tmz: 'tmz-latn-ve', + tn: 'tn-latn-za', + tna: 'tna-latn-bo', + tnb: 'tnb-latn-co', + tnc: 'tnc-latn-co', + tnd: 'tnd-latn-co', + tng: 'tng-latn-td', + tnh: 'tnh-latn-zz', + tni: 'tni-latn-id', + tnk: 'tnk-latn-vu', + tnl: 'tnl-latn-vu', + tnm: 'tnm-latn-id', + tnn: 'tnn-latn-vu', + tno: 'tno-latn-bo', + tnp: 'tnp-latn-vu', + tnq: 'tnq-latn-pr', + tnr: 'tnr-latn-sn', + tns: 'tns-latn-pg', + tnt: 'tnt-latn-id', + tnv: 'tnv-cakm-bd', + tnw: 'tnw-latn-id', + tnx: 'tnx-latn-sb', + tny: 'tny-latn-tz', + to: 'to-latn-to', + tob: 'tob-latn-ar', + toc: 'toc-latn-mx', + tod: 'tod-latn-gn', + tof: 'tof-latn-zz', + tog: 'tog-latn-mw', + toh: 'toh-latn-mz', + toi: 'toi-latn-zm', + toj: 'toj-latn-mx', + tok: 'tok-latn-001', + tol: 'tol-latn-us', + tom: 'tom-latn-id', + too: 'too-latn-mx', + top: 'top-latn-mx', + toq: 'toq-latn-zz', + tor: 'tor-latn-cd', + tos: 'tos-latn-mx', + tou: 'tou-latn-vn', + tov: 'tov-arab-ir', + tow: 'tow-latn-us', + tox: 'tox-latn-pw', + toy: 'toy-latn-id', + toz: 'toz-latn-cm', + tpa: 'tpa-latn-pg', + tpc: 'tpc-latn-mx', + tpe: 'tpe-latn-bd', + 'tpe-beng': 'tpe-beng-bd', + tpf: 'tpf-latn-id', + tpg: 'tpg-latn-id', + tpi: 'tpi-latn-pg', + tpj: 'tpj-latn-py', + tpk: 'tpk-latn-br', + tpl: 'tpl-latn-mx', + tpm: 'tpm-latn-zz', + tpn: 'tpn-latn-br', + tpp: 'tpp-latn-mx', + tpr: 'tpr-latn-br', + tpt: 'tpt-latn-mx', + tpu: 'tpu-khmr-kh', + tpv: 'tpv-latn-mp', + tpx: 'tpx-latn-mx', + tpy: 'tpy-latn-br', + tpz: 'tpz-latn-zz', + tqb: 'tqb-latn-br', + tql: 'tql-latn-vu', + tqm: 'tqm-latn-pg', + tqn: 'tqn-latn-us', + tqo: 'tqo-latn-zz', + tqp: 'tqp-latn-pg', + tqt: 'tqt-latn-mx', + tqu: 'tqu-latn-sb', + tqw: 'tqw-latn-us', + tr: 'tr-latn-tr', + tra: 'tra-arab-af', + trb: 'trb-latn-pg', + trc: 'trc-latn-mx', + tre: 'tre-latn-id', + trf: 'trf-latn-tt', + trg: 'trg-hebr-il', + trh: 'trh-latn-pg', + tri: 'tri-latn-sr', + trj: 'trj-latn-td', + trl: 'trl-latn-gb', + trm: 'trm-arab-af', + trn: 'trn-latn-bo', + tro: 'tro-latn-in', + trp: 'trp-latn-in', + 'trp-beng': 'trp-beng-in', + trq: 'trq-latn-mx', + trr: 'trr-latn-pe', + trs: 'trs-latn-mx', + trt: 'trt-latn-id', + tru: 'tru-latn-tr', + trv: 'trv-latn-tw', + trw: 'trw-arab-pk', + trx: 'trx-latn-my', + try: 'try-latn-in', + trz: 'trz-latn-br', + ts: 'ts-latn-za', + tsa: 'tsa-latn-cg', + tsb: 'tsb-latn-et', + tsc: 'tsc-latn-mz', + tsd: 'tsd-grek-gr', + tsf: 'tsf-deva-np', + tsg: 'tsg-latn-ph', + tsh: 'tsh-latn-cm', + tsi: 'tsi-latn-ca', + tsj: 'tsj-tibt-bt', + tsl: 'tsl-latn-vn', + tsp: 'tsp-latn-bf', + tsr: 'tsr-latn-vu', + tst: 'tst-latn-ml', + tsu: 'tsu-latn-tw', + tsv: 'tsv-latn-ga', + tsw: 'tsw-latn-zz', + tsx: 'tsx-latn-pg', + tsz: 'tsz-latn-mx', + tt: 'tt-cyrl-ru', + ttb: 'ttb-latn-ng', + ttc: 'ttc-latn-gt', + ttd: 'ttd-latn-zz', + tte: 'tte-latn-zz', + ttf: 'ttf-latn-cm', + tth: 'tth-laoo-la', + tti: 'tti-latn-id', + ttj: 'ttj-latn-ug', + ttk: 'ttk-latn-co', + ttl: 'ttl-latn-zm', + ttm: 'ttm-latn-ca', + ttn: 'ttn-latn-id', + tto: 'tto-laoo-la', + ttp: 'ttp-latn-id', + ttr: 'ttr-latn-zz', + tts: 'tts-thai-th', + ttt: 'ttt-latn-az', + ttu: 'ttu-latn-pg', + ttv: 'ttv-latn-pg', + ttw: 'ttw-latn-my', + tty: 'tty-latn-id', + tua: 'tua-latn-pg', + tub: 'tub-latn-us', + tuc: 'tuc-latn-pg', + tud: 'tud-latn-br', + tue: 'tue-latn-co', + tuf: 'tuf-latn-co', + tug: 'tug-latn-td', + tuh: 'tuh-latn-zz', + tui: 'tui-latn-cm', + tuj: 'tuj-latn-id', + tul: 'tul-latn-zz', + tum: 'tum-latn-mw', + tun: 'tun-latn-us', + tuo: 'tuo-latn-br', + tuq: 'tuq-latn-zz', + tus: 'tus-latn-ca', + tuu: 'tuu-latn-us', + tuv: 'tuv-latn-ke', + tux: 'tux-latn-br', + tuy: 'tuy-latn-ke', + tuz: 'tuz-latn-bf', + tva: 'tva-latn-sb', + tvd: 'tvd-latn-zz', + tve: 'tve-latn-id', + tvk: 'tvk-latn-vu', + tvl: 'tvl-latn-tv', + tvm: 'tvm-latn-id', + tvn: 'tvn-mymr-mm', + tvo: 'tvo-latn-id', + tvs: 'tvs-latn-ke', + tvt: 'tvt-latn-in', + tvu: 'tvu-latn-zz', + tvw: 'tvw-latn-id', + tvx: 'tvx-latn-tw', + twa: 'twa-latn-us', + twb: 'twb-latn-ph', + twd: 'twd-latn-nl', + twe: 'twe-latn-id', + twf: 'twf-latn-us', + twg: 'twg-latn-id', + twh: 'twh-latn-zz', + twl: 'twl-latn-mz', + twm: 'twm-deva-in', + twn: 'twn-latn-cm', + two: 'two-latn-bw', + twp: 'twp-latn-pg', + twq: 'twq-latn-ne', + twr: 'twr-latn-mx', + twt: 'twt-latn-br', + twu: 'twu-latn-id', + tww: 'tww-latn-pg', + twx: 'twx-latn-mz', + twy: 'twy-latn-id', + txa: 'txa-latn-my', + txe: 'txe-latn-id', + txg: 'txg-tang-cn', + txi: 'txi-latn-br', + txj: 'txj-latn-ng', + txm: 'txm-latn-id', + txn: 'txn-latn-id', + txo: 'txo-toto-in', + txq: 'txq-latn-id', + txs: 'txs-latn-id', + txt: 'txt-latn-id', + txu: 'txu-latn-br', + txx: 'txx-latn-my', + txy: 'txy-latn-mg', + ty: 'ty-latn-pf', + tya: 'tya-latn-zz', + tye: 'tye-latn-ng', + tyh: 'tyh-latn-vn', + tyi: 'tyi-latn-cg', + tyj: 'tyj-latn-vn', + tyl: 'tyl-latn-vn', + tyn: 'tyn-latn-id', + typ: 'typ-latn-au', + tyr: 'tyr-tavt-vn', + tys: 'tys-latn-vn', + tyt: 'tyt-latn-vn', + 'tyt-tavt': 'tyt-tavt-vn', + tyu: 'tyu-latn-bw', + tyv: 'tyv-cyrl-ru', + tyx: 'tyx-latn-cg', + tyy: 'tyy-latn-ng', + tyz: 'tyz-latn-vn', + tzh: 'tzh-latn-mx', + tzj: 'tzj-latn-gt', + tzl: 'tzl-latn-001', + tzm: 'tzm-latn-ma', + tzn: 'tzn-latn-id', + tzo: 'tzo-latn-mx', + tzx: 'tzx-latn-pg', + uam: 'uam-latn-br', + uar: 'uar-latn-pg', + uba: 'uba-latn-ng', + ubi: 'ubi-latn-td', + ubl: 'ubl-latn-ph', + ubr: 'ubr-latn-pg', + ubu: 'ubu-latn-zz', + uda: 'uda-latn-ng', + ude: 'ude-cyrl-ru', + udg: 'udg-mlym-in', + udi: 'udi-aghb-ru', + udj: 'udj-latn-id', + udl: 'udl-latn-cm', + udm: 'udm-cyrl-ru', + udu: 'udu-latn-sd', + ues: 'ues-latn-id', + ufi: 'ufi-latn-pg', + ug: 'ug-arab-cn', + 'ug-cyrl': 'ug-cyrl-kz', + 'ug-kz': 'ug-cyrl-kz', + 'ug-mn': 'ug-cyrl-mn', + uga: 'uga-ugar-sy', + ugb: 'ugb-latn-au', + uge: 'uge-latn-sb', + ugh: 'ugh-cyrl-ru', + ugo: 'ugo-thai-th', + uha: 'uha-latn-ng', + uhn: 'uhn-latn-id', + uis: 'uis-latn-pg', + uiv: 'uiv-latn-cm', + uji: 'uji-latn-ng', + uk: 'uk-cyrl-ua', + uka: 'uka-latn-id', + ukg: 'ukg-latn-pg', + ukh: 'ukh-latn-cf', + uki: 'uki-orya-in', + ukk: 'ukk-latn-mm', + ukp: 'ukp-latn-ng', + ukq: 'ukq-latn-ng', + uku: 'uku-latn-ng', + ukv: 'ukv-latn-ss', + ukw: 'ukw-latn-ng', + uky: 'uky-latn-au', + ula: 'ula-latn-ng', + ulb: 'ulb-latn-ng', + ulc: 'ulc-cyrl-ru', + ule: 'ule-latn-ar', + ulf: 'ulf-latn-id', + uli: 'uli-latn-fm', + ulk: 'ulk-latn-au', + ulm: 'ulm-latn-id', + uln: 'uln-latn-pg', + ulu: 'ulu-latn-id', + ulw: 'ulw-latn-ni', + uma: 'uma-latn-us', + umb: 'umb-latn-ao', + umd: 'umd-latn-au', + umg: 'umg-latn-au', + umi: 'umi-latn-my', + umm: 'umm-latn-ng', + umn: 'umn-latn-mm', + umo: 'umo-latn-br', + ump: 'ump-latn-au', + umr: 'umr-latn-au', + ums: 'ums-latn-id', + una: 'una-latn-pg', + und: 'en-latn-us', + 'und-002': 'en-latn-ng', + 'und-003': 'en-latn-us', + 'und-005': 'pt-latn-br', + 'und-009': 'en-latn-au', + 'und-011': 'en-latn-ng', + 'und-013': 'es-latn-mx', + 'und-014': 'sw-latn-tz', + 'und-015': 'ar-arab-eg', + 'und-017': 'sw-latn-cd', + 'und-018': 'en-latn-za', + 'und-019': 'en-latn-us', + 'und-021': 'en-latn-us', + 'und-029': 'es-latn-cu', + 'und-030': 'zh-hans-cn', + 'und-034': 'hi-deva-in', + 'und-035': 'id-latn-id', + 'und-039': 'it-latn-it', + 'und-053': 'en-latn-au', + 'und-054': 'en-latn-pg', + 'und-057': 'en-latn-gu', + 'und-061': 'sm-latn-ws', + 'und-142': 'zh-hans-cn', + 'und-143': 'uz-latn-uz', + 'und-145': 'ar-arab-sa', + 'und-150': 'ru-cyrl-ru', + 'und-151': 'ru-cyrl-ru', + 'und-154': 'en-latn-gb', + 'und-155': 'de-latn-de', + 'und-202': 'en-latn-ng', + 'und-419': 'es-latn-419', + 'und-ad': 'ca-latn-ad', + 'und-adlm': 'ff-adlm-gn', + 'und-ae': 'ar-arab-ae', + 'und-af': 'fa-arab-af', + 'und-aghb': 'udi-aghb-ru', + 'und-ahom': 'aho-ahom-in', + 'und-al': 'sq-latn-al', + 'und-am': 'hy-armn-am', + 'und-ao': 'pt-latn-ao', + 'und-aq': 'und-latn-aq', + 'und-ar': 'es-latn-ar', + 'und-arab': 'ar-arab-eg', + 'und-arab-cc': 'ms-arab-cc', + 'und-arab-cn': 'ug-arab-cn', + 'und-arab-gb': 'ur-arab-gb', + 'und-arab-id': 'ms-arab-id', + 'und-arab-in': 'ur-arab-in', + 'und-arab-kh': 'cja-arab-kh', + 'und-arab-mm': 'rhg-arab-mm', + 'und-arab-mn': 'kk-arab-mn', + 'und-arab-mu': 'ur-arab-mu', + 'und-arab-ng': 'ha-arab-ng', + 'und-arab-pk': 'ur-arab-pk', + 'und-arab-tg': 'apd-arab-tg', + 'und-arab-th': 'mfa-arab-th', + 'und-arab-tj': 'fa-arab-tj', + 'und-arab-tr': 'apc-arab-tr', + 'und-arab-yt': 'swb-arab-yt', + 'und-armi': 'arc-armi-ir', + 'und-armn': 'hy-armn-am', + 'und-as': 'sm-latn-as', + 'und-at': 'de-latn-at', + 'und-avst': 'ae-avst-ir', + 'und-aw': 'nl-latn-aw', + 'und-ax': 'sv-latn-ax', + 'und-az': 'az-latn-az', + 'und-ba': 'bs-latn-ba', + 'und-bali': 'ban-bali-id', + 'und-bamu': 'bax-bamu-cm', + 'und-bass': 'bsq-bass-lr', + 'und-batk': 'bbc-batk-id', + 'und-bd': 'bn-beng-bd', + 'und-be': 'nl-latn-be', + 'und-beng': 'bn-beng-bd', + 'und-bf': 'fr-latn-bf', + 'und-bg': 'bg-cyrl-bg', + 'und-bh': 'ar-arab-bh', + 'und-bhks': 'sa-bhks-in', + 'und-bi': 'rn-latn-bi', + 'und-bj': 'fr-latn-bj', + 'und-bl': 'fr-latn-bl', + 'und-bn': 'ms-latn-bn', + 'und-bo': 'es-latn-bo', + 'und-bopo': 'zh-bopo-tw', + 'und-bq': 'pap-latn-bq', + 'und-br': 'pt-latn-br', + 'und-brah': 'pka-brah-in', + 'und-brai': 'fr-brai-fr', + 'und-bt': 'dz-tibt-bt', + 'und-bugi': 'bug-bugi-id', + 'und-buhd': 'bku-buhd-ph', + 'und-bv': 'und-latn-bv', + 'und-by': 'be-cyrl-by', + 'und-cakm': 'ccp-cakm-bd', + 'und-cans': 'iu-cans-ca', + 'und-cari': 'xcr-cari-tr', + 'und-cd': 'sw-latn-cd', + 'und-cf': 'fr-latn-cf', + 'und-cg': 'fr-latn-cg', + 'und-ch': 'de-latn-ch', + 'und-cham': 'cjm-cham-vn', + 'und-cher': 'chr-cher-us', + 'und-chrs': 'xco-chrs-uz', + 'und-ci': 'fr-latn-ci', + 'und-cl': 'es-latn-cl', + 'und-cm': 'fr-latn-cm', + 'und-cn': 'zh-hans-cn', + 'und-co': 'es-latn-co', + 'und-copt': 'cop-copt-eg', + 'und-cp': 'und-latn-cp', + 'und-cpmn': 'und-cpmn-cy', + 'und-cpmn-cy': 'und-cpmn-cy', + 'und-cprt': 'grc-cprt-cy', + 'und-cr': 'es-latn-cr', + 'und-cu': 'es-latn-cu', + 'und-cv': 'pt-latn-cv', + 'und-cw': 'pap-latn-cw', + 'und-cy': 'el-grek-cy', + 'und-cyrl': 'ru-cyrl-ru', + 'und-cyrl-al': 'mk-cyrl-al', + 'und-cyrl-ba': 'sr-cyrl-ba', + 'und-cyrl-ge': 'ab-cyrl-ge', + 'und-cyrl-gr': 'mk-cyrl-gr', + 'und-cyrl-md': 'uk-cyrl-md', + 'und-cyrl-ro': 'bg-cyrl-ro', + 'und-cyrl-sk': 'uk-cyrl-sk', + 'und-cyrl-tr': 'kbd-cyrl-tr', + 'und-cyrl-xk': 'sr-cyrl-xk', + 'und-cz': 'cs-latn-cz', + 'und-de': 'de-latn-de', + 'und-deva': 'hi-deva-in', + 'und-deva-bt': 'ne-deva-bt', + 'und-deva-fj': 'hif-deva-fj', + 'und-deva-mu': 'bho-deva-mu', + 'und-deva-pk': 'btv-deva-pk', + 'und-diak': 'dv-diak-mv', + 'und-dj': 'aa-latn-dj', + 'und-dk': 'da-latn-dk', + 'und-do': 'es-latn-do', + 'und-dogr': 'doi-dogr-in', + 'und-dupl': 'fr-dupl-fr', + 'und-dz': 'ar-arab-dz', + 'und-ea': 'es-latn-ea', + 'und-ec': 'es-latn-ec', + 'und-ee': 'et-latn-ee', + 'und-eg': 'ar-arab-eg', + 'und-egyp': 'egy-egyp-eg', + 'und-eh': 'ar-arab-eh', + 'und-elba': 'sq-elba-al', + 'und-elym': 'arc-elym-ir', + 'und-er': 'ti-ethi-er', + 'und-es': 'es-latn-es', + 'und-et': 'am-ethi-et', + 'und-ethi': 'am-ethi-et', + 'und-eu': 'en-latn-ie', + 'und-ez': 'de-latn-ez', + 'und-fi': 'fi-latn-fi', + 'und-fo': 'fo-latn-fo', + 'und-fr': 'fr-latn-fr', + 'und-ga': 'fr-latn-ga', + 'und-ge': 'ka-geor-ge', + 'und-geor': 'ka-geor-ge', + 'und-gf': 'fr-latn-gf', + 'und-gh': 'ak-latn-gh', + 'und-gl': 'kl-latn-gl', + 'und-glag': 'cu-glag-bg', + 'und-gn': 'fr-latn-gn', + 'und-gong': 'wsg-gong-in', + 'und-gonm': 'esg-gonm-in', + 'und-goth': 'got-goth-ua', + 'und-gp': 'fr-latn-gp', + 'und-gq': 'es-latn-gq', + 'und-gr': 'el-grek-gr', + 'und-gran': 'sa-gran-in', + 'und-grek': 'el-grek-gr', + 'und-grek-tr': 'bgx-grek-tr', + 'und-gs': 'und-latn-gs', + 'und-gt': 'es-latn-gt', + 'und-gujr': 'gu-gujr-in', + 'und-guru': 'pa-guru-in', + 'und-gw': 'pt-latn-gw', + 'und-hanb': 'zh-hanb-tw', + 'und-hang': 'ko-hang-kr', + 'und-hani': 'zh-hani-cn', + 'und-hano': 'hnn-hano-ph', + 'und-hans': 'zh-hans-cn', + 'und-hant': 'zh-hant-tw', + 'und-hant-ca': 'yue-hant-ca', + 'und-hebr': 'he-hebr-il', + 'und-hebr-se': 'yi-hebr-se', + 'und-hebr-ua': 'yi-hebr-ua', + 'und-hebr-us': 'yi-hebr-us', + 'und-hira': 'ja-hira-jp', + 'und-hk': 'zh-hant-hk', + 'und-hluw': 'hlu-hluw-tr', + 'und-hm': 'und-latn-hm', + 'und-hmng': 'hnj-hmng-la', + 'und-hmnp': 'hnj-hmnp-us', + 'und-hn': 'es-latn-hn', + 'und-hr': 'hr-latn-hr', + 'und-ht': 'ht-latn-ht', + 'und-hu': 'hu-latn-hu', + 'und-hung': 'hu-hung-hu', + 'und-ic': 'es-latn-ic', + 'und-id': 'id-latn-id', + 'und-il': 'he-hebr-il', + 'und-in': 'hi-deva-in', + 'und-iq': 'ar-arab-iq', + 'und-ir': 'fa-arab-ir', + 'und-is': 'is-latn-is', + 'und-it': 'it-latn-it', + 'und-ital': 'ett-ital-it', + 'und-jamo': 'ko-jamo-kr', + 'und-java': 'jv-java-id', + 'und-jo': 'ar-arab-jo', + 'und-jp': 'ja-jpan-jp', + 'und-jpan': 'ja-jpan-jp', + 'und-kali': 'eky-kali-mm', + 'und-kana': 'ja-kana-jp', + 'und-kawi': 'kaw-kawi-id', + 'und-ke': 'sw-latn-ke', + 'und-kg': 'ky-cyrl-kg', + 'und-kh': 'km-khmr-kh', + 'und-khar': 'pra-khar-pk', + 'und-khmr': 'km-khmr-kh', + 'und-khoj': 'sd-khoj-in', + 'und-kits': 'zkt-kits-cn', + 'und-km': 'ar-arab-km', + 'und-knda': 'kn-knda-in', + 'und-kore': 'ko-kore-kr', + 'und-kp': 'ko-kore-kp', + 'und-kr': 'ko-kore-kr', + 'und-kthi': 'bho-kthi-in', + 'und-kw': 'ar-arab-kw', + 'und-kz': 'ru-cyrl-kz', + 'und-la': 'lo-laoo-la', + 'und-lana': 'nod-lana-th', + 'und-laoo': 'lo-laoo-la', + 'und-laoo-au': 'hnj-laoo-au', + 'und-laoo-cn': 'hnj-laoo-cn', + 'und-laoo-fr': 'hnj-laoo-fr', + 'und-laoo-gf': 'hnj-laoo-gf', + 'und-laoo-mm': 'hnj-laoo-mm', + 'und-laoo-sr': 'hnj-laoo-sr', + 'und-laoo-th': 'hnj-laoo-th', + 'und-laoo-us': 'hnj-laoo-us', + 'und-laoo-vn': 'hnj-laoo-vn', + 'und-latn-af': 'tk-latn-af', + 'und-latn-am': 'ku-latn-am', + 'und-latn-cn': 'za-latn-cn', + 'und-latn-cy': 'tr-latn-cy', + 'und-latn-dz': 'fr-latn-dz', + 'und-latn-et': 'en-latn-et', + 'und-latn-ge': 'ku-latn-ge', + 'und-latn-ir': 'tk-latn-ir', + 'und-latn-km': 'fr-latn-km', + 'und-latn-ma': 'fr-latn-ma', + 'und-latn-mk': 'sq-latn-mk', + 'und-latn-mm': 'kac-latn-mm', + 'und-latn-mo': 'pt-latn-mo', + 'und-latn-mr': 'fr-latn-mr', + 'und-latn-ru': 'krl-latn-ru', + 'und-latn-sy': 'fr-latn-sy', + 'und-latn-tn': 'fr-latn-tn', + 'und-latn-tw': 'trv-latn-tw', + 'und-latn-ua': 'pl-latn-ua', + 'und-lb': 'ar-arab-lb', + 'und-lepc': 'lep-lepc-in', + 'und-li': 'de-latn-li', + 'und-limb': 'lif-limb-in', + 'und-lina': 'lab-lina-gr', + 'und-linb': 'grc-linb-gr', + 'und-lisu': 'lis-lisu-cn', + 'und-lk': 'si-sinh-lk', + 'und-ls': 'st-latn-ls', + 'und-lt': 'lt-latn-lt', + 'und-lu': 'fr-latn-lu', + 'und-lv': 'lv-latn-lv', + 'und-ly': 'ar-arab-ly', + 'und-lyci': 'xlc-lyci-tr', + 'und-lydi': 'xld-lydi-tr', + 'und-ma': 'ar-arab-ma', + 'und-mahj': 'hi-mahj-in', + 'und-maka': 'mak-maka-id', + 'und-mand': 'myz-mand-ir', + 'und-mani': 'xmn-mani-cn', + 'und-marc': 'bo-marc-cn', + 'und-mc': 'fr-latn-mc', + 'und-md': 'ro-latn-md', + 'und-me': 'sr-latn-me', + 'und-medf': 'dmf-medf-ng', + 'und-mend': 'men-mend-sl', + 'und-merc': 'xmr-merc-sd', + 'und-mero': 'xmr-mero-sd', + 'und-mf': 'fr-latn-mf', + 'und-mg': 'mg-latn-mg', + 'und-mk': 'mk-cyrl-mk', + 'und-ml': 'bm-latn-ml', + 'und-mlym': 'ml-mlym-in', + 'und-mm': 'my-mymr-mm', + 'und-mn': 'mn-cyrl-mn', + 'und-mo': 'zh-hant-mo', + 'und-modi': 'mr-modi-in', + 'und-mong': 'mn-mong-cn', + 'und-mq': 'fr-latn-mq', + 'und-mr': 'ar-arab-mr', + 'und-mroo': 'mro-mroo-bd', + 'und-mt': 'mt-latn-mt', + 'und-mtei': 'mni-mtei-in', + 'und-mu': 'mfe-latn-mu', + 'und-mult': 'skr-mult-pk', + 'und-mv': 'dv-thaa-mv', + 'und-mx': 'es-latn-mx', + 'und-my': 'ms-latn-my', + 'und-mymr': 'my-mymr-mm', + 'und-mymr-in': 'kht-mymr-in', + 'und-mymr-th': 'mnw-mymr-th', + 'und-mz': 'pt-latn-mz', + 'und-na': 'af-latn-na', + 'und-nagm': 'unr-nagm-in', + 'und-nand': 'sa-nand-in', + 'und-narb': 'xna-narb-sa', + 'und-nbat': 'arc-nbat-jo', + 'und-nc': 'fr-latn-nc', + 'und-ne': 'ha-latn-ne', + 'und-newa': 'new-newa-np', + 'und-ni': 'es-latn-ni', + 'und-nkoo': 'man-nkoo-gn', + 'und-nl': 'nl-latn-nl', + 'und-no': 'nb-latn-no', + 'und-np': 'ne-deva-np', + 'und-nshu': 'zhx-nshu-cn', + 'und-ogam': 'sga-ogam-ie', + 'und-olck': 'sat-olck-in', + 'und-om': 'ar-arab-om', + 'und-orkh': 'otk-orkh-mn', + 'und-orya': 'or-orya-in', + 'und-osge': 'osa-osge-us', + 'und-osma': 'so-osma-so', + 'und-ougr': 'oui-ougr-143', + 'und-pa': 'es-latn-pa', + 'und-palm': 'arc-palm-sy', + 'und-pauc': 'ctd-pauc-mm', + 'und-pe': 'es-latn-pe', + 'und-perm': 'kv-perm-ru', + 'und-pf': 'fr-latn-pf', + 'und-pg': 'tpi-latn-pg', + 'und-ph': 'fil-latn-ph', + 'und-phag': 'lzh-phag-cn', + 'und-phli': 'pal-phli-ir', + 'und-phlp': 'pal-phlp-cn', + 'und-phnx': 'phn-phnx-lb', + 'und-pk': 'ur-arab-pk', + 'und-pl': 'pl-latn-pl', + 'und-plrd': 'hmd-plrd-cn', + 'und-pm': 'fr-latn-pm', + 'und-pr': 'es-latn-pr', + 'und-prti': 'xpr-prti-ir', + 'und-ps': 'ar-arab-ps', + 'und-pt': 'pt-latn-pt', + 'und-pw': 'pau-latn-pw', + 'und-py': 'gn-latn-py', + 'und-qa': 'ar-arab-qa', + 'und-qo': 'en-latn-dg', + 'und-re': 'fr-latn-re', + 'und-rjng': 'rej-rjng-id', + 'und-ro': 'ro-latn-ro', + 'und-rohg': 'rhg-rohg-mm', + 'und-rs': 'sr-cyrl-rs', + 'und-ru': 'ru-cyrl-ru', + 'und-runr': 'non-runr-se', + 'und-rw': 'rw-latn-rw', + 'und-sa': 'ar-arab-sa', + 'und-samr': 'smp-samr-il', + 'und-sarb': 'xsa-sarb-ye', + 'und-saur': 'saz-saur-in', + 'und-sc': 'fr-latn-sc', + 'und-sd': 'ar-arab-sd', + 'und-se': 'sv-latn-se', + 'und-sgnw': 'ase-sgnw-us', + 'und-shaw': 'en-shaw-gb', + 'und-shrd': 'sa-shrd-in', + 'und-si': 'sl-latn-si', + 'und-sidd': 'sa-sidd-in', + 'und-sind': 'sd-sind-in', + 'und-sinh': 'si-sinh-lk', + 'und-sj': 'nb-latn-sj', + 'und-sk': 'sk-latn-sk', + 'und-sm': 'it-latn-sm', + 'und-sn': 'fr-latn-sn', + 'und-so': 'so-latn-so', + 'und-sogd': 'sog-sogd-uz', + 'und-sogo': 'sog-sogo-uz', + 'und-sora': 'srb-sora-in', + 'und-soyo': 'cmg-soyo-mn', + 'und-sr': 'nl-latn-sr', + 'und-st': 'pt-latn-st', + 'und-sund': 'su-sund-id', + 'und-sv': 'es-latn-sv', + 'und-sy': 'ar-arab-sy', + 'und-sylo': 'syl-sylo-bd', + 'und-syrc': 'syr-syrc-iq', + 'und-tagb': 'tbw-tagb-ph', + 'und-takr': 'doi-takr-in', + 'und-tale': 'tdd-tale-cn', + 'und-talu': 'khb-talu-cn', + 'und-taml': 'ta-taml-in', + 'und-tang': 'txg-tang-cn', + 'und-tavt': 'blt-tavt-vn', + 'und-td': 'fr-latn-td', + 'und-telu': 'te-telu-in', + 'und-tf': 'fr-latn-tf', + 'und-tfng': 'zgh-tfng-ma', + 'und-tg': 'fr-latn-tg', + 'und-tglg': 'fil-tglg-ph', + 'und-th': 'th-thai-th', + 'und-thaa': 'dv-thaa-mv', + 'und-thai': 'th-thai-th', + 'und-thai-cn': 'lcp-thai-cn', + 'und-thai-kh': 'kdt-thai-kh', + 'und-thai-la': 'kdt-thai-la', + 'und-tibt': 'bo-tibt-cn', + 'und-tirh': 'mai-tirh-in', + 'und-tj': 'tg-cyrl-tj', + 'und-tk': 'tkl-latn-tk', + 'und-tl': 'pt-latn-tl', + 'und-tm': 'tk-latn-tm', + 'und-tn': 'ar-arab-tn', + 'und-tnsa': 'nst-tnsa-in', + 'und-to': 'to-latn-to', + 'und-toto': 'txo-toto-in', + 'und-tr': 'tr-latn-tr', + 'und-tv': 'tvl-latn-tv', + 'und-tw': 'zh-hant-tw', + 'und-tz': 'sw-latn-tz', + 'und-ua': 'uk-cyrl-ua', + 'und-ug': 'sw-latn-ug', + 'und-ugar': 'uga-ugar-sy', + 'und-uy': 'es-latn-uy', + 'und-uz': 'uz-latn-uz', + 'und-va': 'it-latn-va', + 'und-vaii': 'vai-vaii-lr', + 'und-ve': 'es-latn-ve', + 'und-vith': 'sq-vith-al', + 'und-vn': 'vi-latn-vn', + 'und-vu': 'bi-latn-vu', + 'und-wara': 'hoc-wara-in', + 'und-wcho': 'nnp-wcho-in', + 'und-wf': 'fr-latn-wf', + 'und-ws': 'sm-latn-ws', + 'und-xk': 'sq-latn-xk', + 'und-xpeo': 'peo-xpeo-ir', + 'und-xsux': 'akk-xsux-iq', + 'und-ye': 'ar-arab-ye', + 'und-yezi': 'ku-yezi-ge', + 'und-yiii': 'ii-yiii-cn', + 'und-yt': 'fr-latn-yt', + 'und-zanb': 'cmg-zanb-mn', + 'und-zw': 'sn-latn-zw', + une: 'une-latn-ng', + ung: 'ung-latn-au', + uni: 'uni-latn-pg', + unk: 'unk-latn-br', + unm: 'unm-latn-us', + unn: 'unn-latn-au', + unr: 'unr-beng-in', + 'unr-deva': 'unr-deva-np', + 'unr-np': 'unr-deva-np', + unu: 'unu-latn-pg', + unx: 'unx-beng-in', + unz: 'unz-latn-id', + uok: 'uok-latn-zz', + uon: 'uon-latn-tw', + upi: 'upi-latn-pg', + upv: 'upv-latn-vu', + ur: 'ur-arab-pk', + ura: 'ura-latn-pe', + urb: 'urb-latn-br', + urc: 'urc-latn-au', + ure: 'ure-latn-bo', + urf: 'urf-latn-au', + urg: 'urg-latn-pg', + urh: 'urh-latn-ng', + uri: 'uri-latn-zz', + urk: 'urk-thai-th', + urm: 'urm-latn-pg', + urn: 'urn-latn-id', + uro: 'uro-latn-pg', + urp: 'urp-latn-br', + urr: 'urr-latn-vu', + urt: 'urt-latn-zz', + uru: 'uru-latn-br', + urv: 'urv-latn-pg', + urw: 'urw-latn-zz', + urx: 'urx-latn-pg', + ury: 'ury-latn-id', + urz: 'urz-latn-br', + usa: 'usa-latn-zz', + ush: 'ush-arab-pk', + usi: 'usi-latn-bd', + 'usi-beng': 'usi-beng-bd', + usk: 'usk-latn-cm', + usp: 'usp-latn-gt', + uss: 'uss-latn-ng', + usu: 'usu-latn-pg', + uta: 'uta-latn-ng', + ute: 'ute-latn-us', + uth: 'uth-latn-zz', + utp: 'utp-latn-sb', + utr: 'utr-latn-zz', + utu: 'utu-latn-pg', + uum: 'uum-grek-ge', + 'uum-cyrl': 'uum-cyrl-ge', + uur: 'uur-latn-vu', + uve: 'uve-latn-nc', + uvh: 'uvh-latn-zz', + uvl: 'uvl-latn-zz', + uwa: 'uwa-latn-au', + uya: 'uya-latn-ng', + uz: 'uz-latn-uz', + 'uz-af': 'uz-arab-af', + 'uz-arab': 'uz-arab-af', + 'uz-cn': 'uz-cyrl-cn', + uzs: 'uzs-arab-af', + vaa: 'vaa-taml-in', + vae: 'vae-latn-cf', + vaf: 'vaf-arab-ir', + vag: 'vag-latn-zz', + vah: 'vah-deva-in', + vai: 'vai-vaii-lr', + vaj: 'vaj-latn-na', + val: 'val-latn-pg', + vam: 'vam-latn-pg', + van: 'van-latn-zz', + vao: 'vao-latn-vu', + vap: 'vap-latn-in', + var: 'var-latn-mx', + vas: 'vas-deva-in', + 'vas-gujr': 'vas-gujr-in', + vau: 'vau-latn-cd', + vav: 'vav-deva-in', + 'vav-gujr': 'vav-gujr-in', + vay: 'vay-deva-np', + vbb: 'vbb-latn-id', + vbk: 'vbk-latn-ph', + ve: 've-latn-za', + vec: 'vec-latn-it', + vem: 'vem-latn-ng', + veo: 'veo-latn-us', + vep: 'vep-latn-ru', + ver: 'ver-latn-ng', + vgr: 'vgr-arab-pk', + vi: 'vi-latn-vn', + vic: 'vic-latn-sx', + vid: 'vid-latn-tz', + vif: 'vif-latn-cg', + vig: 'vig-latn-bf', + vil: 'vil-latn-ar', + vin: 'vin-latn-tz', + vit: 'vit-latn-ng', + viv: 'viv-latn-zz', + vka: 'vka-latn-au', + vkj: 'vkj-latn-td', + vkk: 'vkk-latn-id', + vkl: 'vkl-latn-id', + vkm: 'vkm-latn-br', + vkn: 'vkn-latn-ng', + vko: 'vko-latn-id', + vkp: 'vkp-latn-in', + 'vkp-deva': 'vkp-deva-in', + vkt: 'vkt-latn-id', + vku: 'vku-latn-au', + vkz: 'vkz-latn-ng', + vlp: 'vlp-latn-vu', + vls: 'vls-latn-be', + vma: 'vma-latn-au', + vmb: 'vmb-latn-au', + vmc: 'vmc-latn-mx', + vmd: 'vmd-knda-in', + vme: 'vme-latn-id', + vmf: 'vmf-latn-de', + vmg: 'vmg-latn-pg', + vmh: 'vmh-arab-ir', + vmi: 'vmi-latn-au', + vmj: 'vmj-latn-mx', + vmk: 'vmk-latn-mz', + vml: 'vml-latn-au', + vmm: 'vmm-latn-mx', + vmp: 'vmp-latn-mx', + vmq: 'vmq-latn-mx', + vmr: 'vmr-latn-mz', + vms: 'vms-latn-id', + vmu: 'vmu-latn-au', + vmw: 'vmw-latn-mz', + vmx: 'vmx-latn-mx', + vmy: 'vmy-latn-mx', + vmz: 'vmz-latn-mx', + vnk: 'vnk-latn-sb', + vnm: 'vnm-latn-vu', + vnp: 'vnp-latn-vu', + vo: 'vo-latn-001', + vor: 'vor-latn-ng', + vot: 'vot-latn-ru', + vra: 'vra-latn-vu', + vro: 'vro-latn-ee', + vrs: 'vrs-latn-sb', + vrt: 'vrt-latn-vu', + vto: 'vto-latn-id', + vum: 'vum-latn-ga', + vun: 'vun-latn-tz', + vut: 'vut-latn-zz', + vwa: 'vwa-latn-cn', + 'vwa-mymr': 'vwa-mymr-cn', + wa: 'wa-latn-be', + waa: 'waa-latn-us', + wab: 'wab-latn-pg', + wac: 'wac-latn-us', + wad: 'wad-latn-id', + wae: 'wae-latn-ch', + waf: 'waf-latn-br', + wag: 'wag-latn-pg', + wah: 'wah-latn-id', + wai: 'wai-latn-id', + waj: 'waj-latn-zz', + wal: 'wal-ethi-et', + wam: 'wam-latn-us', + wan: 'wan-latn-zz', + wap: 'wap-latn-gy', + waq: 'waq-latn-au', + war: 'war-latn-ph', + was: 'was-latn-us', + wat: 'wat-latn-pg', + wau: 'wau-latn-br', + wav: 'wav-latn-ng', + waw: 'waw-latn-br', + wax: 'wax-latn-pg', + way: 'way-latn-sr', + waz: 'waz-latn-pg', + wba: 'wba-latn-ve', + wbb: 'wbb-latn-id', + wbe: 'wbe-latn-id', + wbf: 'wbf-latn-bf', + wbh: 'wbh-latn-tz', + wbi: 'wbi-latn-tz', + wbj: 'wbj-latn-tz', + wbk: 'wbk-arab-af', + wbl: 'wbl-latn-pk', + 'wbl-arab': 'wbl-arab-af', + 'wbl-cyrl': 'wbl-cyrl-tj', + wbm: 'wbm-latn-cn', + wbp: 'wbp-latn-au', + wbq: 'wbq-telu-in', + wbr: 'wbr-deva-in', + wbt: 'wbt-latn-au', + wbv: 'wbv-latn-au', + wbw: 'wbw-latn-id', + wca: 'wca-latn-br', + wci: 'wci-latn-zz', + wdd: 'wdd-latn-ga', + wdg: 'wdg-latn-pg', + wdj: 'wdj-latn-au', + wdk: 'wdk-latn-au', + wdt: 'wdt-latn-ca', + wdu: 'wdu-latn-au', + wdy: 'wdy-latn-au', + wec: 'wec-latn-ci', + wed: 'wed-latn-pg', + weg: 'weg-latn-au', + weh: 'weh-latn-cm', + wei: 'wei-latn-pg', + wem: 'wem-latn-bj', + weo: 'weo-latn-id', + wep: 'wep-latn-de', + wer: 'wer-latn-zz', + wes: 'wes-latn-cm', + wet: 'wet-latn-id', + weu: 'weu-latn-mm', + wew: 'wew-latn-id', + wfg: 'wfg-latn-id', + wga: 'wga-latn-au', + wgb: 'wgb-latn-pg', + wgg: 'wgg-latn-au', + wgi: 'wgi-latn-zz', + wgo: 'wgo-latn-id', + wgu: 'wgu-latn-au', + wgy: 'wgy-latn-au', + wha: 'wha-latn-id', + whg: 'whg-latn-zz', + whk: 'whk-latn-id', + whu: 'whu-latn-id', + wib: 'wib-latn-zz', + wic: 'wic-latn-us', + wie: 'wie-latn-au', + wif: 'wif-latn-au', + wig: 'wig-latn-au', + wih: 'wih-latn-au', + wii: 'wii-latn-pg', + wij: 'wij-latn-au', + wik: 'wik-latn-au', + wil: 'wil-latn-au', + wim: 'wim-latn-au', + win: 'win-latn-us', + wir: 'wir-latn-br', + wiu: 'wiu-latn-zz', + wiv: 'wiv-latn-zz', + wiy: 'wiy-latn-us', + wja: 'wja-latn-zz', + wji: 'wji-latn-zz', + wka: 'wka-latn-tz', + wkd: 'wkd-latn-id', + wkr: 'wkr-latn-au', + wkw: 'wkw-latn-au', + wky: 'wky-latn-au', + wla: 'wla-latn-pg', + wlg: 'wlg-latn-au', + wlh: 'wlh-latn-tl', + wli: 'wli-latn-id', + wlm: 'wlm-latn-gb', + wlo: 'wlo-arab-id', + wlr: 'wlr-latn-vu', + wls: 'wls-latn-wf', + wlu: 'wlu-latn-au', + wlv: 'wlv-latn-ar', + wlw: 'wlw-latn-id', + wlx: 'wlx-latn-gh', + wma: 'wma-latn-ng', + wmb: 'wmb-latn-au', + wmc: 'wmc-latn-pg', + wmd: 'wmd-latn-br', + wme: 'wme-deva-np', + wmh: 'wmh-latn-tl', + wmi: 'wmi-latn-au', + wmm: 'wmm-latn-id', + wmn: 'wmn-latn-nc', + wmo: 'wmo-latn-zz', + wms: 'wms-latn-id', + wmt: 'wmt-latn-au', + wmw: 'wmw-latn-mz', + 'wmw-arab': 'wmw-arab-mz', + wmx: 'wmx-latn-pg', + wnb: 'wnb-latn-pg', + wnc: 'wnc-latn-zz', + wnd: 'wnd-latn-au', + wne: 'wne-arab-pk', + wng: 'wng-latn-id', + wni: 'wni-arab-km', + wnk: 'wnk-latn-id', + wnm: 'wnm-latn-au', + wnn: 'wnn-latn-au', + wno: 'wno-latn-id', + wnp: 'wnp-latn-pg', + wnu: 'wnu-latn-zz', + wnw: 'wnw-latn-us', + wny: 'wny-latn-au', + wo: 'wo-latn-sn', + woa: 'woa-latn-au', + wob: 'wob-latn-zz', + woc: 'woc-latn-pg', + wod: 'wod-latn-id', + woe: 'woe-latn-fm', + wof: 'wof-latn-gm', + 'wof-arab': 'wof-arab-gm', + wog: 'wog-latn-pg', + woi: 'woi-latn-id', + wok: 'wok-latn-cm', + wom: 'wom-latn-ng', + won: 'won-latn-cd', + woo: 'woo-latn-id', + wor: 'wor-latn-id', + wos: 'wos-latn-zz', + wow: 'wow-latn-id', + wpc: 'wpc-latn-ve', + wrb: 'wrb-latn-au', + wrg: 'wrg-latn-au', + wrh: 'wrh-latn-au', + wri: 'wri-latn-au', + wrk: 'wrk-latn-au', + wrl: 'wrl-latn-au', + wrm: 'wrm-latn-au', + wro: 'wro-latn-au', + wrp: 'wrp-latn-id', + wrr: 'wrr-latn-au', + wrs: 'wrs-latn-zz', + wru: 'wru-latn-id', + wrv: 'wrv-latn-pg', + wrw: 'wrw-latn-au', + wrx: 'wrx-latn-id', + wrz: 'wrz-latn-au', + wsa: 'wsa-latn-id', + wsg: 'wsg-gong-in', + wsi: 'wsi-latn-vu', + wsk: 'wsk-latn-zz', + wsr: 'wsr-latn-pg', + wss: 'wss-latn-gh', + wsu: 'wsu-latn-br', + wsv: 'wsv-arab-af', + wtf: 'wtf-latn-pg', + wth: 'wth-latn-au', + wti: 'wti-latn-et', + wtk: 'wtk-latn-pg', + wtm: 'wtm-deva-in', + wtw: 'wtw-latn-id', + 'wtw-bugi': 'wtw-bugi-id', + wua: 'wua-latn-au', + wub: 'wub-latn-au', + wud: 'wud-latn-tg', + wul: 'wul-latn-id', + wum: 'wum-latn-ga', + wun: 'wun-latn-tz', + wur: 'wur-latn-au', + wut: 'wut-latn-pg', + wuu: 'wuu-hans-cn', + wuv: 'wuv-latn-zz', + wux: 'wux-latn-au', + wuy: 'wuy-latn-id', + wwa: 'wwa-latn-zz', + wwb: 'wwb-latn-au', + wwo: 'wwo-latn-vu', + wwr: 'wwr-latn-au', + www: 'www-latn-cm', + wxw: 'wxw-latn-au', + wyb: 'wyb-latn-au', + wyi: 'wyi-latn-au', + wym: 'wym-latn-pl', + wyn: 'wyn-latn-us', + wyr: 'wyr-latn-br', + wyy: 'wyy-latn-fj', + xaa: 'xaa-latn-es', + xab: 'xab-latn-ng', + xai: 'xai-latn-br', + xaj: 'xaj-latn-br', + xak: 'xak-latn-ve', + xal: 'xal-cyrl-ru', + xam: 'xam-latn-za', + xan: 'xan-ethi-et', + xao: 'xao-latn-vn', + xar: 'xar-latn-pg', + xas: 'xas-cyrl-ru', + xat: 'xat-latn-br', + xau: 'xau-latn-id', + xav: 'xav-latn-br', + xaw: 'xaw-latn-us', + xay: 'xay-latn-id', + xbb: 'xbb-latn-au', + xbd: 'xbd-latn-au', + xbe: 'xbe-latn-au', + xbg: 'xbg-latn-au', + xbi: 'xbi-latn-zz', + xbj: 'xbj-latn-au', + xbm: 'xbm-latn-fr', + xbn: 'xbn-latn-my', + xbp: 'xbp-latn-au', + xbr: 'xbr-latn-id', + xbw: 'xbw-latn-br', + xby: 'xby-latn-au', + xch: 'xch-latn-us', + xco: 'xco-chrs-uz', + xcr: 'xcr-cari-tr', + xda: 'xda-latn-au', + xdk: 'xdk-latn-au', + xdo: 'xdo-latn-ao', + xdq: 'xdq-cyrl-ru', + xdy: 'xdy-latn-id', + xed: 'xed-latn-cm', + xeg: 'xeg-latn-za', + xem: 'xem-latn-id', + xer: 'xer-latn-br', + xes: 'xes-latn-zz', + xet: 'xet-latn-br', + xeu: 'xeu-latn-pg', + xgb: 'xgb-latn-ci', + xgd: 'xgd-latn-au', + xgg: 'xgg-latn-au', + xgi: 'xgi-latn-au', + xgm: 'xgm-latn-au', + xgu: 'xgu-latn-au', + xgw: 'xgw-latn-au', + xh: 'xh-latn-za', + xhe: 'xhe-arab-pk', + xhm: 'xhm-khmr-kh', + xhv: 'xhv-latn-vn', + xii: 'xii-latn-za', + xin: 'xin-latn-gt', + xir: 'xir-latn-br', + xis: 'xis-orya-in', + xiy: 'xiy-latn-br', + xjb: 'xjb-latn-au', + xjt: 'xjt-latn-au', + xka: 'xka-arab-pk', + xkb: 'xkb-latn-bj', + xkc: 'xkc-arab-ir', + xkd: 'xkd-latn-id', + xke: 'xke-latn-id', + xkg: 'xkg-latn-ml', + xkj: 'xkj-arab-ir', + xkl: 'xkl-latn-id', + xkn: 'xkn-latn-id', + xkp: 'xkp-arab-ir', + xkq: 'xkq-latn-id', + xkr: 'xkr-latn-br', + xks: 'xks-latn-id', + xkt: 'xkt-latn-gh', + xku: 'xku-latn-cg', + xkv: 'xkv-latn-bw', + xkw: 'xkw-latn-id', + xkx: 'xkx-latn-pg', + xky: 'xky-latn-my', + xkz: 'xkz-latn-bt', + xla: 'xla-latn-zz', + xlc: 'xlc-lyci-tr', + xld: 'xld-lydi-tr', + xly: 'xly-elym-ir', + xma: 'xma-latn-so', + xmb: 'xmb-latn-cm', + xmc: 'xmc-latn-mz', + xmd: 'xmd-latn-cm', + xmf: 'xmf-geor-ge', + xmg: 'xmg-latn-cm', + xmh: 'xmh-latn-au', + xmj: 'xmj-latn-cm', + xmm: 'xmm-latn-id', + xmn: 'xmn-mani-cn', + xmo: 'xmo-latn-br', + xmp: 'xmp-latn-au', + xmq: 'xmq-latn-au', + xmr: 'xmr-merc-sd', + xmt: 'xmt-latn-id', + xmu: 'xmu-latn-au', + xmv: 'xmv-latn-mg', + xmw: 'xmw-latn-mg', + xmx: 'xmx-latn-id', + xmy: 'xmy-latn-au', + xmz: 'xmz-latn-id', + xna: 'xna-narb-sa', + xnb: 'xnb-latn-tw', + xni: 'xni-latn-au', + xnj: 'xnj-latn-tz', + xnk: 'xnk-latn-au', + xnm: 'xnm-latn-au', + xnn: 'xnn-latn-ph', + xnq: 'xnq-latn-mz', + xnr: 'xnr-deva-in', + xnt: 'xnt-latn-us', + xnu: 'xnu-latn-au', + xny: 'xny-latn-au', + xnz: 'xnz-latn-eg', + 'xnz-arab': 'xnz-arab-eg', + xoc: 'xoc-latn-ng', + xod: 'xod-latn-id', + xog: 'xog-latn-ug', + xoi: 'xoi-latn-pg', + xok: 'xok-latn-br', + xom: 'xom-latn-sd', + 'xom-ethi': 'xom-ethi-et', + xon: 'xon-latn-zz', + xoo: 'xoo-latn-br', + xop: 'xop-latn-pg', + xor: 'xor-latn-br', + xow: 'xow-latn-pg', + xpa: 'xpa-latn-au', + xpb: 'xpb-latn-au', + xpd: 'xpd-latn-au', + xpf: 'xpf-latn-au', + xpg: 'xpg-grek-tr', + xph: 'xph-latn-au', + xpi: 'xpi-ogam-gb', + xpj: 'xpj-latn-au', + xpk: 'xpk-latn-br', + xpl: 'xpl-latn-au', + xpm: 'xpm-cyrl-ru', + xpn: 'xpn-latn-br', + xpo: 'xpo-latn-mx', + xpq: 'xpq-latn-us', + xpr: 'xpr-prti-ir', + xpt: 'xpt-latn-au', + xpv: 'xpv-latn-au', + xpw: 'xpw-latn-au', + xpx: 'xpx-latn-au', + xpz: 'xpz-latn-au', + xra: 'xra-latn-br', + xrb: 'xrb-latn-zz', + xrd: 'xrd-latn-au', + xre: 'xre-latn-br', + xrg: 'xrg-latn-au', + xri: 'xri-latn-br', + xrm: 'xrm-cyrl-ru', + xrn: 'xrn-cyrl-ru', + xrr: 'xrr-latn-it', + xru: 'xru-latn-au', + xrw: 'xrw-latn-pg', + xsa: 'xsa-sarb-ye', + xsb: 'xsb-latn-ph', + xse: 'xse-latn-id', + xsh: 'xsh-latn-ng', + xsi: 'xsi-latn-zz', + xsm: 'xsm-latn-zz', + xsn: 'xsn-latn-ng', + xsp: 'xsp-latn-pg', + xsq: 'xsq-latn-mz', + xsr: 'xsr-deva-np', + xss: 'xss-cyrl-ru', + xsu: 'xsu-latn-ve', + xsy: 'xsy-latn-tw', + xta: 'xta-latn-mx', + xtb: 'xtb-latn-mx', + xtc: 'xtc-latn-sd', + xtd: 'xtd-latn-mx', + xte: 'xte-latn-id', + xth: 'xth-latn-au', + xti: 'xti-latn-mx', + xtj: 'xtj-latn-mx', + xtl: 'xtl-latn-mx', + xtm: 'xtm-latn-mx', + xtn: 'xtn-latn-mx', + xtp: 'xtp-latn-mx', + xts: 'xts-latn-mx', + xtt: 'xtt-latn-mx', + xtu: 'xtu-latn-mx', + xtv: 'xtv-latn-au', + xtw: 'xtw-latn-br', + xty: 'xty-latn-mx', + xub: 'xub-taml-in', + 'xub-knda': 'xub-knda-in', + 'xub-mlym': 'xub-mlym-in', + xud: 'xud-latn-au', + xuj: 'xuj-taml-in', + xul: 'xul-latn-au', + xum: 'xum-latn-it', + 'xum-ital': 'xum-ital-it', + xun: 'xun-latn-au', + xuo: 'xuo-latn-td', + xut: 'xut-latn-au', + xuu: 'xuu-latn-na', + xve: 'xve-ital-it', + xvi: 'xvi-arab-af', + xvn: 'xvn-latn-es', + xvo: 'xvo-latn-it', + xvs: 'xvs-latn-it', + xwa: 'xwa-latn-br', + xwd: 'xwd-latn-au', + xwe: 'xwe-latn-zz', + xwj: 'xwj-latn-au', + xwk: 'xwk-latn-au', + xwl: 'xwl-latn-bj', + xwo: 'xwo-cyrl-ru', + xwr: 'xwr-latn-id', + xwt: 'xwt-latn-au', + xww: 'xww-latn-au', + xxb: 'xxb-latn-gh', + xxk: 'xxk-latn-id', + xxm: 'xxm-latn-au', + xxr: 'xxr-latn-br', + xxt: 'xxt-latn-id', + xya: 'xya-latn-au', + xyb: 'xyb-latn-au', + xyj: 'xyj-latn-au', + xyk: 'xyk-latn-au', + xyl: 'xyl-latn-br', + xyt: 'xyt-latn-au', + xyy: 'xyy-latn-au', + xzh: 'xzh-marc-cn', + xzp: 'xzp-latn-mx', + yaa: 'yaa-latn-pe', + yab: 'yab-latn-br', + yac: 'yac-latn-id', + yad: 'yad-latn-pe', + yae: 'yae-latn-ve', + yaf: 'yaf-latn-cd', + yag: 'yag-latn-cl', + yai: 'yai-cyrl-tj', + yaj: 'yaj-latn-cf', + yak: 'yak-latn-us', + yal: 'yal-latn-gn', + 'yal-arab': 'yal-arab-gn', + yam: 'yam-latn-zz', + yan: 'yan-latn-ni', + yao: 'yao-latn-mz', + yap: 'yap-latn-fm', + yaq: 'yaq-latn-mx', + yar: 'yar-latn-ve', + yas: 'yas-latn-zz', + yat: 'yat-latn-zz', + yau: 'yau-latn-ve', + yav: 'yav-latn-cm', + yaw: 'yaw-latn-br', + yax: 'yax-latn-ao', + yay: 'yay-latn-zz', + yaz: 'yaz-latn-zz', + yba: 'yba-latn-zz', + ybb: 'ybb-latn-cm', + ybe: 'ybe-latn-cn', + 'ybe-ougr': 'ybe-ougr-cn', + ybh: 'ybh-deva-np', + ybi: 'ybi-deva-np', + ybj: 'ybj-latn-ng', + ybl: 'ybl-latn-ng', + ybm: 'ybm-latn-pg', + ybn: 'ybn-latn-br', + ybo: 'ybo-latn-pg', + ybx: 'ybx-latn-pg', + yby: 'yby-latn-zz', + ycl: 'ycl-latn-cn', + ycn: 'ycn-latn-co', + yda: 'yda-latn-au', + yde: 'yde-latn-pg', + ydg: 'ydg-arab-pk', + ydk: 'ydk-latn-pg', + yea: 'yea-mlym-in', + 'yea-knda': 'yea-knda-in', + yec: 'yec-latn-de', + yee: 'yee-latn-pg', + yei: 'yei-latn-cm', + yej: 'yej-grek-il', + yel: 'yel-latn-cd', + yer: 'yer-latn-zz', + yes: 'yes-latn-ng', + yet: 'yet-latn-id', + yeu: 'yeu-telu-in', + yev: 'yev-latn-pg', + yey: 'yey-latn-bw', + yga: 'yga-latn-au', + ygi: 'ygi-latn-au', + ygl: 'ygl-latn-pg', + ygm: 'ygm-latn-pg', + ygp: 'ygp-plrd-cn', + ygr: 'ygr-latn-zz', + ygu: 'ygu-latn-au', + ygw: 'ygw-latn-zz', + yhd: 'yhd-hebr-il', + yi: 'yi-hebr-001', + yia: 'yia-latn-au', + yig: 'yig-yiii-cn', + yih: 'yih-hebr-de', + yii: 'yii-latn-au', + yij: 'yij-latn-au', + yil: 'yil-latn-au', + yim: 'yim-latn-in', + yir: 'yir-latn-id', + yis: 'yis-latn-pg', + yiv: 'yiv-yiii-cn', + yka: 'yka-latn-ph', + 'yka-arab': 'yka-arab-ph', + ykg: 'ykg-cyrl-ru', + yki: 'yki-latn-id', + ykk: 'ykk-latn-pg', + ykm: 'ykm-latn-pg', + yko: 'yko-latn-zz', + ykr: 'ykr-latn-pg', + yky: 'yky-latn-cf', + yla: 'yla-latn-pg', + ylb: 'ylb-latn-pg', + yle: 'yle-latn-zz', + ylg: 'ylg-latn-zz', + yli: 'yli-latn-id', + yll: 'yll-latn-zz', + ylr: 'ylr-latn-au', + ylu: 'ylu-latn-pg', + yly: 'yly-latn-nc', + ymb: 'ymb-latn-pg', + yme: 'yme-latn-pe', + ymg: 'ymg-latn-cd', + ymk: 'ymk-latn-mz', + 'ymk-arab': 'ymk-arab-mz', + yml: 'yml-latn-zz', + ymm: 'ymm-latn-so', + ymn: 'ymn-latn-id', + ymo: 'ymo-latn-pg', + ymp: 'ymp-latn-pg', + yna: 'yna-plrd-cn', + ynd: 'ynd-latn-au', + yng: 'yng-latn-cd', + ynk: 'ynk-cyrl-ru', + ynl: 'ynl-latn-pg', + ynq: 'ynq-latn-ng', + yns: 'yns-latn-cd', + ynu: 'ynu-latn-co', + yo: 'yo-latn-ng', + yob: 'yob-latn-pg', + yog: 'yog-latn-ph', + yoi: 'yoi-jpan-jp', + yok: 'yok-latn-us', + yol: 'yol-latn-gb', + yom: 'yom-latn-cd', + yon: 'yon-latn-zz', + yot: 'yot-latn-ng', + yoy: 'yoy-thai-th', + yra: 'yra-latn-pg', + yrb: 'yrb-latn-zz', + yre: 'yre-latn-zz', + yrk: 'yrk-cyrl-ru', + yrl: 'yrl-latn-br', + yrm: 'yrm-latn-au', + yro: 'yro-latn-br', + yrs: 'yrs-latn-id', + yrw: 'yrw-latn-pg', + yry: 'yry-latn-au', + ysd: 'ysd-yiii-cn', + ysn: 'ysn-yiii-cn', + ysp: 'ysp-yiii-cn', + ysr: 'ysr-cyrl-ru', + yss: 'yss-latn-zz', + ysy: 'ysy-plrd-cn', + ytw: 'ytw-latn-pg', + yty: 'yty-latn-au', + yua: 'yua-latn-mx', + yub: 'yub-latn-au', + yuc: 'yuc-latn-us', + yud: 'yud-hebr-il', + yue: 'yue-hant-hk', + 'yue-cn': 'yue-hans-cn', + 'yue-hans': 'yue-hans-cn', + yuf: 'yuf-latn-us', + yug: 'yug-cyrl-ru', + yui: 'yui-latn-co', + yuj: 'yuj-latn-zz', + yul: 'yul-latn-cf', + yum: 'yum-latn-us', + yun: 'yun-latn-ng', + yup: 'yup-latn-co', + yuq: 'yuq-latn-bo', + yur: 'yur-latn-us', + yut: 'yut-latn-zz', + yuw: 'yuw-latn-zz', + yux: 'yux-cyrl-ru', + yuz: 'yuz-latn-bo', + yva: 'yva-latn-id', + yvt: 'yvt-latn-ve', + ywa: 'ywa-latn-pg', + ywg: 'ywg-latn-au', + ywn: 'ywn-latn-br', + ywq: 'ywq-plrd-cn', + 'ywq-yiii': 'ywq-yiii-cn', + ywr: 'ywr-latn-au', + ywu: 'ywu-plrd-cn', + 'ywu-yiii': 'ywu-yiii-cn', + yww: 'yww-latn-au', + yxa: 'yxa-latn-au', + yxg: 'yxg-latn-au', + yxl: 'yxl-latn-au', + yxm: 'yxm-latn-au', + yxu: 'yxu-latn-au', + yxy: 'yxy-latn-au', + yyr: 'yyr-latn-au', + yyu: 'yyu-latn-pg', + za: 'za-latn-cn', + zaa: 'zaa-latn-mx', + zab: 'zab-latn-mx', + zac: 'zac-latn-mx', + zad: 'zad-latn-mx', + zae: 'zae-latn-mx', + zaf: 'zaf-latn-mx', + zag: 'zag-latn-sd', + zah: 'zah-latn-ng', + zaj: 'zaj-latn-tz', + zak: 'zak-latn-tz', + zam: 'zam-latn-mx', + zao: 'zao-latn-mx', + zap: 'zap-latn-mx', + zaq: 'zaq-latn-mx', + zar: 'zar-latn-mx', + zas: 'zas-latn-mx', + zat: 'zat-latn-mx', + zau: 'zau-tibt-in', + 'zau-arab': 'zau-arab-in', + zav: 'zav-latn-mx', + zaw: 'zaw-latn-mx', + zax: 'zax-latn-mx', + zay: 'zay-latn-et', + 'zay-ethi': 'zay-ethi-et', + zaz: 'zaz-latn-ng', + zba: 'zba-arab-001', + zbc: 'zbc-latn-my', + zbe: 'zbe-latn-my', + zbt: 'zbt-latn-id', + zbu: 'zbu-latn-ng', + zbw: 'zbw-latn-my', + zca: 'zca-latn-mx', + zch: 'zch-hani-cn', + zdj: 'zdj-arab-km', + zea: 'zea-latn-nl', + zeg: 'zeg-latn-pg', + zeh: 'zeh-hani-cn', + zen: 'zen-tfng-mr', + 'zen-arab': 'zen-arab-mr', + zga: 'zga-latn-tz', + zgb: 'zgb-hani-cn', + zgh: 'zgh-tfng-ma', + zgm: 'zgm-hani-cn', + zgn: 'zgn-hani-cn', + zgr: 'zgr-latn-pg', + zh: 'zh-hans-cn', + 'zh-au': 'zh-hant-au', + 'zh-bn': 'zh-hant-bn', + 'zh-bopo': 'zh-bopo-tw', + 'zh-gb': 'zh-hant-gb', + 'zh-gf': 'zh-hant-gf', + 'zh-hanb': 'zh-hanb-tw', + 'zh-hant': 'zh-hant-tw', + 'zh-hk': 'zh-hant-hk', + 'zh-id': 'zh-hant-id', + 'zh-mo': 'zh-hant-mo', + 'zh-pa': 'zh-hant-pa', + 'zh-pf': 'zh-hant-pf', + 'zh-ph': 'zh-hant-ph', + 'zh-sr': 'zh-hant-sr', + 'zh-th': 'zh-hant-th', + 'zh-tw': 'zh-hant-tw', + 'zh-us': 'zh-hant-us', + 'zh-vn': 'zh-hant-vn', + zhd: 'zhd-hani-cn', + 'zhd-latn': 'zhd-latn-vn', + zhi: 'zhi-latn-ng', + zhn: 'zhn-latn-cn', + 'zhn-hani': 'zhn-hani-cn', + zhw: 'zhw-latn-cm', + zhx: 'zhx-nshu-cn', + zia: 'zia-latn-zz', + zik: 'zik-latn-pg', + zil: 'zil-latn-gn', + zim: 'zim-latn-td', + zin: 'zin-latn-tz', + ziw: 'ziw-latn-tz', + ziz: 'ziz-latn-ng', + zka: 'zka-latn-id', + zkb: 'zkb-cyrl-ru', + zkd: 'zkd-latn-mm', + zko: 'zko-cyrl-ru', + zkp: 'zkp-latn-br', + zkt: 'zkt-kits-cn', + zku: 'zku-latn-au', + zkz: 'zkz-cyrl-ru', + zla: 'zla-latn-cd', + zlj: 'zlj-hani-cn', + 'zlj-latn': 'zlj-latn-cn', + zlm: 'zlm-latn-tg', + zln: 'zln-hani-cn', + zlq: 'zlq-hani-cn', + zma: 'zma-latn-au', + zmb: 'zmb-latn-cd', + zmc: 'zmc-latn-au', + zmd: 'zmd-latn-au', + zme: 'zme-latn-au', + zmf: 'zmf-latn-cd', + zmg: 'zmg-latn-au', + zmh: 'zmh-latn-pg', + zmi: 'zmi-latn-my', + zmj: 'zmj-latn-au', + zmk: 'zmk-latn-au', + zml: 'zml-latn-au', + zmm: 'zmm-latn-au', + zmn: 'zmn-latn-ga', + zmo: 'zmo-latn-sd', + zmp: 'zmp-latn-cd', + zmq: 'zmq-latn-cd', + zmr: 'zmr-latn-au', + zms: 'zms-latn-cd', + zmt: 'zmt-latn-au', + zmu: 'zmu-latn-au', + zmv: 'zmv-latn-au', + zmw: 'zmw-latn-cd', + zmx: 'zmx-latn-cg', + zmy: 'zmy-latn-au', + zmz: 'zmz-latn-cd', + zna: 'zna-latn-td', + zne: 'zne-latn-zz', + zng: 'zng-latn-vn', + znk: 'znk-latn-au', + zns: 'zns-latn-ng', + zoc: 'zoc-latn-mx', + zoh: 'zoh-latn-mx', + zom: 'zom-latn-in', + zoo: 'zoo-latn-mx', + zoq: 'zoq-latn-mx', + zor: 'zor-latn-mx', + zos: 'zos-latn-mx', + zpa: 'zpa-latn-mx', + zpb: 'zpb-latn-mx', + zpc: 'zpc-latn-mx', + zpd: 'zpd-latn-mx', + zpe: 'zpe-latn-mx', + zpf: 'zpf-latn-mx', + zpg: 'zpg-latn-mx', + zph: 'zph-latn-mx', + zpi: 'zpi-latn-mx', + zpj: 'zpj-latn-mx', + zpk: 'zpk-latn-mx', + zpl: 'zpl-latn-mx', + zpm: 'zpm-latn-mx', + zpn: 'zpn-latn-mx', + zpo: 'zpo-latn-mx', + zpp: 'zpp-latn-mx', + zpq: 'zpq-latn-mx', + zpr: 'zpr-latn-mx', + zps: 'zps-latn-mx', + zpt: 'zpt-latn-mx', + zpu: 'zpu-latn-mx', + zpv: 'zpv-latn-mx', + zpw: 'zpw-latn-mx', + zpx: 'zpx-latn-mx', + zpy: 'zpy-latn-mx', + zpz: 'zpz-latn-mx', + zqe: 'zqe-hani-cn', + 'zqe-latn': 'zqe-latn-cn', + zrn: 'zrn-latn-td', + zro: 'zro-latn-ec', + zrp: 'zrp-hebr-fr', + zrs: 'zrs-latn-id', + zsa: 'zsa-latn-pg', + zsr: 'zsr-latn-mx', + zsu: 'zsu-latn-pg', + zte: 'zte-latn-mx', + ztg: 'ztg-latn-mx', + ztl: 'ztl-latn-mx', + ztm: 'ztm-latn-mx', + ztn: 'ztn-latn-mx', + ztp: 'ztp-latn-mx', + ztq: 'ztq-latn-mx', + zts: 'zts-latn-mx', + ztt: 'ztt-latn-mx', + ztu: 'ztu-latn-mx', + ztx: 'ztx-latn-mx', + zty: 'zty-latn-mx', + zu: 'zu-latn-za', + zua: 'zua-latn-ng', + zuh: 'zuh-latn-pg', + zum: 'zum-arab-om', + zun: 'zun-latn-us', + zuy: 'zuy-latn-cm', + zyg: 'zyg-hani-cn', + zyj: 'zyj-latn-cn', + 'zyj-hani': 'zyj-hani-cn', + zyn: 'zyn-hani-cn', + zyp: 'zyp-latn-mm', + zza: 'zza-latn-tr', + zzj: 'zzj-hani-cn' +} diff --git a/node_modules/bcp-47-normalize/lib/many.d.ts b/node_modules/bcp-47-normalize/lib/many.d.ts new file mode 100644 index 0000000..33fa839 --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/many.d.ts @@ -0,0 +1,10 @@ +/** + * @typedef {'script'|'region'|'variants'} Field + */ +/** + * @type {{region: Record>}} + */ +export const many: { + region: Record>; +}; +export type Field = 'script' | 'region' | 'variants'; diff --git a/node_modules/bcp-47-normalize/lib/many.js b/node_modules/bcp-47-normalize/lib/many.js new file mode 100644 index 0000000..9e45d33 --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/many.js @@ -0,0 +1,95 @@ +/** + * @typedef {'script'|'region'|'variants'} Field + */ + +/** + * @type {{region: Record>}} + */ +export const many = { + region: { + 172: [ + 'ru', + 'am', + 'az', + 'by', + 'ge', + 'kg', + 'kz', + 'md', + 'tj', + 'tm', + 'ua', + 'uz' + ], + 200: ['cz', 'sk'], + 530: ['cw', 'sx', 'bq'], + 532: ['cw', 'sx', 'bq'], + 536: ['sa', 'iq'], + 582: ['fm', 'mh', 'mp', 'pw'], + 810: [ + 'ru', + 'am', + 'az', + 'by', + 'ee', + 'ge', + 'kz', + 'kg', + 'lv', + 'lt', + 'md', + 'tj', + 'tm', + 'ua', + 'uz' + ], + 830: ['je', 'gg'], + 890: ['rs', 'me', 'si', 'hr', 'mk', 'ba'], + 891: ['rs', 'me'], + an: ['cw', 'sx', 'bq'], + cs: ['rs', 'me'], + fq: ['aq', 'tf'], + nt: ['sa', 'iq'], + pc: ['fm', 'mh', 'mp', 'pw'], + su: [ + 'ru', + 'am', + 'az', + 'by', + 'ee', + 'ge', + 'kz', + 'kg', + 'lv', + 'lt', + 'md', + 'tj', + 'tm', + 'ua', + 'uz' + ], + yu: ['rs', 'me'], + '062': ['034', '143'], + ant: ['cw', 'sx', 'bq'], + scg: ['rs', 'me'], + ntz: ['sa', 'iq'], + sun: [ + 'ru', + 'am', + 'az', + 'by', + 'ee', + 'ge', + 'kz', + 'kg', + 'lv', + 'lt', + 'md', + 'tj', + 'tm', + 'ua', + 'uz' + ], + yug: ['rs', 'me'] + } +} diff --git a/node_modules/bcp-47-normalize/lib/matches.d.ts b/node_modules/bcp-47-normalize/lib/matches.d.ts new file mode 100644 index 0000000..99cda6e --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/matches.d.ts @@ -0,0 +1,13 @@ +/** + * @typedef Change + * @property {string} from + * @property {string} to + */ +/** + * @type {Array} + */ +export const matches: Array; +export type Change = { + from: string; + to: string; +}; diff --git a/node_modules/bcp-47-normalize/lib/matches.js b/node_modules/bcp-47-normalize/lib/matches.js new file mode 100644 index 0000000..ea270cb --- /dev/null +++ b/node_modules/bcp-47-normalize/lib/matches.js @@ -0,0 +1,1859 @@ +/** + * @typedef Change + * @property {string} from + * @property {string} to + */ + +/** + * @type {Array} + */ +export const matches = [ + { + from: 'in', + to: 'id' + }, + { + from: 'iw', + to: 'he' + }, + { + from: 'ji', + to: 'yi' + }, + { + from: 'jw', + to: 'jv' + }, + { + from: 'mo', + to: 'ro' + }, + { + from: 'scc', + to: 'sr' + }, + { + from: 'scr', + to: 'hr' + }, + { + from: 'aam', + to: 'aas' + }, + { + from: 'adp', + to: 'dz' + }, + { + from: 'aue', + to: 'ktz' + }, + { + from: 'ayx', + to: 'nun' + }, + { + from: 'bgm', + to: 'bcg' + }, + { + from: 'bjd', + to: 'drl' + }, + { + from: 'ccq', + to: 'rki' + }, + { + from: 'cjr', + to: 'mom' + }, + { + from: 'cka', + to: 'cmr' + }, + { + from: 'cmk', + to: 'xch' + }, + { + from: 'coy', + to: 'pij' + }, + { + from: 'cqu', + to: 'quh' + }, + { + from: 'drh', + to: 'mn' + }, + { + from: 'drw', + to: 'fa-af' + }, + { + from: 'gav', + to: 'dev' + }, + { + from: 'gfx', + to: 'vaj' + }, + { + from: 'ggn', + to: 'gvr' + }, + { + from: 'gti', + to: 'nyc' + }, + { + from: 'guv', + to: 'duz' + }, + { + from: 'hrr', + to: 'jal' + }, + { + from: 'ibi', + to: 'opa' + }, + { + from: 'ilw', + to: 'gal' + }, + { + from: 'jeg', + to: 'oyb' + }, + { + from: 'kgc', + to: 'tdf' + }, + { + from: 'kgh', + to: 'kml' + }, + { + from: 'koj', + to: 'kwv' + }, + { + from: 'krm', + to: 'bmf' + }, + { + from: 'ktr', + to: 'dtp' + }, + { + from: 'kvs', + to: 'gdj' + }, + { + from: 'kwq', + to: 'yam' + }, + { + from: 'kxe', + to: 'tvd' + }, + { + from: 'kzj', + to: 'dtp' + }, + { + from: 'kzt', + to: 'dtp' + }, + { + from: 'lii', + to: 'raq' + }, + { + from: 'lmm', + to: 'rmx' + }, + { + from: 'meg', + to: 'cir' + }, + { + from: 'mst', + to: 'mry' + }, + { + from: 'mwj', + to: 'vaj' + }, + { + from: 'myt', + to: 'mry' + }, + { + from: 'nad', + to: 'xny' + }, + { + from: 'ncp', + to: 'kdz' + }, + { + from: 'nnx', + to: 'ngv' + }, + { + from: 'nts', + to: 'pij' + }, + { + from: 'oun', + to: 'vaj' + }, + { + from: 'pcr', + to: 'adx' + }, + { + from: 'pmc', + to: 'huw' + }, + { + from: 'pmu', + to: 'phr' + }, + { + from: 'ppa', + to: 'bfy' + }, + { + from: 'ppr', + to: 'lcq' + }, + { + from: 'pry', + to: 'prt' + }, + { + from: 'puz', + to: 'pub' + }, + { + from: 'sca', + to: 'hle' + }, + { + from: 'skk', + to: 'oyb' + }, + { + from: 'tdu', + to: 'dtp' + }, + { + from: 'thc', + to: 'tpo' + }, + { + from: 'thx', + to: 'oyb' + }, + { + from: 'tie', + to: 'ras' + }, + { + from: 'tkk', + to: 'twm' + }, + { + from: 'tlw', + to: 'weo' + }, + { + from: 'tmp', + to: 'tyj' + }, + { + from: 'tne', + to: 'kak' + }, + { + from: 'tnf', + to: 'fa-af' + }, + { + from: 'tsf', + to: 'taj' + }, + { + from: 'uok', + to: 'ema' + }, + { + from: 'xba', + to: 'cax' + }, + { + from: 'xia', + to: 'acn' + }, + { + from: 'xkh', + to: 'waw' + }, + { + from: 'xsj', + to: 'suj' + }, + { + from: 'ybd', + to: 'rki' + }, + { + from: 'yma', + to: 'lrr' + }, + { + from: 'ymt', + to: 'mtm' + }, + { + from: 'yos', + to: 'zom' + }, + { + from: 'yuu', + to: 'yug' + }, + { + from: 'asd', + to: 'snz' + }, + { + from: 'dit', + to: 'dif' + }, + { + from: 'llo', + to: 'ngt' + }, + { + from: 'myd', + to: 'aog' + }, + { + from: 'nns', + to: 'nbr' + }, + { + from: 'agp', + to: 'apf' + }, + { + from: 'ais', + to: 'ami' + }, + { + from: 'ajt', + to: 'aeb' + }, + { + from: 'baz', + to: 'nvo' + }, + { + from: 'bhk', + to: 'fbl' + }, + { + from: 'bic', + to: 'bir' + }, + { + from: 'bjq', + to: 'bzc' + }, + { + from: 'bkb', + to: 'ebk' + }, + { + from: 'blg', + to: 'iba' + }, + { + from: 'btb', + to: 'beb' + }, + { + from: 'daf', + to: 'dnj' + }, + { + from: 'dap', + to: 'njz' + }, + { + from: 'djl', + to: 'dze' + }, + { + from: 'dkl', + to: 'aqd' + }, + { + from: 'drr', + to: 'kzk' + }, + { + from: 'dud', + to: 'uth' + }, + { + from: 'duj', + to: 'dwu' + }, + { + from: 'dwl', + to: 'dbt' + }, + { + from: 'elp', + to: 'amq' + }, + { + from: 'gbc', + to: 'wny' + }, + { + from: 'ggo', + to: 'esg' + }, + { + from: 'ggr', + to: 'gtu' + }, + { + from: 'gio', + to: 'aou' + }, + { + from: 'gli', + to: 'kzk' + }, + { + from: 'ill', + to: 'ilm' + }, + { + from: 'izi', + to: 'eza' + }, + { + from: 'jar', + to: 'jgk' + }, + { + from: 'kdv', + to: 'zkd' + }, + { + from: 'kgd', + to: 'ncq' + }, + { + from: 'kpp', + to: 'jkm' + }, + { + from: 'kxl', + to: 'kru' + }, + { + from: 'kzh', + to: 'dgl' + }, + { + from: 'lak', + to: 'ksp' + }, + { + from: 'leg', + to: 'enl' + }, + { + from: 'mgx', + to: 'jbk' + }, + { + from: 'mnt', + to: 'wnn' + }, + { + from: 'mof', + to: 'xnt' + }, + { + from: 'mwd', + to: 'dmw' + }, + { + from: 'nbf', + to: 'nru' + }, + { + from: 'nbx', + to: 'ekc' + }, + { + from: 'nln', + to: 'azd' + }, + { + from: 'nlr', + to: 'nrk' + }, + { + from: 'noo', + to: 'dtd' + }, + { + from: 'nxu', + to: 'bpp' + }, + { + from: 'pat', + to: 'kxr' + }, + { + from: 'rmr', + to: 'emx' + }, + { + from: 'sap', + to: 'aqt' + }, + { + from: 'sgl', + to: 'isk' + }, + { + from: 'smd', + to: 'kmb' + }, + { + from: 'snb', + to: 'iba' + }, + { + from: 'sul', + to: 'sgd' + }, + { + from: 'sum', + to: 'ulw' + }, + { + from: 'tgg', + to: 'bjp' + }, + { + from: 'thw', + to: 'ola' + }, + { + from: 'tid', + to: 'itd' + }, + { + from: 'unp', + to: 'wro' + }, + { + from: 'wgw', + to: 'wgb' + }, + { + from: 'wit', + to: 'nol' + }, + { + from: 'wiw', + to: 'nwo' + }, + { + from: 'xrq', + to: 'dmw' + }, + { + from: 'yen', + to: 'ynq' + }, + { + from: 'yiy', + to: 'yrm' + }, + { + from: 'zir', + to: 'scv' + }, + { + from: 'sgn-br', + to: 'bzs' + }, + { + from: 'sgn-co', + to: 'csn' + }, + { + from: 'sgn-de', + to: 'gsg' + }, + { + from: 'sgn-dk', + to: 'dsl' + }, + { + from: 'sgn-fr', + to: 'fsl' + }, + { + from: 'sgn-gb', + to: 'bfi' + }, + { + from: 'sgn-gr', + to: 'gss' + }, + { + from: 'sgn-ie', + to: 'isg' + }, + { + from: 'sgn-it', + to: 'ise' + }, + { + from: 'sgn-jp', + to: 'jsl' + }, + { + from: 'sgn-mx', + to: 'mfs' + }, + { + from: 'sgn-ni', + to: 'ncs' + }, + { + from: 'sgn-nl', + to: 'dse' + }, + { + from: 'sgn-no', + to: 'nsi' + }, + { + from: 'sgn-pt', + to: 'psr' + }, + { + from: 'sgn-se', + to: 'swl' + }, + { + from: 'sgn-us', + to: 'ase' + }, + { + from: 'sgn-za', + to: 'sfs' + }, + { + from: 'sgn-es', + to: 'ssp' + }, + { + from: 'zh-cmn', + to: 'zh' + }, + { + from: 'zh-cmn-hans', + to: 'zh-hans' + }, + { + from: 'zh-cmn-hant', + to: 'zh-hant' + }, + { + from: 'zh-gan', + to: 'gan' + }, + { + from: 'zh-wuu', + to: 'wuu' + }, + { + from: 'zh-yue', + to: 'yue' + }, + { + from: 'no-bokmal', + to: 'nb' + }, + { + from: 'no-nynorsk', + to: 'nn' + }, + { + from: 'aa-saaho', + to: 'ssy' + }, + { + from: 'sh', + to: 'sr-latn' + }, + { + from: 'cnr', + to: 'sr-me' + }, + { + from: 'tl', + to: 'fil' + }, + { + from: 'aju', + to: 'jrb' + }, + { + from: 'als', + to: 'sq' + }, + { + from: 'arb', + to: 'ar' + }, + { + from: 'ayr', + to: 'ay' + }, + { + from: 'azj', + to: 'az' + }, + { + from: 'bcc', + to: 'bal' + }, + { + from: 'bcl', + to: 'bik' + }, + { + from: 'bxk', + to: 'luy' + }, + { + from: 'bxr', + to: 'bua' + }, + { + from: 'cld', + to: 'syr' + }, + { + from: 'cmn', + to: 'zh' + }, + { + from: 'cwd', + to: 'cr' + }, + { + from: 'dgo', + to: 'doi' + }, + { + from: 'dhd', + to: 'mwr' + }, + { + from: 'dik', + to: 'din' + }, + { + from: 'diq', + to: 'zza' + }, + { + from: 'lbk', + to: 'bnc' + }, + { + from: 'ekk', + to: 'et' + }, + { + from: 'emk', + to: 'man' + }, + { + from: 'esk', + to: 'ik' + }, + { + from: 'fat', + to: 'ak' + }, + { + from: 'fuc', + to: 'ff' + }, + { + from: 'gaz', + to: 'om' + }, + { + from: 'gbo', + to: 'grb' + }, + { + from: 'gno', + to: 'gon' + }, + { + from: 'gug', + to: 'gn' + }, + { + from: 'gya', + to: 'gba' + }, + { + from: 'hdn', + to: 'hai' + }, + { + from: 'hea', + to: 'hmn' + }, + { + from: 'ike', + to: 'iu' + }, + { + from: 'kmr', + to: 'ku' + }, + { + from: 'knc', + to: 'kr' + }, + { + from: 'kng', + to: 'kg' + }, + { + from: 'knn', + to: 'kok' + }, + { + from: 'kpv', + to: 'kv' + }, + { + from: 'lvs', + to: 'lv' + }, + { + from: 'mhr', + to: 'chm' + }, + { + from: 'mup', + to: 'raj' + }, + { + from: 'khk', + to: 'mn' + }, + { + from: 'npi', + to: 'ne' + }, + { + from: 'ojg', + to: 'oj' + }, + { + from: 'ory', + to: 'or' + }, + { + from: 'pbu', + to: 'ps' + }, + { + from: 'pes', + to: 'fa' + }, + { + from: 'plt', + to: 'mg' + }, + { + from: 'pnb', + to: 'lah' + }, + { + from: 'quz', + to: 'qu' + }, + { + from: 'rmy', + to: 'rom' + }, + { + from: 'spy', + to: 'kln' + }, + { + from: 'src', + to: 'sc' + }, + { + from: 'swh', + to: 'sw' + }, + { + from: 'ttq', + to: 'tmh' + }, + { + from: 'tw', + to: 'ak' + }, + { + from: 'umu', + to: 'del' + }, + { + from: 'uzn', + to: 'uz' + }, + { + from: 'xpe', + to: 'kpe' + }, + { + from: 'xsl', + to: 'den' + }, + { + from: 'ydd', + to: 'yi' + }, + { + from: 'zai', + to: 'zap' + }, + { + from: 'zsm', + to: 'ms' + }, + { + from: 'zyb', + to: 'za' + }, + { + from: 'him', + to: 'srx' + }, + { + from: 'mnk', + to: 'man' + }, + { + from: 'bh', + to: 'bho' + }, + { + from: 'prs', + to: 'fa-af' + }, + { + from: 'swc', + to: 'sw-cd' + }, + { + from: 'aar', + to: 'aa' + }, + { + from: 'abk', + to: 'ab' + }, + { + from: 'ave', + to: 'ae' + }, + { + from: 'afr', + to: 'af' + }, + { + from: 'aka', + to: 'ak' + }, + { + from: 'amh', + to: 'am' + }, + { + from: 'arg', + to: 'an' + }, + { + from: 'ara', + to: 'ar' + }, + { + from: 'asm', + to: 'as' + }, + { + from: 'ava', + to: 'av' + }, + { + from: 'aym', + to: 'ay' + }, + { + from: 'aze', + to: 'az' + }, + { + from: 'bak', + to: 'ba' + }, + { + from: 'bel', + to: 'be' + }, + { + from: 'bul', + to: 'bg' + }, + { + from: 'bih', + to: 'bho' + }, + { + from: 'bis', + to: 'bi' + }, + { + from: 'bam', + to: 'bm' + }, + { + from: 'ben', + to: 'bn' + }, + { + from: 'bod', + to: 'bo' + }, + { + from: 'bre', + to: 'br' + }, + { + from: 'bos', + to: 'bs' + }, + { + from: 'cat', + to: 'ca' + }, + { + from: 'che', + to: 'ce' + }, + { + from: 'cha', + to: 'ch' + }, + { + from: 'cos', + to: 'co' + }, + { + from: 'cre', + to: 'cr' + }, + { + from: 'ces', + to: 'cs' + }, + { + from: 'chu', + to: 'cu' + }, + { + from: 'chv', + to: 'cv' + }, + { + from: 'cym', + to: 'cy' + }, + { + from: 'dan', + to: 'da' + }, + { + from: 'deu', + to: 'de' + }, + { + from: 'div', + to: 'dv' + }, + { + from: 'dzo', + to: 'dz' + }, + { + from: 'ewe', + to: 'ee' + }, + { + from: 'ell', + to: 'el' + }, + { + from: 'eng', + to: 'en' + }, + { + from: 'epo', + to: 'eo' + }, + { + from: 'spa', + to: 'es' + }, + { + from: 'est', + to: 'et' + }, + { + from: 'eus', + to: 'eu' + }, + { + from: 'fas', + to: 'fa' + }, + { + from: 'ful', + to: 'ff' + }, + { + from: 'fin', + to: 'fi' + }, + { + from: 'fij', + to: 'fj' + }, + { + from: 'fao', + to: 'fo' + }, + { + from: 'fra', + to: 'fr' + }, + { + from: 'fry', + to: 'fy' + }, + { + from: 'gle', + to: 'ga' + }, + { + from: 'gla', + to: 'gd' + }, + { + from: 'glg', + to: 'gl' + }, + { + from: 'grn', + to: 'gn' + }, + { + from: 'guj', + to: 'gu' + }, + { + from: 'glv', + to: 'gv' + }, + { + from: 'hau', + to: 'ha' + }, + { + from: 'heb', + to: 'he' + }, + { + from: 'hin', + to: 'hi' + }, + { + from: 'hmo', + to: 'ho' + }, + { + from: 'hrv', + to: 'hr' + }, + { + from: 'hat', + to: 'ht' + }, + { + from: 'hun', + to: 'hu' + }, + { + from: 'hye', + to: 'hy' + }, + { + from: 'her', + to: 'hz' + }, + { + from: 'ina', + to: 'ia' + }, + { + from: 'ind', + to: 'id' + }, + { + from: 'ile', + to: 'ie' + }, + { + from: 'ibo', + to: 'ig' + }, + { + from: 'iii', + to: 'ii' + }, + { + from: 'ipk', + to: 'ik' + }, + { + from: 'ido', + to: 'io' + }, + { + from: 'isl', + to: 'is' + }, + { + from: 'ita', + to: 'it' + }, + { + from: 'iku', + to: 'iu' + }, + { + from: 'jpn', + to: 'ja' + }, + { + from: 'jav', + to: 'jv' + }, + { + from: 'kat', + to: 'ka' + }, + { + from: 'kon', + to: 'kg' + }, + { + from: 'kik', + to: 'ki' + }, + { + from: 'kua', + to: 'kj' + }, + { + from: 'kaz', + to: 'kk' + }, + { + from: 'kal', + to: 'kl' + }, + { + from: 'khm', + to: 'km' + }, + { + from: 'kan', + to: 'kn' + }, + { + from: 'kor', + to: 'ko' + }, + { + from: 'kau', + to: 'kr' + }, + { + from: 'kas', + to: 'ks' + }, + { + from: 'kur', + to: 'ku' + }, + { + from: 'kom', + to: 'kv' + }, + { + from: 'cor', + to: 'kw' + }, + { + from: 'kir', + to: 'ky' + }, + { + from: 'lat', + to: 'la' + }, + { + from: 'ltz', + to: 'lb' + }, + { + from: 'lug', + to: 'lg' + }, + { + from: 'lim', + to: 'li' + }, + { + from: 'lin', + to: 'ln' + }, + { + from: 'lao', + to: 'lo' + }, + { + from: 'lit', + to: 'lt' + }, + { + from: 'lub', + to: 'lu' + }, + { + from: 'lav', + to: 'lv' + }, + { + from: 'mlg', + to: 'mg' + }, + { + from: 'mah', + to: 'mh' + }, + { + from: 'mri', + to: 'mi' + }, + { + from: 'mkd', + to: 'mk' + }, + { + from: 'mal', + to: 'ml' + }, + { + from: 'mon', + to: 'mn' + }, + { + from: 'mol', + to: 'ro' + }, + { + from: 'mar', + to: 'mr' + }, + { + from: 'msa', + to: 'ms' + }, + { + from: 'mlt', + to: 'mt' + }, + { + from: 'mya', + to: 'my' + }, + { + from: 'nau', + to: 'na' + }, + { + from: 'nob', + to: 'nb' + }, + { + from: 'nde', + to: 'nd' + }, + { + from: 'nep', + to: 'ne' + }, + { + from: 'ndo', + to: 'ng' + }, + { + from: 'nld', + to: 'nl' + }, + { + from: 'nno', + to: 'nn' + }, + { + from: 'nor', + to: 'no' + }, + { + from: 'nbl', + to: 'nr' + }, + { + from: 'nav', + to: 'nv' + }, + { + from: 'nya', + to: 'ny' + }, + { + from: 'oci', + to: 'oc' + }, + { + from: 'oji', + to: 'oj' + }, + { + from: 'orm', + to: 'om' + }, + { + from: 'ori', + to: 'or' + }, + { + from: 'oss', + to: 'os' + }, + { + from: 'pan', + to: 'pa' + }, + { + from: 'pli', + to: 'pi' + }, + { + from: 'pol', + to: 'pl' + }, + { + from: 'pus', + to: 'ps' + }, + { + from: 'por', + to: 'pt' + }, + { + from: 'que', + to: 'qu' + }, + { + from: 'roh', + to: 'rm' + }, + { + from: 'run', + to: 'rn' + }, + { + from: 'ron', + to: 'ro' + }, + { + from: 'rus', + to: 'ru' + }, + { + from: 'kin', + to: 'rw' + }, + { + from: 'san', + to: 'sa' + }, + { + from: 'srd', + to: 'sc' + }, + { + from: 'snd', + to: 'sd' + }, + { + from: 'sme', + to: 'se' + }, + { + from: 'sag', + to: 'sg' + }, + { + from: 'hbs', + to: 'sr-latn' + }, + { + from: 'sin', + to: 'si' + }, + { + from: 'slk', + to: 'sk' + }, + { + from: 'slv', + to: 'sl' + }, + { + from: 'smo', + to: 'sm' + }, + { + from: 'sna', + to: 'sn' + }, + { + from: 'som', + to: 'so' + }, + { + from: 'sqi', + to: 'sq' + }, + { + from: 'srp', + to: 'sr' + }, + { + from: 'ssw', + to: 'ss' + }, + { + from: 'sot', + to: 'st' + }, + { + from: 'sun', + to: 'su' + }, + { + from: 'swe', + to: 'sv' + }, + { + from: 'swa', + to: 'sw' + }, + { + from: 'tam', + to: 'ta' + }, + { + from: 'tel', + to: 'te' + }, + { + from: 'tgk', + to: 'tg' + }, + { + from: 'tha', + to: 'th' + }, + { + from: 'tir', + to: 'ti' + }, + { + from: 'tuk', + to: 'tk' + }, + { + from: 'tgl', + to: 'fil' + }, + { + from: 'tsn', + to: 'tn' + }, + { + from: 'ton', + to: 'to' + }, + { + from: 'tur', + to: 'tr' + }, + { + from: 'tso', + to: 'ts' + }, + { + from: 'tat', + to: 'tt' + }, + { + from: 'twi', + to: 'ak' + }, + { + from: 'tah', + to: 'ty' + }, + { + from: 'uig', + to: 'ug' + }, + { + from: 'ukr', + to: 'uk' + }, + { + from: 'urd', + to: 'ur' + }, + { + from: 'uzb', + to: 'uz' + }, + { + from: 'ven', + to: 've' + }, + { + from: 'vie', + to: 'vi' + }, + { + from: 'vol', + to: 'vo' + }, + { + from: 'wln', + to: 'wa' + }, + { + from: 'wol', + to: 'wo' + }, + { + from: 'xho', + to: 'xh' + }, + { + from: 'yid', + to: 'yi' + }, + { + from: 'yor', + to: 'yo' + }, + { + from: 'zha', + to: 'za' + }, + { + from: 'zho', + to: 'zh' + }, + { + from: 'zul', + to: 'zu' + }, + { + from: 'alb', + to: 'sq' + }, + { + from: 'arm', + to: 'hy' + }, + { + from: 'baq', + to: 'eu' + }, + { + from: 'bur', + to: 'my' + }, + { + from: 'chi', + to: 'zh' + }, + { + from: 'cze', + to: 'cs' + }, + { + from: 'dut', + to: 'nl' + }, + { + from: 'fre', + to: 'fr' + }, + { + from: 'geo', + to: 'ka' + }, + { + from: 'ger', + to: 'de' + }, + { + from: 'gre', + to: 'el' + }, + { + from: 'ice', + to: 'is' + }, + { + from: 'mac', + to: 'mk' + }, + { + from: 'mao', + to: 'mi' + }, + { + from: 'may', + to: 'ms' + }, + { + from: 'per', + to: 'fa' + }, + { + from: 'rum', + to: 'ro' + }, + { + from: 'slo', + to: 'sk' + }, + { + from: 'tib', + to: 'bo' + }, + { + from: 'wel', + to: 'cy' + }, + { + from: 'und-aaland', + to: 'und-ax' + }, + { + from: 'hy-arevmda', + to: 'hyw' + }, + { + from: 'und-arevmda', + to: 'und' + }, + { + from: 'und-arevela', + to: 'und' + }, + { + from: 'und-lojban', + to: 'und' + }, + { + from: 'und-saaho', + to: 'und' + }, + { + from: 'und-bokmal', + to: 'und' + }, + { + from: 'und-nynorsk', + to: 'und' + }, + { + from: 'und-hakka', + to: 'und' + }, + { + from: 'und-xiang', + to: 'und' + }, + { + from: 'und-hepburn-heploc', + to: 'und-alalc97' + } +] diff --git a/node_modules/bcp-47-normalize/license b/node_modules/bcp-47-normalize/license new file mode 100644 index 0000000..3937235 --- /dev/null +++ b/node_modules/bcp-47-normalize/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2020 Titus Wormer + +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/bcp-47-normalize/package.json b/node_modules/bcp-47-normalize/package.json new file mode 100644 index 0000000..d8f4c5c --- /dev/null +++ b/node_modules/bcp-47-normalize/package.json @@ -0,0 +1,91 @@ +{ + "name": "bcp-47-normalize", + "version": "2.3.0", + "description": "Normalize, canonicalize, and format BCP 47 tags", + "license": "MIT", + "keywords": [ + "bcp", + "47", + "bcp47", + "bcp-47", + "language", + "region", + "script", + "tag", + "subtag", + "format", + "pretty", + "normal", + "canonical" + ], + "repository": "wooorm/bcp-47-normalize", + "bugs": "https://github.com/wooorm/bcp-47-normalize/issues", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + }, + "author": "Titus Wormer (https://wooorm.com)", + "contributors": [ + "Titus Wormer (https://wooorm.com)" + ], + "sideEffects": false, + "type": "module", + "main": "index.js", + "types": "index.d.ts", + "files": [ + "lib/", + "index.d.ts", + "index.js" + ], + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/node-fetch": "^3.0.0", + "@types/xast": "^2.0.0", + "c8": "^8.0.0", + "cldr-core": "^43.0.0", + "node-fetch": "^3.0.0", + "prettier": "^3.0.0", + "remark-cli": "^11.0.0", + "remark-preset-wooorm": "^9.0.0", + "type-coverage": "^2.0.0", + "typescript": "^5.0.0", + "unist-util-visit": "^5.0.0", + "xast-util-from-xml": "^3.0.0", + "xo": "^0.55.0" + }, + "scripts": { + "prepack": "npm run generate && npm run build && npm run format", + "generate": "node --conditions development build.js", + "build": "tsc --build --clean && tsc --build && type-coverage", + "format": "remark . -qfo && prettier . -w --log-level warn && xo --fix", + "test-api": "node --conditions development test.js", + "test-coverage": "c8 --check-coverage --100 --reporter lcov npm run test-api", + "test": "npm run generate && npm run build && npm run format && npm run test-coverage" + }, + "prettier": { + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "bracketSpacing": false, + "semi": false, + "trailingComma": "none" + }, + "xo": { + "prettier": true + }, + "remarkConfig": { + "plugins": [ + "preset-wooorm" + ] + }, + "typeCoverage": { + "atLeast": 100, + "detail": true, + "strict": true, + "ignoreCatch": true + } +} diff --git a/node_modules/bcp-47-normalize/readme.md b/node_modules/bcp-47-normalize/readme.md new file mode 100644 index 0000000..c6875ae --- /dev/null +++ b/node_modules/bcp-47-normalize/readme.md @@ -0,0 +1,207 @@ +# bcp-47-normalize + +[![Build][build-badge]][build] +[![Coverage][coverage-badge]][coverage] +[![Downloads][downloads-badge]][downloads] +[![Size][size-badge]][size] + +Normalize, canonicalize, and format [BCP 47][spec] tags. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`bcp47Normalize(tag[, options])`](#bcp47normalizetag-options) +* [Types](#types) +* [Compatibility](#compatibility) +* [Security](#security) +* [Related](#related) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This package takes BCP 47 tags and makes them uniform. +It removes unneeded info (`en-us` -> `en`) and replaces deprecated, +overlong, and otherwise unpreferred values with preferred values +(`en-bu` -> `en-MM`). +It works by applying [Unicode CLDR suggestions][alias]. + +## When should I use this? + +You can use this package when dealing with user-provided language tags and want +to normalize and clean them. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 14.14+, 16.0+), install with [npm][]: + +```sh +npm install bcp-47-normalize +``` + +In Deno with [`esm.sh`][esmsh]: + +```js +import {bcp47Normalize} from 'https://esm.sh/bcp-47-normalize@2' +``` + +In browsers with [`esm.sh`][esmsh]: + +```html + +``` + +## Use + +```js +import {bcp47Normalize} from 'bcp-47-normalize' + +const tags = [ + 'de-de-1901', + 'en-gb', + 'en-us', + 'en-bu', + 'hy-arevmda', + 'nld-nl', + 'no-nyn', + 'pt-br', + 'pt-pt', + 'zh-hans-cn' +] + +tags.forEach((tag) => console.log('%s -> %s', tag, bcp47Normalize(tag))) +``` + +Yields: + +```txt +de-de-1901 -> de-1901 +en-gb -> en-GB +en-us -> en +en-bu -> en-MM +hy-arevmda -> hyw +nld-nl -> nl +no-nyn -> nn +pt-br -> pt +pt-pt -> pt-PT +zh-hans-cn -> zh +``` + +## API + +This package exports the identifier `bcp47Normalize`. +There is no default export. + +### `bcp47Normalize(tag[, options])` + +Normalize the given BCP 47 tag according to [Unicode CLDR suggestions][alias]. + +###### Parameters + +* `tag` (`string`) + — BCP 47 tag +* `options.forgiving` (`boolean`, default: `false`) + — passed to `bcp-47` as [`options.forgiving`][forgiving] +* `options.warning` (`Function?`, default: `undefined`) + — passed to `bcp-47` as [`options.warning`][warning] + + One additional warning is given: + + | code | reason | + | :--- | :--------------------------------------------------------- | + | 7 | Deprecated region `CURRENT`, expected one of `SUGGESTIONS` | + + This warning is only given if the region cannot be automatically fixed (when + regions split into multiple regions). + +###### Returns + +Normal, canonical, and pretty [BCP 47][spec] tag (`string`). + +## Types + +This package is fully typed with [TypeScript][]. +It exports the additional types `Options` and `Warning`. + +## Compatibility + +This package is at least compatible with all maintained versions of Node.js. +As of now, that is Node.js 14.14+ and 16.0+. +It also works in Deno and modern browsers. + +## Security + +This package is safe. + +## Related + +* [`wooorm/bcp-47`](https://github.com/wooorm/bcp-47) + — parse and stringify BCP 47 language tags +* [`wooorm/bcp-47-match`](https://github.com/wooorm/bcp-47-match) + — match BCP 47 language tags with language ranges per RFC 4647 +* [`wooorm/iso-3166`](https://github.com/wooorm/iso-3166) + — ISO 3166 codes +* [`wooorm/iso-639-2`](https://github.com/wooorm/iso-639-2) + — ISO 639-2 codes +* [`wooorm/iso-639-3`](https://github.com/wooorm/iso-639-3) + — ISO 639-3 codes +* [`wooorm/iso-15924`](https://github.com/wooorm/iso-15924) + — ISO 15924 codes +* [`wooorm/un-m49`](https://github.com/wooorm/un-m49) + — UN M49 codes + +## Contribute + +Yes please! +See [How to Contribute to Open Source][contribute]. + +## License + +[MIT][license] © [Titus Wormer][author] + + + +[build-badge]: https://github.com/wooorm/bcp-47-normalize/workflows/main/badge.svg + +[build]: https://github.com/wooorm/bcp-47-normalize/actions + +[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/bcp-47-normalize.svg + +[coverage]: https://codecov.io/github/wooorm/bcp-47-normalize + +[downloads-badge]: https://img.shields.io/npm/dm/bcp-47-normalize.svg + +[downloads]: https://www.npmjs.com/package/bcp-47-normalize + +[size-badge]: https://img.shields.io/bundlephobia/minzip/bcp-47-normalize.svg + +[size]: https://bundlephobia.com/result?p=bcp-47-normalize + +[npm]: https://docs.npmjs.com/cli/install + +[esmsh]: https://esm.sh + +[license]: license + +[author]: https://wooorm.com + +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[typescript]: https://www.typescriptlang.org + +[contribute]: https://opensource.guide/how-to-contribute/ + +[spec]: https://tools.ietf.org/rfc/bcp/bcp47.html + +[alias]: https://github.com/unicode-org/cldr/blob/142b327/common/supplemental/supplementalMetadata.xml#L32 + +[forgiving]: https://github.com/wooorm/bcp-47#optionsforgiving + +[warning]: https://github.com/wooorm/bcp-47#optionswarning diff --git a/node_modules/bcp-47/index.d.ts b/node_modules/bcp-47/index.d.ts new file mode 100644 index 0000000..8b4a602 --- /dev/null +++ b/node_modules/bcp-47/index.d.ts @@ -0,0 +1,6 @@ +export {parse} from './lib/parse.js' +export {stringify} from './lib/stringify.js' +export type Schema = import('./lib/parse.js').Schema +export type Extension = import('./lib/parse.js').Extension +export type Warning = import('./lib/parse.js').Warning +export type Options = import('./lib/parse.js').Options diff --git a/node_modules/bcp-47/index.js b/node_modules/bcp-47/index.js new file mode 100644 index 0000000..a16162c --- /dev/null +++ b/node_modules/bcp-47/index.js @@ -0,0 +1,9 @@ +/** + * @typedef {import('./lib/parse.js').Schema} Schema + * @typedef {import('./lib/parse.js').Extension} Extension + * @typedef {import('./lib/parse.js').Warning} Warning + * @typedef {import('./lib/parse.js').Options} Options + */ + +export {parse} from './lib/parse.js' +export {stringify} from './lib/stringify.js' diff --git a/node_modules/bcp-47/lib/normal.d.ts b/node_modules/bcp-47/lib/normal.d.ts new file mode 100644 index 0000000..ca7cd82 --- /dev/null +++ b/node_modules/bcp-47/lib/normal.d.ts @@ -0,0 +1,2 @@ +/** @type {Record} */ +export const normal: Record diff --git a/node_modules/bcp-47/lib/normal.js b/node_modules/bcp-47/lib/normal.js new file mode 100644 index 0000000..20cca11 --- /dev/null +++ b/node_modules/bcp-47/lib/normal.js @@ -0,0 +1,29 @@ +/** @type {Record} */ +export const normal = { + 'en-gb-oed': 'en-GB-oxendict', + 'i-ami': 'ami', + 'i-bnn': 'bnn', + 'i-default': null, + 'i-enochian': null, + 'i-hak': 'hak', + 'i-klingon': 'tlh', + 'i-lux': 'lb', + 'i-mingo': null, + 'i-navajo': 'nv', + 'i-pwn': 'pwn', + 'i-tao': 'tao', + 'i-tay': 'tay', + 'i-tsu': 'tsu', + 'sgn-be-fr': 'sfb', + 'sgn-be-nl': 'vgt', + 'sgn-ch-de': 'sgg', + 'art-lojban': 'jbo', + 'cel-gaulish': null, + 'no-bok': 'nb', + 'no-nyn': 'nn', + 'zh-guoyu': 'cmn', + 'zh-hakka': 'hak', + 'zh-min': null, + 'zh-min-nan': 'nan', + 'zh-xiang': 'hsn' +} diff --git a/node_modules/bcp-47/lib/parse.d.ts b/node_modules/bcp-47/lib/parse.d.ts new file mode 100644 index 0000000..ef18cc1 --- /dev/null +++ b/node_modules/bcp-47/lib/parse.d.ts @@ -0,0 +1,29 @@ +/** + * Parse a BCP 47 language tag. + * + * @param {string} tag + * @param {Options} [options] + * @returns {Schema} + */ +export function parse(tag: string, options?: Options | undefined): Schema +export type Warning = (reason: string, code: number, offset: number) => void +export type Options = { + normalize?: boolean | undefined + forgiving?: boolean | undefined + warning?: Warning | undefined +} +export type Extension = { + singleton: string + extensions: Array +} +export type Schema = { + language: string | null | undefined + extendedLanguageSubtags: Array + script: string | null | undefined + region: string | null | undefined + variants: Array + extensions: Array + privateuse: Array + irregular: string | null | undefined + regular: string | null | undefined +} diff --git a/node_modules/bcp-47/lib/parse.js b/node_modules/bcp-47/lib/parse.js new file mode 100644 index 0000000..7251a71 --- /dev/null +++ b/node_modules/bcp-47/lib/parse.js @@ -0,0 +1,310 @@ +/** + * @callback Warning + * @param {string} reason + * @param {number} code + * @param {number} offset + * @returns {void} + * + * @typedef Options + * @property {boolean} [normalize=true] + * @property {boolean} [forgiving=false] + * @property {Warning} [warning] + * + * @typedef Extension + * @property {string} singleton + * @property {Array} extensions + * + * @typedef Schema + * @property {string|null|undefined} language + * @property {Array} extendedLanguageSubtags + * @property {string|null|undefined} script + * @property {string|null|undefined} region + * @property {Array} variants + * @property {Array} extensions + * @property {Array} privateuse + * @property {string|null|undefined} irregular + * @property {string|null|undefined} regular + */ + +import {isAlphanumerical} from 'is-alphanumerical' +import {isAlphabetical} from 'is-alphabetical' +import {isDecimal} from 'is-decimal' +import {regular} from './regular.js' +import {normal} from './normal.js' + +const own = {}.hasOwnProperty + +/** + * Parse a BCP 47 language tag. + * + * @param {string} tag + * @param {Options} [options] + * @returns {Schema} + */ +export function parse(tag, options = {}) { + const result = empty() + const source = String(tag) + const value = source.toLowerCase() + let index = 0 + + // Check input. + if (tag === null || tag === undefined) { + throw new Error('Expected string, got `' + tag + '`') + } + + // Let’s start. + // First: the edge cases. + if (own.call(normal, value)) { + const replacement = normal[value] + + if ( + (options.normalize === undefined || + options.normalize === null || + options.normalize) && + typeof replacement === 'string' + ) { + return parse(replacement) + } + + result[regular.includes(value) ? 'regular' : 'irregular'] = source + + return result + } + + // Now, to actually parse, eat what could be a language. + while (isAlphabetical(value.charCodeAt(index)) && index < 9) index++ + + // A language. + if (index > 1 /* Min 639. */ && index < 9 /* Max subtag. */) { + // 5 and up is a subtag. + // 4 is the size of reserved languages. + // 3 an ISO 639-2 or ISO 639-3. + // 2 is an ISO 639-1. + // + // + result.language = source.slice(0, index) + + if (index < 4 /* Max 639. */) { + let groups = 0 + + while ( + value.charCodeAt(index) === 45 /* `-` */ && + isAlphabetical(value.charCodeAt(index + 1)) && + isAlphabetical(value.charCodeAt(index + 2)) && + isAlphabetical(value.charCodeAt(index + 3)) && + !isAlphabetical(value.charCodeAt(index + 4)) + ) { + if (groups > 2 /* Max extended language subtag count. */) { + return fail( + index, + 3, + 'Too many extended language subtags, expected at most 3 subtags' + ) + } + + // Extended language subtag. + result.extendedLanguageSubtags.push(source.slice(index + 1, index + 4)) + index += 4 + groups++ + } + } + + // ISO 15924 script. + // + if ( + value.charCodeAt(index) === 45 /* `-` */ && + isAlphabetical(value.charCodeAt(index + 1)) && + isAlphabetical(value.charCodeAt(index + 2)) && + isAlphabetical(value.charCodeAt(index + 3)) && + isAlphabetical(value.charCodeAt(index + 4)) && + !isAlphabetical(value.charCodeAt(index + 5)) + ) { + result.script = source.slice(index + 1, index + 5) + index += 5 + } + + if (value.charCodeAt(index) === 45 /* `-` */) { + // ISO 3166-1 region. + // + if ( + isAlphabetical(value.charCodeAt(index + 1)) && + isAlphabetical(value.charCodeAt(index + 2)) && + !isAlphabetical(value.charCodeAt(index + 3)) + ) { + result.region = source.slice(index + 1, index + 3) + index += 3 + } + // UN M49 region. + // + else if ( + isDecimal(value.charCodeAt(index + 1)) && + isDecimal(value.charCodeAt(index + 2)) && + isDecimal(value.charCodeAt(index + 3)) && + !isDecimal(value.charCodeAt(index + 4)) + ) { + result.region = source.slice(index + 1, index + 4) + index += 4 + } + } + + while (value.charCodeAt(index) === 45 /* `-` */) { + const start = index + 1 + let offset = start + + while (isAlphanumerical(value.charCodeAt(offset))) { + if (offset - start > 7 /* Max variant. */) { + return fail( + offset, + 1, + 'Too long variant, expected at most 8 characters' + ) + } + + offset++ + } + + if ( + // Long variant. + offset - start > 4 /* Min alpha numeric variant. */ || + // Short variant. + (offset - start > 3 /* Min variant. */ && + isDecimal(value.charCodeAt(start))) + ) { + result.variants.push(source.slice(start, offset)) + index = offset + } + // Something else. + else { + break + } + } + + // Extensions. + while (value.charCodeAt(index) === 45 /* `-` */) { + // Exit if this isn’t an extension. + if ( + value.charCodeAt(index + 1) === 120 /* `x` */ || + !isAlphanumerical(value.charCodeAt(index + 1)) || + value.charCodeAt(index + 2) !== 45 /* `-` */ || + !isAlphanumerical(value.charCodeAt(index + 3)) + ) { + break + } + + let offset = index + 2 + let groups = 0 + + while ( + value.charCodeAt(offset) === 45 /* `-` */ && + isAlphanumerical(value.charCodeAt(offset + 1)) && + isAlphanumerical(value.charCodeAt(offset + 2)) + ) { + const start = offset + 1 + offset = start + 2 + groups++ + + while (isAlphanumerical(value.charCodeAt(offset))) { + if (offset - start > 7 /* Max extension. */) { + return fail( + offset, + 2, + 'Too long extension, expected at most 8 characters' + ) + } + + offset++ + } + } + + if (!groups) { + return fail( + offset, + 4, + 'Empty extension, extensions must have at least 2 characters of content' + ) + } + + result.extensions.push({ + singleton: source.charAt(index + 1), + extensions: source.slice(index + 3, offset).split('-') + }) + + index = offset + } + } + // Not a language. + else { + index = 0 + } + + // Private use. + if ( + (index === 0 && value.charCodeAt(index) === 120) /* `x` */ || + (value.charCodeAt(index) === 45 /* `-` */ && + value.charCodeAt(index + 1) === 120) /* `x` */ + ) { + index = index ? index + 2 : 1 + let offset = index + + while ( + value.charCodeAt(offset) === 45 /* `-` */ && + isAlphanumerical(value.charCodeAt(offset + 1)) + ) { + const start = index + 1 + offset = start + + while (isAlphanumerical(value.charCodeAt(offset))) { + if (offset - start > 7 /* Max private use. */) { + return fail( + offset, + 5, + 'Too long private-use area, expected at most 8 characters' + ) + } + + offset++ + } + + result.privateuse.push(source.slice(index + 1, offset)) + index = offset + } + } + + if (index !== source.length) { + return fail(index, 6, 'Found superfluous content after tag') + } + + return result + + /** + * Create an empty results object. + * + * @param {number} offset + * @param {number} code + * @param {string} reason + * @returns {Schema} + */ + function fail(offset, code, reason) { + if (options.warning) options.warning(reason, code, offset) + return options.forgiving ? result : empty() + } +} + +/** + * Create an empty results object. + * + * @returns {Schema} + */ +function empty() { + return { + language: null, + extendedLanguageSubtags: [], + script: null, + region: null, + variants: [], + extensions: [], + privateuse: [], + irregular: null, + regular: null + } +} diff --git a/node_modules/bcp-47/lib/regular.d.ts b/node_modules/bcp-47/lib/regular.d.ts new file mode 100644 index 0000000..1818fbd --- /dev/null +++ b/node_modules/bcp-47/lib/regular.d.ts @@ -0,0 +1,2 @@ +/** @type {Array} */ +export const regular: Array diff --git a/node_modules/bcp-47/lib/regular.js b/node_modules/bcp-47/lib/regular.js new file mode 100644 index 0000000..0aa5fab --- /dev/null +++ b/node_modules/bcp-47/lib/regular.js @@ -0,0 +1,12 @@ +/** @type {Array} */ +export const regular = [ + 'art-lojban', + 'cel-gaulish', + 'no-bok', + 'no-nyn', + 'zh-guoyu', + 'zh-hakka', + 'zh-min', + 'zh-min-nan', + 'zh-xiang' +] diff --git a/node_modules/bcp-47/lib/stringify.d.ts b/node_modules/bcp-47/lib/stringify.d.ts new file mode 100644 index 0000000..14942c4 --- /dev/null +++ b/node_modules/bcp-47/lib/stringify.d.ts @@ -0,0 +1,13 @@ +/** + * @typedef {Partial} Schema + * @typedef {Partial} Extension + */ +/** + * Compile a language schema to a BCP 47 language tag. + * + * @param {Schema} schema + * @returns {string} + */ +export function stringify(schema?: Schema): string +export type Schema = Partial +export type Extension = Partial diff --git a/node_modules/bcp-47/lib/stringify.js b/node_modules/bcp-47/lib/stringify.js new file mode 100644 index 0000000..e5b367a --- /dev/null +++ b/node_modules/bcp-47/lib/stringify.js @@ -0,0 +1,50 @@ +/** + * @typedef {Partial} Schema + * @typedef {Partial} Extension + */ + +/** + * Compile a language schema to a BCP 47 language tag. + * + * @param {Schema} schema + * @returns {string} + */ +export function stringify(schema = {}) { + /** @type {Array} */ + let result = [] + + if (schema.irregular) { + return schema.irregular + } + + if (schema.regular) { + return schema.regular + } + + if (schema.language) { + result = result.concat( + schema.language, + schema.extendedLanguageSubtags || [], + schema.script || [], + schema.region || [], + schema.variants || [] + ) + + const values = schema.extensions || [] + let index = -1 + + while (++index < values.length) { + const value = values[index] + + if (value.singleton && value.extensions && value.extensions.length > 0) { + result.push(value.singleton, ...value.extensions) + } + } + } + + if (schema.privateuse && schema.privateuse.length > 0) { + result.push('x', ...schema.privateuse) + } + + return result.join('-') +} diff --git a/node_modules/bcp-47/license b/node_modules/bcp-47/license new file mode 100644 index 0000000..8d8660d --- /dev/null +++ b/node_modules/bcp-47/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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/bcp-47/package.json b/node_modules/bcp-47/package.json new file mode 100644 index 0000000..8a12183 --- /dev/null +++ b/node_modules/bcp-47/package.json @@ -0,0 +1,85 @@ +{ + "name": "bcp-47", + "version": "2.1.0", + "description": "Parse and stringify BCP 47 language tags", + "license": "MIT", + "keywords": [ + "bcp", + "47", + "bcp47", + "bcp-47", + "language", + "tag", + "parse" + ], + "repository": "wooorm/bcp-47", + "bugs": "https://github.com/wooorm/bcp-47/issues", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + }, + "author": "Titus Wormer (https://wooorm.com)", + "contributors": [ + "Titus Wormer (https://wooorm.com)" + ], + "sideEffects": false, + "type": "module", + "main": "index.js", + "types": "index.d.ts", + "files": [ + "index.d.ts", + "index.js", + "lib/" + ], + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "devDependencies": { + "@types/tape": "^4.0.0", + "c8": "^7.0.0", + "is-hidden": "^2.0.0", + "prettier": "^2.0.0", + "remark-cli": "^10.0.0", + "remark-preset-wooorm": "^9.0.0", + "rimraf": "^3.0.0", + "tape": "^5.0.0", + "type-coverage": "^2.0.0", + "typescript": "^4.0.0", + "xo": "^0.46.0" + }, + "scripts": { + "prepublishOnly": "npm run build && npm run format", + "build": "rimraf \"{lib,test}/**/*.d.ts\" \"*.d.ts\" && tsc && type-coverage", + "format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix", + "test-api": "node --conditions development test/index.js", + "test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov npm run test-api", + "test": "npm run build && npm run format && npm run test-coverage" + }, + "prettier": { + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "bracketSpacing": false, + "semi": false, + "trailingComma": "none" + }, + "xo": { + "prettier": true, + "rules": { + "complexity": "off" + } + }, + "remarkConfig": { + "plugins": [ + "preset-wooorm" + ] + }, + "typeCoverage": { + "atLeast": 100, + "detail": true, + "strict": true, + "ignoreCatch": true + } +} diff --git a/node_modules/bcp-47/readme.md b/node_modules/bcp-47/readme.md new file mode 100644 index 0000000..3e96ac6 --- /dev/null +++ b/node_modules/bcp-47/readme.md @@ -0,0 +1,344 @@ +# bcp-47 + +[![Build][build-badge]][build] +[![Coverage][coverage-badge]][coverage] +[![Downloads][downloads-badge]][downloads] +[![Size][size-badge]][size] + +Parse and stringify [BCP 47][spec] language tags. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`parse(tag[, options])`](#parsetag-options) + * [`stringify(schema)`](#stringifyschema) + * [`Schema`](#schema) + * [`function warning(reason, code, offset)`](#function-warningreason-code-offset) +* [Types](#types) +* [Compatibility](#compatibility) +* [Security](#security) +* [Related](#related) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This is a package that can parse BCP 47 language tags to an object representing +them, and serialize those objects back into language tags. +It supports a forgiving mode to handle incorrect BCP 47 tags and can emit +warnings about problems in incorrect tags. + +## When should I use this? + +You can use this package if you need to access the data stored in BCP 47 +language tags. +You can also use this package if you want to check (lint) or manipulate tags. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install bcp-47 +``` + +In Deno with [Skypack][]: + +```js +import * as bcp47 from 'https://cdn.skypack.dev/bcp-47@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +```js +import {parse, stringify} from 'bcp-47' + +const schema = parse('hy-Latn-IT-arevela') + +console.log(schema) +console.log(stringify(schema)) +``` + +Yields: + +```js +{ language: 'hy', + extendedLanguageSubtags: [], + script: 'Latn', + region: 'IT', + variants: ['arevela'], + extensions: [], + privateuse: [], + irregular: null, + regular: null } +'hy-Latn-IT-arevela' +``` + +## API + +This package exports the following identifiers: `parse` and `stringify`. +There is no default export. + +### `parse(tag[, options])` + +Parse a BCP 47 tag into a language schema. +Note that the algorithm is case insensitive. + +###### `options.normalize` + +Whether to normalize legacy tags when possible (`boolean`, default: +`true`). +For example, `i-klingon` does not match the BCP 47 language algorithm but is +considered valid by BCP 47 nonetheless. +It is suggested to use `tlh` instead (the ISO 639-3 code for Klingon). +When `normalize` is `true`, passing `i-klingon` or other deprecated tags, is +handled as if their suggested valid tag was given instead. + +###### `options.forgiving` + +By default, when an error is encountered, an empty object is returned. +When in forgiving mode, all found values up to the point of the error +are included (`boolean`, default: `false`). +So, for example, where by default `en-GB-abcdefghi` an empty object is returned +(as the language variant is too long), in `forgiving` mode the `language` of +`schema` is populated with `en` and the `region` is populated with `GB`. + +###### `options.warning` + +When given, `warning` is called when an error is encountered +([`Function`][warning]). + +###### Returns + +Parsed BCP 47 language tag ([`Schema`][schema]). + +###### Throws + +When `tag` is `null` or `undefined`. + +### `stringify(schema)` + +Compile a [`schema`][schema] to a BCP 47 language tag. + +###### Returns + +BCP 47 language tag (`string`). + +### `Schema` + +A schema represents a language tag. +A schema is deemed empty when it has neither `language`, `irregular`, `regular`, +nor `privateuse` (where an empty `privateuse` array is handled as no +`privateuse` as well). + +###### `schema.language` + +Two or three character [ISO 639][iso-639] language code, four character reserved +language code, or 5 to 8 (inclusive) characters registered language subtag +(`string`). +For example, `en` (English) or `cmn` (Mandarin Chinese). + +###### `schema.extendedLanguageSubtags` + +Selected three-character [ISO 639][iso-639] codes(`Array`), such as +`yue` in `zh-yue-HK` (Chinese, Cantonese, as used in Hong Kong SAR). + +###### `schema.script` + +Four character [ISO 15924][iso-15924] script code (`string`), such as `Latn` in +`hy-Latn-IT-arevela` (Eastern Armenian written in Latin script, as used in +Italy). + +###### `schema.region` + +Two alphabetical character [ISO 3166-1][iso-3166-1] code or three digit +[UN M49][un-m49] code (`string`). +For example, `CN` in `cmn-Hans-CN` (Mandarin Chinese, Simplified script, as used +in China) or `419` in `es-419` (Spanish as used in Latin America and the +Caribbean). + +###### `schema.variants` + +5 to 8 (inclusive) character language variants (`Array`), such as +`rozaj` and `biske` in `sl-rozaj-biske` (San Giorgio dialect of Resian dialect +of Slovenian). + +###### `schema.extensions` + +List of extensions (`Array`), each an object containing a one character +`singleton`, and a list of `extensions` (`string`). +`singleton` cannot be `x` (case insensitive) and `extensions` must be between +two and eight (inclusive) characters. +For example, an extension would be `u-co-phonebk` in `de-DE-u-co-phonebk` +(German, as used in Germany, using German phonebook sort order), where `u` is +the `singleton` and `co` and `phonebk` are its extensions. + +###### `schema.privateuse` + +List of private-use subtags (`Array`), where each subtag must be between +one and eight (inclusive) characters. + +###### `schema.regular` + +One of the `regular` tags (`string`): tags that are seen as something different +by the algorithm. +Valid values are: + +* `art-lojban` +* `cel-gaulish` +* `no-bok` +* `no-nyn` +* `zh-guoyu` +* `zh-hakka` +* `zh-min` +* `zh-min-nan` +* `zh-xiang` + +###### `schema.irregular` + +One of the `irregular` tags (`string`): tags that are seen as invalid by the +algorithm). +Valid values are: + +* `en-GB-oed` +* `i-ami` +* `i-bnn` +* `i-default` +* `i-enochian` +* `i-hak` +* `i-klingon` +* `i-lux` +* `i-mingo` +* `i-navajo` +* `i-pwn` +* `i-tao` +* `i-tay` +* `i-tsu` +* `sgn-BE-FR` +* `sgn-BE-NL` +* `sgn-CH-DE` + +### `function warning(reason, code, offset)` + +Called when an error occurs. + +###### Parameters + +* `reason` (`string`) + — English reason for failure +* `code` (`number`) + — code for failure +* `offset` (`number`) + — index-based place where the error occurred in the tag + +###### Warnings + +| code | reason | +| :--- | :--------------------------------------------------------------------- | +| 1 | Too long variant, expected at most 8 characters | +| 2 | Too long extension, expected at most 8 characters | +| 3 | Too many extended language subtags, expected at most 3 subtags | +| 4 | Empty extension, extensions must have at least 2 characters of content | +| 5 | Too long private-use area, expected at most 8 characters | +| 6 | Found superfluous content after tag | + +## Types + +This package is fully typed with [TypeScript][]. +It exports additional `Schema`, `Extension`, `Warning`, and `Options` types that +model their respective interfaces. + +## Compatibility + +This package is at least compatible with all maintained versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +It also works in Deno and modern browsers. + +## Security + +This package is safe. + +## Related + +* [`wooorm/bcp-47-match`](https://github.com/wooorm/bcp-47-match) + — match BCP 47 language tags with language ranges per RFC 4647 +* [`wooorm/bcp-47-normalize`](https://github.com/wooorm/bcp-47-normalize) + — normalize, canonicalize, and format BCP 47 tags +* [`wooorm/iso-3166`](https://github.com/wooorm/iso-3166) + — ISO 3166 codes +* [`wooorm/iso-639-2`](https://github.com/wooorm/iso-639-2) + — ISO 639-2 codes +* [`wooorm/iso-639-3`](https://github.com/wooorm/iso-639-3) + — ISO 639-3 codes +* [`wooorm/iso-15924`](https://github.com/wooorm/iso-15924) + — ISO 15924 codes +* [`wooorm/un-m49`](https://github.com/wooorm/un-m49) + — UN M49 codes + +## Contribute + +Yes please! +See [How to Contribute to Open Source][contribute]. + +## License + +[MIT][license] © [Titus Wormer][author] + + + +[build-badge]: https://github.com/wooorm/bcp-47/workflows/main/badge.svg + +[build]: https://github.com/wooorm/bcp-47/actions + +[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/bcp-47.svg + +[coverage]: https://codecov.io/github/wooorm/bcp-47 + +[downloads-badge]: https://img.shields.io/npm/dm/bcp-47.svg + +[downloads]: https://www.npmjs.com/package/bcp-47 + +[size-badge]: https://img.shields.io/bundlephobia/minzip/bcp-47.svg + +[size]: https://bundlephobia.com/result?p=bcp-47 + +[npm]: https://docs.npmjs.com/cli/install + +[skypack]: https://www.skypack.dev + +[license]: license + +[author]: https://wooorm.com + +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[typescript]: https://www.typescriptlang.org + +[contribute]: https://opensource.guide/how-to-contribute/ + +[spec]: https://tools.ietf.org/rfc/bcp/bcp47.html + +[warning]: #function-warningreason-code-offset + +[schema]: #schema + +[iso-639]: https://en.wikipedia.org/wiki/ISO_639 + +[iso-15924]: https://en.wikipedia.org/wiki/ISO_15924 + +[iso-3166-1]: https://en.wikipedia.org/wiki/ISO_3166-1 + +[un-m49]: https://en.wikipedia.org/wiki/UN_M.49 diff --git a/node_modules/binary-extensions/binary-extensions.json b/node_modules/binary-extensions/binary-extensions.json new file mode 100644 index 0000000..ac08048 --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,263 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "afdesign", + "afphoto", + "afpub", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "appimage", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "flatpak", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "odp", + "ods", + "odt", + "oga", + "ogg", + "ogv", + "otf", + "ott", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rpm", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "snap", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" +] diff --git a/node_modules/binary-extensions/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts new file mode 100644 index 0000000..94a248c --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json.d.ts @@ -0,0 +1,3 @@ +declare const binaryExtensionsJson: readonly string[]; + +export = binaryExtensionsJson; diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts new file mode 100644 index 0000000..f469ac5 --- /dev/null +++ b/node_modules/binary-extensions/index.d.ts @@ -0,0 +1,14 @@ +/** +List of binary file extensions. + +@example +``` +import binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` +*/ +declare const binaryExtensions: readonly string[]; + +export = binaryExtensions; diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js new file mode 100644 index 0000000..d46e468 --- /dev/null +++ b/node_modules/binary-extensions/index.js @@ -0,0 +1 @@ +module.exports = require('./binary-extensions.json'); diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license new file mode 100644 index 0000000..5493a1a --- /dev/null +++ b/node_modules/binary-extensions/license @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Paul Miller (https://paulmillr.com) + +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/binary-extensions/package.json b/node_modules/binary-extensions/package.json new file mode 100644 index 0000000..4710c33 --- /dev/null +++ b/node_modules/binary-extensions/package.json @@ -0,0 +1,40 @@ +{ + "name": "binary-extensions", + "version": "2.3.0", + "description": "List of binary file extensions", + "license": "MIT", + "repository": "sindresorhus/binary-extensions", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "sideEffects": false, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "binary-extensions.json", + "binary-extensions.json.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md new file mode 100644 index 0000000..88519b3 --- /dev/null +++ b/node_modules/binary-extensions/readme.md @@ -0,0 +1,25 @@ +# binary-extensions + +> List of binary file extensions + +The list is just a [JSON file](binary-extensions.json) and can be used anywhere. + +## Install + +```sh +npm install binary-extensions +``` + +## Usage + +```js +const binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` + +## Related + +- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file +- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +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/brace-expansion/README.md b/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..6b4e0e1 --- /dev/null +++ b/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +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/brace-expansion/index.js b/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..92a0b6b --- /dev/null +++ b/node_modules/brace-expansion/index.js @@ -0,0 +1,203 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str, options) { + if (!str) + return []; + + options = options || {}; + var max = options.max == null ? Infinity : options.max; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), max, true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, max, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,(?!,).*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str, max, true); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], max, false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, max, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, max, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.max(Math.abs(numeric(n[2])), 1) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y) && N.length < max; i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, max, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length && expansions.length < max; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..ceb54d2 --- /dev/null +++ b/node_modules/brace-expansion/package.json @@ -0,0 +1,50 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "1.1.15", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh", + "bench": "matcha test/perf/bench.js" + }, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "publishConfig": { + "tag": "1.x" + } +} diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE new file mode 100644 index 0000000..9af4a67 --- /dev/null +++ b/node_modules/braces/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-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/braces/README.md b/node_modules/braces/README.md new file mode 100644 index 0000000..f59dd60 --- /dev/null +++ b/node_modules/braces/README.md @@ -0,0 +1,586 @@ +# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) + +> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save braces +``` + +## v3.0.0 Released!! + +See the [changelog](CHANGELOG.md) for details. + +## Why use braces? + +Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. + +- **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) +- **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. +- **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up. +- **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). +- **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). +- [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +- [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` +- [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` +- [Supports escaping](#escaping) - To prevent evaluation of special characters. + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +const braces = require('braces'); +// braces(patterns[, options]); + +console.log(braces(['{01..05}', '{a..e}'])); +//=> ['(0[1-5])', '([a-e])'] + +console.log(braces(['{01..05}', '{a..e}'], { expand: true })); +//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] +``` + +### Brace Expansion vs. Compilation + +By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. + +**Compiled** + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); +//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] +``` + +**Expanded** + +Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): + +```js +console.log(braces('a/{x,y,z}/b', { expand: true })); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] + +console.log(braces.expand('{01..10}')); +//=> ['01','02','03','04','05','06','07','08','09','10'] +``` + +### Lists + +Expand lists (like Bash "sets"): + +```js +console.log(braces('a/{foo,bar,baz}/*.js')); +//=> ['a/(foo|bar|baz)/*.js'] + +console.log(braces.expand('a/{foo,bar,baz}/*.js')); +//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] +``` + +### Sequences + +Expand ranges of characters (like Bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] +console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] +console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] + +// supports zero-padded ranges +console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b'] +console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b'] +``` + +See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. + +### Steppped ranges + +Steps, or increments, may be used with ranges: + +```js +console.log(braces.expand('{2..10..2}')); +//=> ['2', '4', '6', '8', '10'] + +console.log(braces('{2..10..2}')); +//=> ['(2|4|6|8|10)'] +``` + +When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. + +### Nesting + +Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. + +**"Expanded" braces** + +```js +console.log(braces.expand('a{b,c,/{x,y}}/e')); +//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] + +console.log(braces.expand('a/{x,{1..5},y}/c')); +//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] +``` + +**"Optimized" braces** + +```js +console.log(braces('a{b,c,/{x,y}}/e')); +//=> ['a(b|c|/(x|y))/e'] + +console.log(braces('a/{x,{1..5},y}/c')); +//=> ['a/(x|([1-5])|y)/c'] +``` + +### Escaping + +**Escaping braces** + +A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: + +```js +console.log(braces.expand('a\\{d,c,b}e')); +//=> ['a{d,c,b}e'] + +console.log(braces.expand('a{d,c,b\\}e')); +//=> ['a{d,c,b}e'] +``` + +**Escaping commas** + +Commas inside braces may also be escaped: + +```js +console.log(braces.expand('a{b\\,c}d')); +//=> ['a{b,c}d'] + +console.log(braces.expand('a{d\\,c,b}e')); +//=> ['ad,ce', 'abe'] +``` + +**Single items** + +Following bash conventions, a brace pattern is also not expanded when it contains a single character: + +```js +console.log(braces.expand('a{b}c')); +//=> ['a{b}c'] +``` + +## Options + +### options.maxLength + +**Type**: `Number` + +**Default**: `10,000` + +**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. + +```js +console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error +``` + +### options.expand + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', { expand: true })); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Remove duplicates from the returned array. + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `1000` + +**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. + +You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether. + +**Examples** + +```js +// pattern exceeds the "rangeLimit", so it's optimized automatically +console.log(braces.expand('{1..1000}')); +//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] + +// pattern does not exceed "rangeLimit", so it's NOT optimized +console.log(braces.expand('{1..100}')); +//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] +``` + +### options.transform + +**Type**: `Function` + +**Default**: `undefined` + +**Description**: Customize range expansion. + +**Example: Transforming non-numeric values** + +```js +const alpha = braces.expand('x/{a..e}/y', { + transform(value, index) { + // When non-numeric values are passed, "value" is a character code. + return 'foo/' + String.fromCharCode(value) + '-' + index; + }, +}); +console.log(alpha); +//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] +``` + +**Example: Transforming numeric values** + +```js +const numeric = braces.expand('{1..5}', { + transform(value) { + // when numeric values are passed, "value" is a number + return 'foo/' + value * 2; + }, +}); +console.log(numeric); +//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] +``` + +### options.quantifiers + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. + +Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) + +The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. + +**Examples** + +```js +const braces = require('braces'); +console.log(braces('a/b{1,3}/{x,y,z}')); +//=> [ 'a/b(1|3)/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true })); +//=> [ 'a/b{1,3}/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true, expand: true })); +//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] +``` + +### options.keepEscaping + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Do not strip backslashes that were used for escaping from the result. + +## What is "brace expansion"? + +Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). + +In addition to "expansion", braces are also used for matching. In other words: + +- [brace expansion](#brace-expansion) is for generating new lists +- [brace matching](#brace-matching) is for filtering existing lists + +
    +More about brace expansion (click to expand) + +There are two main types of brace expansion: + +1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` +2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". + +Here are some example brace patterns to illustrate how they work: + +**Sets** + +``` +{a,b,c} => a b c +{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 +``` + +**Sequences** + +``` +{1..9} => 1 2 3 4 5 6 7 8 9 +{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 +{1..20..3} => 1 4 7 10 13 16 19 +{a..j} => a b c d e f g h i j +{j..a} => j i h g f e d c b a +{a..z..3} => a d g j m p s v y +``` + +**Combination** + +Sets and sequences can be mixed together or used along with any other strings. + +``` +{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 +foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar +``` + +The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. + +## Brace matching + +In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. + +For example, the pattern `foo/{1..3}/bar` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +``` + +But not: + +``` +baz/1/qux +baz/2/qux +baz/3/qux +``` + +Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` + +## Brace matching pitfalls + +Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. + +### tldr + +**"brace bombs"** + +- brace expansion can eat up a huge amount of processing resources +- as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially +- users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) + +For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. + +### The solution + +Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. + +### Geometric complexity + +At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. + +For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: + +``` +{1,2}{3,4} => (2X2) => 13 14 23 24 +{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 +``` + +But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: + +``` +{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 + 249 257 258 259 267 268 269 347 348 349 357 + 358 359 367 368 369 +``` + +Now, imagine how this complexity grows given that each element is a n-tuple: + +``` +{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) +{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) +``` + +Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. + +**More information** + +Interested in learning more about brace expansion? + +- [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) +- [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) +- [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) + +
    + +## Performance + +Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. + +### Better algorithms + +Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. + +Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. + +**The proof is in the numbers** + +Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. + +| **Pattern** | **braces** | **[minimatch][]** | +| --------------------------- | ------------------- | ---------------------------- | +| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs) | N/A (freezes) | +| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | +| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | +| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | +| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | +| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | +| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | +| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | +| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | +| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | +| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | +| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | +| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | +| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | +| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | +| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | +| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | + +### Faster algorithms + +When you need expansion, braces is still much faster. + +_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ + +| **Pattern** | **braces** | **[minimatch][]** | +| --------------- | --------------------------- | ---------------------------- | +| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | +| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | +| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | +| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | +| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | +| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | +| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | +| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | + +If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). + +## Benchmarks + +### Running benchmarks + +Install dev dependencies: + +```bash +npm i -d && npm benchmark +``` + +### Latest results + +Braces is more accurate, without sacrificing performance. + +```bash +● expand - range (expanded) + braces x 53,167 ops/sec ±0.12% (102 runs sampled) + minimatch x 11,378 ops/sec ±0.10% (102 runs sampled) +● expand - range (optimized for regex) + braces x 373,442 ops/sec ±0.04% (100 runs sampled) + minimatch x 3,262 ops/sec ±0.18% (100 runs sampled) +● expand - nested ranges (expanded) + braces x 33,921 ops/sec ±0.09% (99 runs sampled) + minimatch x 10,855 ops/sec ±0.28% (100 runs sampled) +● expand - nested ranges (optimized for regex) + braces x 287,479 ops/sec ±0.52% (98 runs sampled) + minimatch x 3,219 ops/sec ±0.28% (101 runs sampled) +● expand - set (expanded) + braces x 238,243 ops/sec ±0.19% (97 runs sampled) + minimatch x 538,268 ops/sec ±0.31% (96 runs sampled) +● expand - set (optimized for regex) + braces x 321,844 ops/sec ±0.10% (97 runs sampled) + minimatch x 140,600 ops/sec ±0.15% (100 runs sampled) +● expand - nested sets (expanded) + braces x 165,371 ops/sec ±0.42% (96 runs sampled) + minimatch x 337,720 ops/sec ±0.28% (100 runs sampled) +● expand - nested sets (optimized for regex) + braces x 242,948 ops/sec ±0.12% (99 runs sampled) + minimatch x 87,403 ops/sec ±0.79% (96 runs sampled) +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +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 +``` + +
    + +### Contributors + +| **Commits** | **Contributor** | +| ----------- | ------------------------------------------------------------- | +| 197 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [doowb](https://github.com/doowb) | +| 1 | [es128](https://github.com/es128) | +| 1 | [eush77](https://github.com/eush77) | +| 1 | [hemanth](https://github.com/hemanth) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +- [GitHub Profile](https://github.com/jonschlinkert) +- [Twitter Profile](https://twitter.com/jonschlinkert) +- [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +--- + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js new file mode 100644 index 0000000..d222c13 --- /dev/null +++ b/node_modules/braces/index.js @@ -0,0 +1,170 @@ +'use strict'; + +const stringify = require('./lib/stringify'); +const compile = require('./lib/compile'); +const expand = require('./lib/expand'); +const parse = require('./lib/parse'); + +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +const braces = (input, options = {}) => { + let output = []; + + if (Array.isArray(input)) { + for (const pattern of input) { + const result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); + } + + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = (input, options = {}) => parse(input, options); + +/** + * Creates a braces string from an AST, or an AST node. + * + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); +}; + +/** + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; + +/** + * Expands a brace pattern into an array. This method is called by the + * main [braces](#braces) function when `options.expand` is true. Before + * using this method it's recommended that you read the [performance notes](#performance)) + * and advantages of using [.compile](#compile) instead. + * + * ```js + * const braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + + let result = expand(input, options); + + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } + + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } + + return result; +}; + +/** + * Processes a brace pattern and returns either an expanded array + * (if `options.expand` is true), a highly optimized regex-compatible string. + * This method is called by the main [braces](#braces) function. + * + * ```js + * const braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } + + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; + +/** + * Expose "braces" + */ + +module.exports = braces; diff --git a/node_modules/braces/lib/compile.js b/node_modules/braces/lib/compile.js new file mode 100644 index 0000000..dce69be --- /dev/null +++ b/node_modules/braces/lib/compile.js @@ -0,0 +1,60 @@ +'use strict'; + +const fill = require('fill-range'); +const utils = require('./utils'); + +const compile = (ast, options = {}) => { + const walk = (node, parent = {}) => { + const invalidBlock = utils.isInvalidBrace(parent); + const invalidNode = node.invalid === true && options.escapeInvalid === true; + const invalid = invalidBlock === true || invalidNode === true; + const prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; + + if (node.isOpen === true) { + return prefix + node.value; + } + + if (node.isClose === true) { + console.log('node.isClose', prefix, node.value); + return prefix + node.value; + } + + if (node.type === 'open') { + return invalid ? prefix + node.value : '('; + } + + if (node.type === 'close') { + return invalid ? prefix + node.value : ')'; + } + + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : invalid ? node.value : '|'; + } + + if (node.value) { + return node.value; + } + + if (node.nodes && node.ranges > 0) { + const args = utils.reduce(node.nodes); + const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true }); + + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + + if (node.nodes) { + for (const child of node.nodes) { + output += walk(child, node); + } + } + + return output; + }; + + return walk(ast); +}; + +module.exports = compile; diff --git a/node_modules/braces/lib/constants.js b/node_modules/braces/lib/constants.js new file mode 100644 index 0000000..2bb3b88 --- /dev/null +++ b/node_modules/braces/lib/constants.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports = { + MAX_LENGTH: 10000, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ +}; diff --git a/node_modules/braces/lib/expand.js b/node_modules/braces/lib/expand.js new file mode 100644 index 0000000..35b2c41 --- /dev/null +++ b/node_modules/braces/lib/expand.js @@ -0,0 +1,113 @@ +'use strict'; + +const fill = require('fill-range'); +const stringify = require('./stringify'); +const utils = require('./utils'); + +const append = (queue = '', stash = '', enclose = false) => { + const result = []; + + queue = [].concat(queue); + stash = [].concat(stash); + + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; + } + + for (const item of queue) { + if (Array.isArray(item)) { + for (const value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele); + } + } + } + return utils.flatten(result); +}; + +const expand = (ast, options = {}) => { + const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit; + + const walk = (node, parent = {}) => { + node.queue = []; + + let p = parent; + let q = parent.queue; + + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; + } + + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } + + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; + } + + if (node.nodes && node.ranges > 0) { + const args = utils.reduce(node.nodes); + + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } + + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } + + const enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; + + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; + } + + for (let i = 0; i < node.nodes.length; i++) { + const child = node.nodes[i]; + + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); + continue; + } + + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); + continue; + } + + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); + continue; + } + + if (child.nodes) { + walk(child, node); + } + } + + return queue; + }; + + return utils.flatten(walk(ast)); +}; + +module.exports = expand; diff --git a/node_modules/braces/lib/parse.js b/node_modules/braces/lib/parse.js new file mode 100644 index 0000000..3a6988e --- /dev/null +++ b/node_modules/braces/lib/parse.js @@ -0,0 +1,331 @@ +'use strict'; + +const stringify = require('./stringify'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = require('./constants'); + +/** + * parse + */ + +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + const opts = options || {}; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + + const ast = { type: 'root', input, nodes: [] }; + const stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + const length = input.length; + let index = 0; + let depth = 0; + let value; + + /** + * Helpers + */ + + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; + } + + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; + } + + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; + + push({ type: 'bos' }); + + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); + + /** + * Invalid chars + */ + + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } + + /** + * Escaped chars + */ + + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } + + /** + * Right square bracket (literal): ']' + */ + + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } + + /** + * Left square bracket: '[' + */ + + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + + let next; + + while (index < length && (next = advance())) { + value += next; + + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + + if (brackets === 0) { + break; + } + } + } + + push({ type: 'text', value }); + continue; + } + + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; + } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; + } + + /** + * Quotes: '|"|` + */ + + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + const open = value; + let next; + + if (options.keepQuotes !== true) { + value = ''; + } + + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } + + value += next; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Left curly brace: '{' + */ + + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + + const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + const brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } + + /** + * Right curly brace: '}' + */ + + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } + + const type = 'close'; + block = stack.pop(); + block.close = true; + + push({ type, value }); + depth--; + + block = stack[stack.length - 1]; + continue; + } + + /** + * Comma: ',' + */ + + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + const open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + + push({ type: 'comma', value }); + block.commas++; + continue; + } + + /** + * Dot: '.' + */ + + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + const siblings = block.nodes; + + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } + + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; + + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + + block.ranges++; + block.args = []; + continue; + } + + if (prev.type === 'range') { + siblings.pop(); + + const before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + + push({ type: 'dot', value }); + continue; + } + + /** + * Text + */ + + push({ type: 'text', value }); + } + + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); + + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); + + // get the location of the block on parent.nodes (block's siblings) + const parent = stack[stack.length - 1]; + const index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; diff --git a/node_modules/braces/lib/stringify.js b/node_modules/braces/lib/stringify.js new file mode 100644 index 0000000..8bcf872 --- /dev/null +++ b/node_modules/braces/lib/stringify.js @@ -0,0 +1,32 @@ +'use strict'; + +const utils = require('./utils'); + +module.exports = (ast, options = {}) => { + const stringify = (node, parent = {}) => { + const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + const invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; + + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; + } + return node.value; + } + + if (node.value) { + return node.value; + } + + if (node.nodes) { + for (const child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + + return stringify(ast); +}; + diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js new file mode 100644 index 0000000..d19311f --- /dev/null +++ b/node_modules/braces/lib/utils.js @@ -0,0 +1,122 @@ +'use strict'; + +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); + } + return false; +}; + +/** + * Find a node of the given type + */ + +exports.find = (node, type) => node.nodes.find(node => node.type === type); + +/** + * Find a node of the given type + */ + +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; +}; + +/** + * Escape the given node with '\\' before node.value + */ + +exports.escapeNode = (block, n = 0, type) => { + const node = block.nodes[n]; + if (!node) return; + + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } + } +}; + +/** + * Returns true if the given brace node should be enclosed in literal braces + */ + +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a brace node is invalid. + */ + +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a node is an open or close node + */ + +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; + } + return node.open === true || node.close === true; +}; + +/** + * Reduce an array of text nodes. + */ + +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); + +/** + * Flatten an array + */ + +exports.flatten = (...args) => { + const result = []; + + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + const ele = arr[i]; + + if (Array.isArray(ele)) { + flat(ele); + continue; + } + + if (ele !== undefined) { + result.push(ele); + } + } + return result; + }; + + flat(args); + return result; +}; diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json new file mode 100644 index 0000000..c3c056e --- /dev/null +++ b/node_modules/braces/package.json @@ -0,0 +1,77 @@ +{ + "name": "braces", + "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", + "version": "3.0.3", + "homepage": "https://github.com/micromatch/braces", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Elan Shanker (https://github.com/es128)", + "Eugene Sharygin (https://github.com/eush77)", + "hemanth.hm (http://h3manth.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/braces", + "bugs": { + "url": "https://github.com/micromatch/braces/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "mocha", + "benchmark": "node benchmark" + }, + "dependencies": { + "fill-range": "^7.1.1" + }, + "devDependencies": { + "ansi-colors": "^3.2.4", + "bash-path": "^2.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1" + }, + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "braces", + "expand", + "expansion", + "filepath", + "fill", + "fs", + "glob", + "globbing", + "letter", + "match", + "matches", + "matching", + "number", + "numerical", + "path", + "range", + "ranges", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + }, + "plugins": [ + "gulp-format-md" + ] + } +} diff --git a/node_modules/brotli-size/LICENSE b/node_modules/brotli-size/LICENSE new file mode 100644 index 0000000..853542d --- /dev/null +++ b/node_modules/brotli-size/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Erwin Mombay + +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/brotli-size/README.md b/node_modules/brotli-size/README.md new file mode 100644 index 0000000..3ccec2b --- /dev/null +++ b/node_modules/brotli-size/README.md @@ -0,0 +1,37 @@ +brotli-size + +> Get the brotli compressed size of a string or buffer. + +## Install + +``` +$ npm install --save brotli-size +``` + +## Usage + +```js +var brotliSize = require('brotli-size'); +var str = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam feugiat, mauris non aliquam pretium, libero nulla ultrices lacus, nec varius est purus sit amet dolor.'; + +console.log(str.length); // 165 + +console.log(brotliSize.sync(str)); // 118 +``` + +## API + +### brotliSize.sync(input) + +#### input + +Type: `string`, `buffer` + +### brotliSize.stream() + +Returns a passthrough stream. The stream emits a `brotli-size` event and +has a `brotliSize` property. +## Related + +- [gzip-size](https://github.com/sindresorhus/gzip-size) - Heavily inspired by +this module. Thank you for the inspiration! diff --git a/node_modules/brotli-size/dist/index.d.ts b/node_modules/brotli-size/dist/index.d.ts new file mode 100644 index 0000000..2e8f1fa --- /dev/null +++ b/node_modules/brotli-size/dist/index.d.ts @@ -0,0 +1,35 @@ +/// +import { PassThrough as PassThroughStream } from 'stream'; +export interface BrotliEncodeParams { + mode?: number; + quality?: number; +} +/** + * @param incoming Either a Buffer or string of the value to encode. + * @param options Subset of Encoding Parameters. + * @return Promise that resolves with the encoded Buffer length. + */ +export default function size(incoming: Buffer | string, options?: BrotliEncodeParams): Promise; +/** + * @param incoming Either a Buffer or string of the value to encode. + * @param options Subset of Encoding Parameters. + * @return Length of encoded Buffer. + */ +export declare function sync(incoming: Buffer | string, options?: BrotliEncodeParams): number; +/** + * @param options + * @return PassThroughStream for the contents being compressed + */ +export declare function stream(options?: BrotliEncodeParams): PassThroughStream; +/** + * @param path File Path for the file to compress. + * @param options Subset of Encoding Parameters. + * @return Promise that resolves with size of encoded file. + */ +export declare function file(path: string, options?: BrotliEncodeParams): Promise; +/** + * @param path File Path for the file to compress. + * @param options Subset of Encoding Parameters. + * @return size of encoded file. + */ +export declare function fileSync(path: string, options?: BrotliEncodeParams): number; diff --git a/node_modules/brotli-size/dist/index.js b/node_modules/brotli-size/dist/index.js new file mode 100644 index 0000000..d38c362 --- /dev/null +++ b/node_modules/brotli-size/dist/index.js @@ -0,0 +1,90 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const zlib_1 = require("zlib"); +const stream_1 = require("stream"); +const fs_1 = require("fs"); +const util_1 = require("util"); +const duplexer = require('duplexer'); +const readFilePromise = util_1.promisify(fs_1.readFile); +const bufferFormatter = (incoming) => typeof incoming === 'string' ? Buffer.from(incoming, 'utf8') : incoming; +const optionFormatter = (passed, toEncode) => ({ + params: { + [zlib_1.constants.BROTLI_PARAM_MODE]: passed && 'mode' in passed && passed.mode || zlib_1.constants.BROTLI_DEFAULT_MODE, + [zlib_1.constants.BROTLI_PARAM_QUALITY]: passed && 'quality' in passed && passed.quality || zlib_1.constants.BROTLI_MAX_QUALITY, + [zlib_1.constants.BROTLI_PARAM_SIZE_HINT]: toEncode ? toEncode.byteLength : 0, + } +}); +/** + * @param incoming Either a Buffer or string of the value to encode. + * @param options Subset of Encoding Parameters. + * @return Promise that resolves with the encoded Buffer length. + */ +async function size(incoming, options) { + const buffer = bufferFormatter(incoming); + return new Promise(function (resolve, reject) { + zlib_1.brotliCompress(buffer, optionFormatter(options, buffer), (error, result) => { + if (error !== null) { + reject(error); + } + resolve(result.byteLength); + }); + }); +} +exports.default = size; +/** + * @param incoming Either a Buffer or string of the value to encode. + * @param options Subset of Encoding Parameters. + * @return Length of encoded Buffer. + */ +function sync(incoming, options) { + const buffer = bufferFormatter(incoming); + return zlib_1.brotliCompressSync(buffer, optionFormatter(options, buffer)).byteLength; +} +exports.sync = sync; +/** + * @param options + * @return PassThroughStream for the contents being compressed + */ +function stream(options) { + const input = new stream_1.PassThrough(); + const output = new stream_1.PassThrough(); + const wrapper = duplexer(input, output); + let size = 0; + const brotli = zlib_1.createBrotliCompress(optionFormatter(options)) + .on('data', buf => { + size += buf.length; + }) + .on('error', () => { + wrapper.brotliSize = 0; + }) + .on('end', () => { + wrapper.brotliSize = size; + wrapper.emit('brotli-size', size); + output.end(); + }); + input.pipe(brotli); + input.pipe(output, { end: false }); + return wrapper; +} +exports.stream = stream; +/** + * @param path File Path for the file to compress. + * @param options Subset of Encoding Parameters. + * @return Promise that resolves with size of encoded file. + */ +async function file(path, options) { + const file = await readFilePromise(path); + return (await size(file, options)); +} +exports.file = file; +/** + * @param path File Path for the file to compress. + * @param options Subset of Encoding Parameters. + * @return size of encoded file. + */ +function fileSync(path, options) { + const file = fs_1.readFileSync(path); + return sync(file, options); +} +exports.fileSync = fileSync; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/brotli-size/dist/index.js.map b/node_modules/brotli-size/dist/index.js.map new file mode 100644 index 0000000..a617986 --- /dev/null +++ b/node_modules/brotli-size/dist/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/brotli-size/dist/tsconfig.tsbuildinfo b/node_modules/brotli-size/dist/tsconfig.tsbuildinfo new file mode 100644 index 0000000..1fd0d80 --- /dev/null +++ b/node_modules/brotli-size/dist/tsconfig.tsbuildinfo @@ -0,0 +1,1949 @@ +{ + "program": { + "fileInfos": { + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es5.d.ts": { + "version": "1f753cee573dea40df8a9dc873fef5566957b19ad513874f6643d8dfb14842d0", + "signature": "1f753cee573dea40df8a9dc873fef5566957b19ad513874f6643d8dfb14842d0" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.d.ts": { + "version": "7994d44005046d1413ea31d046577cdda33b8b2470f30281fd9c8b3c99fe2d96", + "signature": "7994d44005046d1413ea31d046577cdda33b8b2470f30281fd9c8b3c99fe2d96" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.d.ts": { + "version": "5f217838d25704474d9ef93774f04164889169ca31475fe423a9de6758f058d1", + "signature": "5f217838d25704474d9ef93774f04164889169ca31475fe423a9de6758f058d1" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.d.ts": { + "version": "459097c7bdd88fc5731367e56591e4f465f2c9de81a35427a7bd473165c34743", + "signature": "459097c7bdd88fc5731367e56591e4f465f2c9de81a35427a7bd473165c34743" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.d.ts": { + "version": "2edd3ddf436ef8e12df876dcae4ecd6a8748577944c477bf4b20d5596e0c9843", + "signature": "2edd3ddf436ef8e12df876dcae4ecd6a8748577944c477bf4b20d5596e0c9843" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.core.d.ts": { + "version": "2a0390a665763bcc90f0670e43c587928d8fefe2a94a11209c1e22cba7b09f52", + "signature": "2a0390a665763bcc90f0670e43c587928d8fefe2a94a11209c1e22cba7b09f52" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.collection.d.ts": { + "version": "dd94d8ef48c562389eb58af8df3a3a34d11367f7c818192aa5f16470d469e3f0", + "signature": "dd94d8ef48c562389eb58af8df3a3a34d11367f7c818192aa5f16470d469e3f0" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.generator.d.ts": { + "version": "828413486bdcaa342558e8e4570b1b287b776cb61b4b70b0214bd10c5d9a94c3", + "signature": "828413486bdcaa342558e8e4570b1b287b776cb61b4b70b0214bd10c5d9a94c3" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.iterable.d.ts": { + "version": "6c9f73334f8bf47aea685ca5b46a8f7e992a223e96fbceb030f26a4d2324ba21", + "signature": "6c9f73334f8bf47aea685ca5b46a8f7e992a223e96fbceb030f26a4d2324ba21" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.promise.d.ts": { + "version": "e6b8ff2798f8ebd7a1c7afd8671f2cb67ee1901c422f5964d74b0b34c6574ea2", + "signature": "e6b8ff2798f8ebd7a1c7afd8671f2cb67ee1901c422f5964d74b0b34c6574ea2" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.proxy.d.ts": { + "version": "5e72f949a89717db444e3bd9433468890068bb21a5638d8ab15a1359e05e54fe", + "signature": "5e72f949a89717db444e3bd9433468890068bb21a5638d8ab15a1359e05e54fe" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.reflect.d.ts": { + "version": "f5b242136ae9bfb1cc99a5971cccc44e99947ae6b5ef6fd8aa54b5ade553b976", + "signature": "f5b242136ae9bfb1cc99a5971cccc44e99947ae6b5ef6fd8aa54b5ade553b976" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.d.ts": { + "version": "9ae2860252d6b5f16e2026d8a2c2069db7b2a3295e98b6031d01337b96437230", + "signature": "9ae2860252d6b5f16e2026d8a2c2069db7b2a3295e98b6031d01337b96437230" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts": { + "version": "3e0a459888f32b42138d5a39f706ff2d55d500ab1031e0988b5568b0f67c2303", + "signature": "3e0a459888f32b42138d5a39f706ff2d55d500ab1031e0988b5568b0f67c2303" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.array.include.d.ts": { + "version": "3f96f1e570aedbd97bf818c246727151e873125d0512e4ae904330286c721bc0", + "signature": "3f96f1e570aedbd97bf818c246727151e873125d0512e4ae904330286c721bc0" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.object.d.ts": { + "version": "ff8ad203e83338289b0f5defc1a5b5c253fb7d251b464db497383f915a0df3f4", + "signature": "ff8ad203e83338289b0f5defc1a5b5c253fb7d251b464db497383f915a0df3f4" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts": { + "version": "b8667586a618c5cf64523d4e500ae39e781428abfb28f3de441fc66b56144b6f", + "signature": "b8667586a618c5cf64523d4e500ae39e781428abfb28f3de441fc66b56144b6f" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.string.d.ts": { + "version": "21df2e0059f14dcb4c3a0e125859f6b6ff01332ee24b0065a741d121250bc71c", + "signature": "21df2e0059f14dcb4c3a0e125859f6b6ff01332ee24b0065a741d121250bc71c" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.intl.d.ts": { + "version": "c1759cb171c7619af0d2234f2f8fb2a871ee88e956e2ed91bb61778e41f272c6", + "signature": "c1759cb171c7619af0d2234f2f8fb2a871ee88e956e2ed91bb61778e41f272c6" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts": { + "version": "28569d59e07d4378cb3d54979c4c60f9f06305c9bb6999ffe6cab758957adc46", + "signature": "28569d59e07d4378cb3d54979c4c60f9f06305c9bb6999ffe6cab758957adc46" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": { + "version": "42102aaeb1bfec213be1e9777466a6d551eeba8567fed18c0cdbca8c35e3c6e4", + "signature": "42102aaeb1bfec213be1e9777466a6d551eeba8567fed18c0cdbca8c35e3c6e4" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.intl.d.ts": { + "version": "1b820b57379c726f94af50cd60053674af53ff9d079c1563cc70071e8b757dd0", + "signature": "1b820b57379c726f94af50cd60053674af53ff9d079c1563cc70071e8b757dd0" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.promise.d.ts": { + "version": "efe049114bad1035b0aa9a4a0359f50ab776e3897c411521e51d3013079cbd62", + "signature": "efe049114bad1035b0aa9a4a0359f50ab776e3897c411521e51d3013079cbd62" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.regexp.d.ts": { + "version": "e7780d04cd4120ee554c665829db2bbdd6b947cbaa3c150b7d9ea74df3beb2e8", + "signature": "e7780d04cd4120ee554c665829db2bbdd6b947cbaa3c150b7d9ea74df3beb2e8" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.intl.d.ts": { + "version": "f6e0c89daaf72eac38dfb1d5ef0972183f7f26a68da15bfe5bcb7cfccf0c7db8", + "signature": "f6e0c89daaf72eac38dfb1d5ef0972183f7f26a68da15bfe5bcb7cfccf0c7db8" + }, + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.bigint.d.ts": { + "version": "63b66918290d794f73832a6d0325be5026236674fe8c0cb0b68d162000d7bbe8", + "signature": "63b66918290d794f73832a6d0325be5026236674fe8c0cb0b68d162000d7bbe8" + }, + "/users/erwinm/dev/brotli-size/src/index.ts": { + "version": "b99f1758ec2cc44f97422ab2573ed424775c30f1ad7cc8117344d097136eb1b2", + "signature": "90836fbf6890c93ee5146022df114d971229c398a1af890549f6613c7a2d10a4" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/events/index.d.ts": { + "version": "400db42c3a46984118bff14260d60cec580057dc1ab4c2d7310beb643e4f5935", + "signature": "400db42c3a46984118bff14260d60cec580057dc1ab4c2d7310beb643e4f5935" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts": { + "version": "e4461b72726848da76a31153b6b01af5e0be3b08dbfa2ec5741ad302eb20f2ed", + "signature": "e4461b72726848da76a31153b6b01af5e0be3b08dbfa2ec5741ad302eb20f2ed" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/assert.d.ts": { + "version": "58a52f282f1dad18179023804c1f3a7536bf875748a0a314abd43f60fd5b244f", + "signature": "58a52f282f1dad18179023804c1f3a7536bf875748a0a314abd43f60fd5b244f" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts": { + "version": "1305b079a057355f496bdde048716189178877a6b4fe0e9267a46af67f8c7561", + "signature": "1305b079a057355f496bdde048716189178877a6b4fe0e9267a46af67f8c7561" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/buffer.d.ts": { + "version": "61215c1a376bbe8f51cab4cc4ddbf3746387015113c37a84d981d4738c21b878", + "signature": "61215c1a376bbe8f51cab4cc4ddbf3746387015113c37a84d981d4738c21b878" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts": { + "version": "123366127434e33eade36f3d06653dbc7457397fc93cfdd100776cfc12b6734c", + "signature": "123366127434e33eade36f3d06653dbc7457397fc93cfdd100776cfc12b6734c" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/cluster.d.ts": { + "version": "ce629710e5e58724902b753212e97861fd73e2aa09f5d88cb6d55dc763cf8c8a", + "signature": "ce629710e5e58724902b753212e97861fd73e2aa09f5d88cb6d55dc763cf8c8a" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/console.d.ts": { + "version": "525c8fc510d9632d2a0a9de2d41c3ac1cdd79ff44d3b45c6d81cacabb683528d", + "signature": "525c8fc510d9632d2a0a9de2d41c3ac1cdd79ff44d3b45c6d81cacabb683528d" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/constants.d.ts": { + "version": "8ce9418c78d3c1fb703ddbe38c936d34a989ba278666979826590dfa0772a424", + "signature": "8ce9418c78d3c1fb703ddbe38c936d34a989ba278666979826590dfa0772a424" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts": { + "version": "77c1fb6a190212f87a5edb26351d419c31dff1992c48707540cdcf812e4655f1", + "signature": "77c1fb6a190212f87a5edb26351d419c31dff1992c48707540cdcf812e4655f1" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dgram.d.ts": { + "version": "7954df44c35d39b851b996fdc1af0a252e4e23f862abfef388a058203bb94c30", + "signature": "7954df44c35d39b851b996fdc1af0a252e4e23f862abfef388a058203bb94c30" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts": { + "version": "ef226a42de7022eacdfa0f15aabf73b46c47af93044c8ebfab8aa8e3cf6c330c", + "signature": "ef226a42de7022eacdfa0f15aabf73b46c47af93044c8ebfab8aa8e3cf6c330c" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/domain.d.ts": { + "version": "d5b7c8819ce1bd31a45f7675309e145ec28e3aa1b60a8e0637fd0e8916255baa", + "signature": "d5b7c8819ce1bd31a45f7675309e145ec28e3aa1b60a8e0637fd0e8916255baa" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts": { + "version": "0be551fde848d5adde38731272ee980bda2bde0f8bf2a76ce99e01b86985546c", + "signature": "0be551fde848d5adde38731272ee980bda2bde0f8bf2a76ce99e01b86985546c" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts": { + "version": "6bd120d96313412155ae7d4766d586a38576a058b3e269be2152db7030fbc882", + "signature": "6bd120d96313412155ae7d4766d586a38576a058b3e269be2152db7030fbc882" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts": { + "version": "db6de49919cf11a300f9203371d8e251d58558c509b3b92cee3badadfdb34d36", + "signature": "db6de49919cf11a300f9203371d8e251d58558c509b3b92cee3badadfdb34d36" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http2.d.ts": { + "version": "745494f14a9e133beee622ca51cdc59c8896ff77c9f3cd017a4ce735b30dac2d", + "signature": "745494f14a9e133beee622ca51cdc59c8896ff77c9f3cd017a4ce735b30dac2d" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts": { + "version": "dacbe08610729f6343ea9880ea8e737c6d7a6efa4a318d8f6acaf85db4aceed6", + "signature": "dacbe08610729f6343ea9880ea8e737c6d7a6efa4a318d8f6acaf85db4aceed6" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/inspector.d.ts": { + "version": "4218ced3933a31eed1278d350dd63c5900df0f0904f57d61c054d7a4b83dbe4c", + "signature": "4218ced3933a31eed1278d350dd63c5900df0f0904f57d61c054d7a4b83dbe4c" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/module.d.ts": { + "version": "03394bf8deb8781b490ae9266a843fbdf00647947d79e25fcbf1d89a9e9c8a66", + "signature": "03394bf8deb8781b490ae9266a843fbdf00647947d79e25fcbf1d89a9e9c8a66" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts": { + "version": "1224b49e2c8f3b4ed618969d2989412d1282536d2a6a31c30c84d5da01d8b8e4", + "signature": "1224b49e2c8f3b4ed618969d2989412d1282536d2a6a31c30c84d5da01d8b8e4" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/os.d.ts": { + "version": "1a6016bd905855b2b45881e9edbd7ab8c7175f8bcbb711ff06989c4bcdc75486", + "signature": "1a6016bd905855b2b45881e9edbd7ab8c7175f8bcbb711ff06989c4bcdc75486" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/path.d.ts": { + "version": "5fb30076f0e0e5744db8993648bfb67aadd895f439edad5cce039127a87a8a36", + "signature": "5fb30076f0e0e5744db8993648bfb67aadd895f439edad5cce039127a87a8a36" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/perf_hooks.d.ts": { + "version": "27ef4001526ee9d8afa57687a60bb3b59c52b32d29db0a2260094ab64726164f", + "signature": "27ef4001526ee9d8afa57687a60bb3b59c52b32d29db0a2260094ab64726164f" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/process.d.ts": { + "version": "3a8848a9c307429b861402cc69bc472ffe0c05b86474fc158723169161e16389", + "signature": "3a8848a9c307429b861402cc69bc472ffe0c05b86474fc158723169161e16389" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/punycode.d.ts": { + "version": "30ec6f9c683b988c3cfaa0c4690692049c4e7ed7dc6f6e94f56194c06b86f5e1", + "signature": "30ec6f9c683b988c3cfaa0c4690692049c4e7ed7dc6f6e94f56194c06b86f5e1" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts": { + "version": "e0070c45bf15b872f58eee948f71ad6f4f424f36330b2477753fc1aed3ece36e", + "signature": "e0070c45bf15b872f58eee948f71ad6f4f424f36330b2477753fc1aed3ece36e" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts": { + "version": "0870ded99753a8561f19452466e7d094f122ef12960024946ea45d8694693f54", + "signature": "0870ded99753a8561f19452466e7d094f122ef12960024946ea45d8694693f54" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/repl.d.ts": { + "version": "65dbe15ed8a8ed5d4707a63868178dc38111cfc06de28a2e50713ca017a9c157", + "signature": "65dbe15ed8a8ed5d4707a63868178dc38111cfc06de28a2e50713ca017a9c157" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts": { + "version": "2350c09d0121a0b22c386a7bb8436d521b444c6b4b3e6ee37197d08a23f3b9dd", + "signature": "2350c09d0121a0b22c386a7bb8436d521b444c6b4b3e6ee37197d08a23f3b9dd" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/string_decoder.d.ts": { + "version": "7e62aac2cc9c0710d772047ad89e8d7117f52592c791eb995ce1f865fedab432", + "signature": "7e62aac2cc9c0710d772047ad89e8d7117f52592c791eb995ce1f865fedab432" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/timers.d.ts": { + "version": "b40652bf8ce4a18133b31349086523b219724dca8df3448c1a0742528e7ad5b9", + "signature": "b40652bf8ce4a18133b31349086523b219724dca8df3448c1a0742528e7ad5b9" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts": { + "version": "af5f07deb33b2fb92ef67ea5ebb69670b81c74908b646e7cd4361a331d2a558a", + "signature": "af5f07deb33b2fb92ef67ea5ebb69670b81c74908b646e7cd4361a331d2a558a" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/trace_events.d.ts": { + "version": "978aecd2e6bc2ac094e9a35eda98ff8586713857b3655e7c98ca5ed8f7d50662", + "signature": "978aecd2e6bc2ac094e9a35eda98ff8586713857b3655e7c98ca5ed8f7d50662" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tty.d.ts": { + "version": "08261bfa763b8cd7fa74c06debf70ee22268c299a18e5dc7c48736bc352be007", + "signature": "08261bfa763b8cd7fa74c06debf70ee22268c299a18e5dc7c48736bc352be007" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts": { + "version": "1e3da92862604b1f7a32265169f9aa712c4567742d42597704e04ae3e07019e7", + "signature": "1e3da92862604b1f7a32265169f9aa712c4567742d42597704e04ae3e07019e7" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts": { + "version": "0f6382d5032e45eec50b8f6c1e18c77544bc4db2ef8f854d196b254ec16add12", + "signature": "0f6382d5032e45eec50b8f6c1e18c77544bc4db2ef8f854d196b254ec16add12" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/v8.d.ts": { + "version": "e98d697adf809fc14dc88ed4e00e4f0e0e381ca23d6d9320cf01af87e801f725", + "signature": "e98d697adf809fc14dc88ed4e00e4f0e0e381ca23d6d9320cf01af87e801f725" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts": { + "version": "ad20b1311e55187f8eeefdd282a02dbc70e5ac0cf8ab4cabae99c142b32cc562", + "signature": "ad20b1311e55187f8eeefdd282a02dbc70e5ac0cf8ab4cabae99c142b32cc562" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/worker_threads.d.ts": { + "version": "7780573ed8387aaadcc61d87f3d60d77dabf1e060da252dc72ab1d73401988bb", + "signature": "7780573ed8387aaadcc61d87f3d60d77dabf1e060da252dc72ab1d73401988bb" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts": { + "version": "2ffd50644d73fc1fa59c69d48859b6c843d3604609d7353725b6d2b001f05a2b", + "signature": "2ffd50644d73fc1fa59c69d48859b6c843d3604609d7353725b6d2b001f05a2b" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/base.d.ts": { + "version": "6622f76993bdfeaacb947ba7c4cf26f2e5c5194194d02d792c3cba4174cd8fce", + "signature": "6622f76993bdfeaacb947ba7c4cf26f2e5c5194194d02d792c3cba4174cd8fce" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts": { + "version": "4f54f0a9dd3b644c99ec32b32f8804d5978bc854799b228ae9c467bf3c84c64c", + "signature": "4f54f0a9dd3b644c99ec32b32f8804d5978bc854799b228ae9c467bf3c84c64c" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/globals.d.ts": { + "version": "4926e99d2ad39c0bbd36f2d37cc8f52756bc7a5661ad7b12815df871a4b07ba1", + "signature": "4926e99d2ad39c0bbd36f2d37cc8f52756bc7a5661ad7b12815df871a4b07ba1" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts": { + "version": "765fc34423b93c2ab763670d8d11d99e5f47387c13c161d6f1640dd6d91b7d1c", + "signature": "765fc34423b93c2ab763670d8d11d99e5f47387c13c161d6f1640dd6d91b7d1c" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/minimatch/index.d.ts": { + "version": "1d1e6bd176eee5970968423d7e215bfd66828b6db8d54d17afec05a831322633", + "signature": "1d1e6bd176eee5970968423d7e215bfd66828b6db8d54d17afec05a831322633" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/glob/index.d.ts": { + "version": "d852d6282c8dc8156d26d6bda83ab4bde51fee05ba2fe0ecdc165ddda009d3ee", + "signature": "d852d6282c8dc8156d26d6bda83ab4bde51fee05ba2fe0ecdc165ddda009d3ee" + }, + "/users/erwinm/dev/brotli-size/node_modules/@types/normalize-package-data/index.d.ts": { + "version": "c9ad058b2cc9ce6dc2ed92960d6d009e8c04bef46d3f5312283debca6869f613", + "signature": "c9ad058b2cc9ce6dc2ed92960d6d009e8c04bef46d3f5312283debca6869f613" + }, + "/users/erwinm/dev/node_modules/@types/connect/index.d.ts": { + "version": "c3be42b83b5f57ae2f65280fa395f6d31f61304ac1a29b7b406b6a0e71da8c82", + "signature": "c3be42b83b5f57ae2f65280fa395f6d31f61304ac1a29b7b406b6a0e71da8c82" + }, + "/users/erwinm/dev/node_modules/@types/body-parser/index.d.ts": { + "version": "1b7919dbb6b43ff272f38f6f6522fb9f4e9e854356b2932a36aa4674f4a2fcf2", + "signature": "1b7919dbb6b43ff272f38f6f6522fb9f4e9e854356b2932a36aa4674f4a2fcf2" + }, + "/users/erwinm/dev/node_modules/@types/caseless/index.d.ts": { + "version": "621c939dd665f42a4d7d531d97d5cc793c5886029e9335a31451f895e867154a", + "signature": "621c939dd665f42a4d7d531d97d5cc793c5886029e9335a31451f895e867154a" + }, + "/users/erwinm/dev/node_modules/@types/events/index.d.ts": { + "version": "acc248b90a16d95f2c53b598927967497ed4da2a7e6c9fc6006c5ed9dee25fd7", + "signature": "acc248b90a16d95f2c53b598927967497ed4da2a7e6c9fc6006c5ed9dee25fd7" + }, + "/users/erwinm/dev/node_modules/@types/range-parser/index.d.ts": { + "version": "da3d536653bd97a22e8b2075e7871cb68b421fa531a699bf503519390f913974", + "signature": "da3d536653bd97a22e8b2075e7871cb68b421fa531a699bf503519390f913974" + }, + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts": { + "version": "4da217e475298c668851d3730378aa6e2e19777c1d2a3cd5ddcb8b9183d4a8f2", + "signature": "4da217e475298c668851d3730378aa6e2e19777c1d2a3cd5ddcb8b9183d4a8f2" + }, + "/users/erwinm/dev/node_modules/@types/mime/index.d.ts": { + "version": "0011751bdb49b3f408ab26b7bb51c4ab63e72dcc3fea4327efd9049601d88cb3", + "signature": "0011751bdb49b3f408ab26b7bb51c4ab63e72dcc3fea4327efd9049601d88cb3" + }, + "/users/erwinm/dev/node_modules/@types/serve-static/index.d.ts": { + "version": "b27dd918d8c3f10270cadea529c69e3a9b37ce59db0852945a39068cc5c10fff", + "signature": "b27dd918d8c3f10270cadea529c69e3a9b37ce59db0852945a39068cc5c10fff" + }, + "/users/erwinm/dev/node_modules/@types/express/index.d.ts": { + "version": "90a21629af2bfe9117cd964fbc89cbdafa3565bee40d2d0c00ae9b24b3895ece", + "signature": "90a21629af2bfe9117cd964fbc89cbdafa3565bee40d2d0c00ae9b24b3895ece" + }, + "/users/erwinm/dev/node_modules/@types/cors/index.d.ts": { + "version": "81daacad7019267800ee5ef207fbca95b158c8088ca6b4f98cb3159564808ebc", + "signature": "81daacad7019267800ee5ef207fbca95b158c8088ca6b4f98cb3159564808ebc" + }, + "/users/erwinm/dev/node_modules/@types/form-data/index.d.ts": { + "version": "55f4b87f27e4f2fac4820e2c822f6476dea04317b695c1f3f9fa94a386a6e456", + "signature": "55f4b87f27e4f2fac4820e2c822f6476dea04317b695c1f3f9fa94a386a6e456" + }, + "/users/erwinm/dev/node_modules/@types/tough-cookie/index.d.ts": { + "version": "1e0564e22286aed7fa63829228c4c6680ff9e2a00e0aa55ab4a57c225d599811", + "signature": "1e0564e22286aed7fa63829228c4c6680ff9e2a00e0aa55ab4a57c225d599811" + }, + "/users/erwinm/dev/node_modules/@types/request/index.d.ts": { + "version": "bf09b736d635a19764d674f8c07d8d5d87550b1ad5b78777b84e8d8637520259", + "signature": "bf09b736d635a19764d674f8c07d8d5d87550b1ad5b78777b84e8d8637520259" + }, + "/users/erwinm/dev/node_modules/@types/google-cloud__storage/index.d.ts": { + "version": "57f9cd1f2bf2855319709c3d461fd15a4616216020247b5de646a13a2ffa13b9", + "signature": "57f9cd1f2bf2855319709c3d461fd15a4616216020247b5de646a13a2ffa13b9" + }, + "/users/erwinm/dev/node_modules/@types/jsonwebtoken/index.d.ts": { + "version": "3ee1c4479498ce568cf7789174c181a68a7f7f16f7b338132ded0daf24a8a971", + "signature": "3ee1c4479498ce568cf7789174c181a68a7f7f16f7b338132ded0daf24a8a971" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts": { + "version": "34d4e49fb6a233df0592edeac9fecd45cf1d8e5e7ce449d5723d6d942a23e1ad", + "signature": "34d4e49fb6a233df0592edeac9fecd45cf1d8e5e7ce449d5723d6d942a23e1ad" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts": { + "version": "24f73778cc712f3d2ff4b69227957577487118bd41652b63c5f913ba12f7631a", + "signature": "24f73778cc712f3d2ff4b69227957577487118bd41652b63c5f913ba12f7631a" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts": { + "version": "8de0ccabecb272b69ad77054b4ddd3e9099ba34bf68846de4cc043278b0236c8", + "signature": "8de0ccabecb272b69ad77054b4ddd3e9099ba34bf68846de4cc043278b0236c8" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts": { + "version": "6e88e36ca6d6953fde31898701899e61239b22f09906d5970caac88107a4b01a", + "signature": "6e88e36ca6d6953fde31898701899e61239b22f09906d5970caac88107a4b01a" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts": { + "version": "8d0b0656ffc2f973bdea853fc00a3f99122db54fd7a0e13bf87d6f358fbc3c6e", + "signature": "8d0b0656ffc2f973bdea853fc00a3f99122db54fd7a0e13bf87d6f358fbc3c6e" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts": { + "version": "aab4483e495e5fa9865b69b03f96e46b52c0eaeba9275a1f6ce3c620daf90b8f", + "signature": "aab4483e495e5fa9865b69b03f96e46b52c0eaeba9275a1f6ce3c620daf90b8f" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts": { + "version": "90e654b460f8ff7a3ff73ec54996290afebf00c8acc0fc634961af1509416db5", + "signature": "90e654b460f8ff7a3ff73ec54996290afebf00c8acc0fc634961af1509416db5" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts": { + "version": "81fdef0cbc4aeed4e29f7ed43d7b768ebe39e068da55c95bd710f47be289d6ac", + "signature": "81fdef0cbc4aeed4e29f7ed43d7b768ebe39e068da55c95bd710f47be289d6ac" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts": { + "version": "17d66f8a355e76a5a1ee0a82e3428541abdebe80db47f93586a21a2cd79d89bc", + "signature": "17d66f8a355e76a5a1ee0a82e3428541abdebe80db47f93586a21a2cd79d89bc" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts": { + "version": "e4db201366aed6e8ec28c4f9e998729477b0825ae7e517441e8000f192b8b033", + "signature": "e4db201366aed6e8ec28c4f9e998729477b0825ae7e517441e8000f192b8b033" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts": { + "version": "20fb7144dd7a3e5007cc44e96c843879216fd082bf5761bd420715d645eb683e", + "signature": "20fb7144dd7a3e5007cc44e96c843879216fd082bf5761bd420715d645eb683e" + }, + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts": { + "version": "026742bab94860543fde035a6bfd5d5103fab08afbdacf9a207a44b2bb6fccba", + "signature": "026742bab94860543fde035a6bfd5d5103fab08afbdacf9a207a44b2bb6fccba" + }, + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts": { + "version": "4b0129cc010964d404b46ab0ecc2017e29e61be7f243a2f4b8633de40c6bf632", + "signature": "4b0129cc010964d404b46ab0ecc2017e29e61be7f243a2f4b8633de40c6bf632" + }, + "/users/erwinm/dev/node_modules/@types/long/index.d.ts": { + "version": "d32ef7739402db3a15640222d047f0044e8e9a09ee123d49e8f57f3c66c2a732", + "signature": "d32ef7739402db3a15640222d047f0044e8e9a09ee123d49e8f57f3c66c2a732" + } + }, + "options": { + "declaration": true, + "lib": [ + "lib.es2017.d.ts" + ], + "outDir": "/Users/erwinm/dev/brotli-size/dist", + "sourceMap": true, + "moduleResolution": 2, + "target": 8, + "module": 1, + "allowJs": false, + "noUnusedLocals": true, + "strictNullChecks": true, + "noImplicitAny": true, + "noImplicitThis": true, + "alwaysStrict": true, + "incremental": true, + "project": "tsconfig.json", + "configFilePath": "/Users/erwinm/dev/brotli-size/tsconfig.json" + }, + "referencedMap": { + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es5.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.core.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.collection.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.generator.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.iterable.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.promise.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.proxy.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.reflect.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.array.include.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.object.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.string.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.intl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.intl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.promise.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.regexp.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.intl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.bigint.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/src/index.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/events/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/assert.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/buffer.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/cluster.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/console.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/constants.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dgram.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/domain.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http2.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/inspector.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/module.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/os.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/path.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/perf_hooks.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/process.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/punycode.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/repl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/string_decoder.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/timers.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/trace_events.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tty.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/v8.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/worker_threads.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/base.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/assert.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/buffer.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/cluster.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/console.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/constants.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dgram.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/domain.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http2.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/inspector.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/module.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/os.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/path.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/perf_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/punycode.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/repl.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/string_decoder.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/timers.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/trace_events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tty.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/v8.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/worker_threads.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/globals.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/base.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/minimatch/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/glob/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/minimatch/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/normalize-package-data/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/connect/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/body-parser/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/connect/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/caseless/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/events/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/range-parser/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/node_modules/@types/range-parser/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/mime/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/serve-static/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts", + "/users/erwinm/dev/node_modules/@types/mime/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/express/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/body-parser/index.d.ts", + "/users/erwinm/dev/node_modules/@types/serve-static/index.d.ts", + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/cors/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/express/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/form-data/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/tough-cookie/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/request/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/caseless/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/node_modules/@types/form-data/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/node_modules/@types/tough-cookie/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/google-cloud__storage/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/node_modules/@types/request/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/jsonwebtoken/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/long/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ] + }, + "exportedModulesMap": { + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es5.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.core.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.collection.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.generator.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.iterable.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.promise.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.proxy.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.reflect.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.array.include.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.object.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.string.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.intl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.intl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.promise.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.regexp.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.intl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.bigint.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/src/index.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/events/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/assert.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/buffer.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/cluster.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/console.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/constants.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dgram.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/domain.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http2.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/inspector.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/module.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/os.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/path.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/perf_hooks.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/process.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/punycode.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/repl.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/string_decoder.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/timers.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/trace_events.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tty.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/v8.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/worker_threads.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/base.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/assert.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/buffer.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/cluster.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/console.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/constants.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dgram.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/domain.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http2.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/inspector.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/module.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/os.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/path.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/perf_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/punycode.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/repl.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/string_decoder.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/timers.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/trace_events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tty.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/v8.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/worker_threads.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/globals.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/base.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/minimatch/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/glob/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/minimatch/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/brotli-size/node_modules/@types/normalize-package-data/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/connect/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/body-parser/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/connect/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/caseless/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/events/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/range-parser/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/node_modules/@types/range-parser/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/mime/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/serve-static/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts", + "/users/erwinm/dev/node_modules/@types/mime/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/express/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/body-parser/index.d.ts", + "/users/erwinm/dev/node_modules/@types/serve-static/index.d.ts", + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/cors/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/express/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/form-data/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/tough-cookie/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/request/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/caseless/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/node_modules/@types/form-data/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/node_modules/@types/tough-cookie/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/google-cloud__storage/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/node_modules/@types/request/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/jsonwebtoken/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts": [ + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ], + "/users/erwinm/dev/node_modules/@types/long/index.d.ts": [ + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es5.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.core.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.object.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.string.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.intl.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/typescript/lib/lib.esnext.bigint.d.ts", + "/users/erwinm/dev/brotli-size/src/index.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/events/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/assert.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/async_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/buffer.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/child_process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/cluster.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/console.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/constants.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/crypto.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dgram.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/dns.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/domain.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/fs.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/http2.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/https.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/inspector.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/module.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/net.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/os.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/path.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/perf_hooks.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/process.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/punycode.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/querystring.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/readline.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/repl.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/stream.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/string_decoder.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/timers.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tls.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/trace_events.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/tty.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/url.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/v8.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/vm.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/worker_threads.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/zlib.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/base.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/util.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/globals.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/node/ts3.2/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/minimatch/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/glob/index.d.ts", + "/users/erwinm/dev/brotli-size/node_modules/@types/normalize-package-data/index.d.ts", + "/users/erwinm/dev/node_modules/@types/connect/index.d.ts", + "/users/erwinm/dev/node_modules/@types/body-parser/index.d.ts", + "/users/erwinm/dev/node_modules/@types/caseless/index.d.ts", + "/users/erwinm/dev/node_modules/@types/events/index.d.ts", + "/users/erwinm/dev/node_modules/@types/range-parser/index.d.ts", + "/users/erwinm/dev/node_modules/@types/express-serve-static-core/index.d.ts", + "/users/erwinm/dev/node_modules/@types/mime/index.d.ts", + "/users/erwinm/dev/node_modules/@types/serve-static/index.d.ts", + "/users/erwinm/dev/node_modules/@types/express/index.d.ts", + "/users/erwinm/dev/node_modules/@types/cors/index.d.ts", + "/users/erwinm/dev/node_modules/@types/form-data/index.d.ts", + "/users/erwinm/dev/node_modules/@types/tough-cookie/index.d.ts", + "/users/erwinm/dev/node_modules/@types/request/index.d.ts", + "/users/erwinm/dev/node_modules/@types/google-cloud__storage/index.d.ts", + "/users/erwinm/dev/node_modules/@types/jsonwebtoken/index.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/common.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/array.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/collection.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/date.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/function.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/lang.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/math.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/number.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/object.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/seq.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/string.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/common/util.d.ts", + "/users/erwinm/dev/node_modules/@types/lodash/index.d.ts", + "/users/erwinm/dev/node_modules/@types/long/index.d.ts" + ] + }, + "version": "3.5.2" +} \ No newline at end of file diff --git a/node_modules/brotli-size/package.json b/node_modules/brotli-size/package.json new file mode 100644 index 0000000..477d08c --- /dev/null +++ b/node_modules/brotli-size/package.json @@ -0,0 +1,40 @@ +{ + "name": "brotli-size", + "version": "4.0.0", + "description": "Get the brotli compressed size of a string or buffer", + "license": "MIT", + "repository": "erwinmombay/brotli-size", + "main": "dist/index.js", + "author": { + "name": "Erwin Mombay", + "email": "erwin.mombay@gmail.com" + }, + "engines": { + "node": ">= 10.16.0" + }, + "scripts": { + "build": "tsc -p tsconfig.json", + "pretest": "npm run build", + "test": "ava -v", + "release": "np", + "prepublishOnly": "npm run build" + }, + "files": [ + "dist" + ], + "keywords": [ + "size", + "tool", + "brotli", + "compressed" + ], + "dependencies": { + "duplexer": "0.1.1" + }, + "devDependencies": { + "@types/node": "12.7.1", + "ava": "2.2.0", + "np": "5.0.3", + "typescript": "3.5.2" + } +} diff --git a/node_modules/chokidar/LICENSE b/node_modules/chokidar/LICENSE new file mode 100644 index 0000000..fa9162b --- /dev/null +++ b/node_modules/chokidar/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker + +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/chokidar/README.md b/node_modules/chokidar/README.md new file mode 100644 index 0000000..8e25dec --- /dev/null +++ b/node_modules/chokidar/README.md @@ -0,0 +1,308 @@ +# Chokidar [![Weekly downloads](https://img.shields.io/npm/dw/chokidar.svg)](https://github.com/paulmillr/chokidar) [![Yearly downloads](https://img.shields.io/npm/dy/chokidar.svg)](https://github.com/paulmillr/chokidar) + +> Minimal and efficient cross-platform file watching library + +[![NPM](https://nodei.co/npm/chokidar.png)](https://www.npmjs.com/package/chokidar) + +## Why? + +Node.js `fs.watch`: + +* Doesn't report filenames on MacOS. +* Doesn't report events at all when using editors like Sublime on MacOS. +* Often reports events twice. +* Emits most changes as `rename`. +* Does not provide an easy way to recursively watch file trees. +* Does not support recursive watching on Linux. + +Node.js `fs.watchFile`: + +* Almost as bad at event handling. +* Also does not provide any recursive watching. +* Results in high CPU utilization. + +Chokidar resolves these problems. + +Initially made for **[Brunch](https://brunch.io/)** (an ultra-swift web app build tool), it is now used in +[Microsoft's Visual Studio Code](https://github.com/microsoft/vscode), +[gulp](https://github.com/gulpjs/gulp/), +[karma](https://karma-runner.github.io/), +[PM2](https://github.com/Unitech/PM2), +[browserify](http://browserify.org/), +[webpack](https://webpack.github.io/), +[BrowserSync](https://www.browsersync.io/), +and [many others](https://www.npmjs.com/browse/depended/chokidar). +It has proven itself in production environments. + +Version 3 is out! Check out our blog post about it: [Chokidar 3: How to save 32TB of traffic every week](https://paulmillr.com/posts/chokidar-3-save-32tb-of-traffic/) + +## How? + +Chokidar does still rely on the Node.js core `fs` module, but when using +`fs.watch` and `fs.watchFile` for watching, it normalizes the events it +receives, often checking for truth by getting file stats and/or dir contents. + +On MacOS, chokidar by default uses a native extension exposing the Darwin +`FSEvents` API. This provides very efficient recursive watching compared with +implementations like `kqueue` available on most \*nix platforms. Chokidar still +does have to do some work to normalize the events received that way as well. + +On most other platforms, the `fs.watch`-based implementation is the default, which +avoids polling and keeps CPU usage down. Be advised that chokidar will initiate +watchers recursively for everything within scope of the paths that have been +specified, so be judicious about not wasting system resources by watching much +more than needed. + +## Getting started + +Install with npm: + +```sh +npm install chokidar +``` + +Then `require` and use it in your code: + +```javascript +const chokidar = require('chokidar'); + +// One-liner for current directory +chokidar.watch('.').on('all', (event, path) => { + console.log(event, path); +}); +``` + +## API + +```javascript +// Example of a more typical implementation structure + +// Initialize watcher. +const watcher = chokidar.watch('file, dir, glob, or array', { + ignored: /(^|[\/\\])\../, // ignore dotfiles + persistent: true +}); + +// Something to use when events are received. +const log = console.log.bind(console); +// Add event listeners. +watcher + .on('add', path => log(`File ${path} has been added`)) + .on('change', path => log(`File ${path} has been changed`)) + .on('unlink', path => log(`File ${path} has been removed`)); + +// More possible events. +watcher + .on('addDir', path => log(`Directory ${path} has been added`)) + .on('unlinkDir', path => log(`Directory ${path} has been removed`)) + .on('error', error => log(`Watcher error: ${error}`)) + .on('ready', () => log('Initial scan complete. Ready for changes')) + .on('raw', (event, path, details) => { // internal + log('Raw event info:', event, path, details); + }); + +// 'add', 'addDir' and 'change' events also receive stat() results as second +// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats +watcher.on('change', (path, stats) => { + if (stats) console.log(`File ${path} changed size to ${stats.size}`); +}); + +// Watch new files. +watcher.add('new-file'); +watcher.add(['new-file-2', 'new-file-3', '**/other-file*']); + +// Get list of actual paths being watched on the filesystem +var watchedPaths = watcher.getWatched(); + +// Un-watch some files. +await watcher.unwatch('new-file*'); + +// Stop watching. +// The method is async! +watcher.close().then(() => console.log('closed')); + +// Full list of options. See below for descriptions. +// Do not use this example! +chokidar.watch('file', { + persistent: true, + + ignored: '*.txt', + ignoreInitial: false, + followSymlinks: true, + cwd: '.', + disableGlobbing: false, + + usePolling: false, + interval: 100, + binaryInterval: 300, + alwaysStat: false, + depth: 99, + awaitWriteFinish: { + stabilityThreshold: 2000, + pollInterval: 100 + }, + + ignorePermissionErrors: false, + atomic: true // or a custom 'atomicity delay', in milliseconds (default 100) +}); + +``` + +`chokidar.watch(paths, [options])` + +* `paths` (string or array of strings). Paths to files, dirs to be watched +recursively, or glob patterns. + - Note: globs must not contain windows separators (`\`), + because that's how they work by the standard — + you'll need to replace them with forward slashes (`/`). + - Note 2: for additional glob documentation, check out low-level + library: [picomatch](https://github.com/micromatch/picomatch). +* `options` (object) Options object as defined below: + +#### Persistence + +* `persistent` (default: `true`). Indicates whether the process +should continue to run as long as files are being watched. If set to +`false` when using `fsevents` to watch, no more events will be emitted +after `ready`, even if the process continues to run. + +#### Path filtering + +* `ignored` ([anymatch](https://github.com/es128/anymatch)-compatible definition) +Defines files/paths to be ignored. The whole relative or absolute path is +tested, not just filename. If a function with two arguments is provided, it +gets called twice per path - once with a single argument (the path), second +time with two arguments (the path and the +[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) +object of that path). +* `ignoreInitial` (default: `false`). If set to `false` then `add`/`addDir` events are also emitted for matching paths while +instantiating the watching as chokidar discovers these file paths (before the `ready` event). +* `followSymlinks` (default: `true`). When `false`, only the +symlinks themselves will be watched for changes instead of following +the link references and bubbling events through the link's path. +* `cwd` (no default). The base directory from which watch `paths` are to be +derived. Paths emitted with events will be relative to this. +* `disableGlobbing` (default: `false`). If set to `true` then the strings passed to `.watch()` and `.add()` are treated as +literal path names, even if they look like globs. + +#### Performance + +* `usePolling` (default: `false`). +Whether to use fs.watchFile (backed by polling), or fs.watch. If polling +leads to high CPU utilization, consider setting this to `false`. It is +typically necessary to **set this to `true` to successfully watch files over +a network**, and it may be necessary to successfully watch files in other +non-standard situations. Setting to `true` explicitly on MacOS overrides the +`useFsEvents` default. You may also set the CHOKIDAR_USEPOLLING env variable +to true (1) or false (0) in order to override this option. +* _Polling-specific settings_ (effective when `usePolling: true`) + * `interval` (default: `100`). Interval of file system polling, in milliseconds. You may also + set the CHOKIDAR_INTERVAL env variable to override this option. + * `binaryInterval` (default: `300`). Interval of file system + polling for binary files. + ([see list of binary extensions](https://github.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) +* `useFsEvents` (default: `true` on MacOS). Whether to use the +`fsevents` watching interface if available. When set to `true` explicitly +and `fsevents` is available this supercedes the `usePolling` setting. When +set to `false` on MacOS, `usePolling: true` becomes the default. +* `alwaysStat` (default: `false`). If relying upon the +[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) +object that may get passed with `add`, `addDir`, and `change` events, set +this to `true` to ensure it is provided even in cases where it wasn't +already available from the underlying watch events. +* `depth` (default: `undefined`). If set, limits how many levels of +subdirectories will be traversed. +* `awaitWriteFinish` (default: `false`). +By default, the `add` event will fire when a file first appears on disk, before +the entire file has been written. Furthermore, in some cases some `change` +events will be emitted while the file is being written. In some cases, +especially when watching for large files there will be a need to wait for the +write operation to finish before responding to a file creation or modification. +Setting `awaitWriteFinish` to `true` (or a truthy value) will poll file size, +holding its `add` and `change` events until the size does not change for a +configurable amount of time. The appropriate duration setting is heavily +dependent on the OS and hardware. For accurate detection this parameter should +be relatively high, making file watching much less responsive. +Use with caution. + * *`options.awaitWriteFinish` can be set to an object in order to adjust + timing params:* + * `awaitWriteFinish.stabilityThreshold` (default: 2000). Amount of time in + milliseconds for a file size to remain constant before emitting its event. + * `awaitWriteFinish.pollInterval` (default: 100). File size polling interval, in milliseconds. + +#### Errors + +* `ignorePermissionErrors` (default: `false`). Indicates whether to watch files +that don't have read permissions if possible. If watching fails due to `EPERM` +or `EACCES` with this set to `true`, the errors will be suppressed silently. +* `atomic` (default: `true` if `useFsEvents` and `usePolling` are `false`). +Automatically filters out artifacts that occur when using editors that use +"atomic writes" instead of writing directly to the source file. If a file is +re-added within 100 ms of being deleted, Chokidar emits a `change` event +rather than `unlink` then `add`. If the default of 100 ms does not work well +for you, you can override it by setting `atomic` to a custom value, in +milliseconds. + +### Methods & Events + +`chokidar.watch()` produces an instance of `FSWatcher`. Methods of `FSWatcher`: + +* `.add(path / paths)`: Add files, directories, or glob patterns for tracking. +Takes an array of strings or just one string. +* `.on(event, callback)`: Listen for an FS event. +Available events: `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `ready`, +`raw`, `error`. +Additionally `all` is available which gets emitted with the underlying event +name and path for every event other than `ready`, `raw`, and `error`. `raw` is internal, use it carefully. +* `.unwatch(path / paths)`: Stop watching files, directories, or glob patterns. +Takes an array of strings or just one string. +* `.close()`: **async** Removes all listeners from watched files. Asynchronous, returns Promise. Use with `await` to ensure bugs don't happen. +* `.getWatched()`: Returns an object representing all the paths on the file +system being watched by this `FSWatcher` instance. The object's keys are all the +directories (using absolute paths unless the `cwd` option was used), and the +values are arrays of the names of the items contained in each directory. + +## CLI + +If you need a CLI interface for your file watching, check out +[chokidar-cli](https://github.com/open-cli-tools/chokidar-cli), allowing you to +execute a command on each change, or get a stdio stream of change events. + +## Install Troubleshooting + +* `npm WARN optional dep failed, continuing fsevents@n.n.n` + * This message is normal part of how `npm` handles optional dependencies and is + not indicative of a problem. Even if accompanied by other related error messages, + Chokidar should function properly. + +* `TypeError: fsevents is not a constructor` + * Update chokidar by doing `rm -rf node_modules package-lock.json yarn.lock && npm install`, or update your dependency that uses chokidar. + +* Chokidar is producing `ENOSP` error on Linux, like this: + * `bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell` + `Error: watch /home/ ENOSPC` + * This means Chokidar ran out of file handles and you'll need to increase their count by executing the following command in Terminal: + `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p` + +## Changelog + +For more detailed changelog, see [`full_changelog.md`](.github/full_changelog.md). +- **v3.5 (Jan 6, 2021):** Support for ARM Macs with Apple Silicon. Fixes for deleted symlinks. +- **v3.4 (Apr 26, 2020):** Support for directory-based symlinks. Fixes for macos file replacement. +- **v3.3 (Nov 2, 2019):** `FSWatcher#close()` method became async. That fixes IO race conditions related to close method. +- **v3.2 (Oct 1, 2019):** Improve Linux RAM usage by 50%. Race condition fixes. Windows glob fixes. Improve stability by using tight range of dependency versions. +- **v3.1 (Sep 16, 2019):** dotfiles are no longer filtered out by default. Use `ignored` option if needed. Improve initial Linux scan time by 50%. +- **v3 (Apr 30, 2019):** massive CPU & RAM consumption improvements; reduces deps / package size by a factor of 17x and bumps Node.js requirement to v8.16 and higher. +- **v2 (Dec 29, 2017):** Globs are now posix-style-only; without windows support. Tons of bugfixes. +- **v1 (Apr 7, 2015):** Glob support, symlink support, tons of bugfixes. Node 0.8+ is supported +- **v0.1 (Apr 20, 2012):** Initial release, extracted from [Brunch](https://github.com/brunch/brunch/blob/9847a065aea300da99bd0753f90354cde9de1261/src/helpers.coffee#L66) + +## Also + +Why was chokidar named this way? What's the meaning behind it? + +>Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India. + +## License + +MIT (c) Paul Miller (), see [LICENSE](LICENSE) file. diff --git a/node_modules/chokidar/index.js b/node_modules/chokidar/index.js new file mode 100644 index 0000000..8752893 --- /dev/null +++ b/node_modules/chokidar/index.js @@ -0,0 +1,973 @@ +'use strict'; + +const { EventEmitter } = require('events'); +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); +const readdirp = require('readdirp'); +const anymatch = require('anymatch').default; +const globParent = require('glob-parent'); +const isGlob = require('is-glob'); +const braces = require('braces'); +const normalizePath = require('normalize-path'); + +const NodeFsHandler = require('./lib/nodefs-handler'); +const FsEventsHandler = require('./lib/fsevents-handler'); +const { + EV_ALL, + EV_READY, + EV_ADD, + EV_CHANGE, + EV_UNLINK, + EV_ADD_DIR, + EV_UNLINK_DIR, + EV_RAW, + EV_ERROR, + + STR_CLOSE, + STR_END, + + BACK_SLASH_RE, + DOUBLE_SLASH_RE, + SLASH_OR_BACK_SLASH_RE, + DOT_RE, + REPLACER_RE, + + SLASH, + SLASH_SLASH, + BRACE_START, + BANG, + ONE_DOT, + TWO_DOTS, + GLOBSTAR, + SLASH_GLOBSTAR, + ANYMATCH_OPTS, + STRING_TYPE, + FUNCTION_TYPE, + EMPTY_STR, + EMPTY_FN, + + isWindows, + isMacos, + isIBMi +} = require('./lib/constants'); + +const stat = promisify(fs.stat); +const readdir = promisify(fs.readdir); + +/** + * @typedef {String} Path + * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName + * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType + */ + +/** + * + * @typedef {Object} WatchHelpers + * @property {Boolean} followSymlinks + * @property {'stat'|'lstat'} statMethod + * @property {Path} path + * @property {Path} watchPath + * @property {Function} entryPath + * @property {Boolean} hasGlob + * @property {Object} globFilter + * @property {Function} filterPath + * @property {Function} filterDir + */ + +const arrify = (value = []) => Array.isArray(value) ? value : [value]; +const flatten = (list, result = []) => { + list.forEach(item => { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + }); + return result; +}; + +const unifyPaths = (paths_) => { + /** + * @type {Array} + */ + const paths = flatten(arrify(paths_)); + if (!paths.every(p => typeof p === STRING_TYPE)) { + throw new TypeError(`Non-string provided as watch path: ${paths}`); + } + return paths.map(normalizePathToUnix); +}; + +// If SLASH_SLASH occurs at the beginning of path, it is not replaced +// because "//StoragePC/DrivePool/Movies" is a valid network path +const toUnix = (string) => { + let str = string.replace(BACK_SLASH_RE, SLASH); + let prepend = false; + if (str.startsWith(SLASH_SLASH)) { + prepend = true; + } + while (str.match(DOUBLE_SLASH_RE)) { + str = str.replace(DOUBLE_SLASH_RE, SLASH); + } + if (prepend) { + str = SLASH + str; + } + return str; +}; + +// Our version of upath.normalize +// TODO: this is not equal to path-normalize module - investigate why +const normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path))); + +const normalizeIgnored = (cwd = EMPTY_STR) => (path) => { + if (typeof path !== STRING_TYPE) return path; + return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path)); +}; + +const getAbsolutePath = (path, cwd) => { + if (sysPath.isAbsolute(path)) { + return path; + } + if (path.startsWith(BANG)) { + return BANG + sysPath.join(cwd, path.slice(1)); + } + return sysPath.join(cwd, path); +}; + +const undef = (opts, key) => opts[key] === undefined; + +/** + * Directory entry. + * @property {Path} path + * @property {Set} items + */ +class DirEntry { + /** + * @param {Path} dir + * @param {Function} removeWatcher + */ + constructor(dir, removeWatcher) { + this.path = dir; + this._removeWatcher = removeWatcher; + /** @type {Set} */ + this.items = new Set(); + } + + add(item) { + const {items} = this; + if (!items) return; + if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item); + } + + async remove(item) { + const {items} = this; + if (!items) return; + items.delete(item); + if (items.size > 0) return; + + const dir = this.path; + try { + await readdir(dir); + } catch (err) { + if (this._removeWatcher) { + this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir)); + } + } + } + + has(item) { + const {items} = this; + if (!items) return; + return items.has(item); + } + + /** + * @returns {Array} + */ + getChildren() { + const {items} = this; + if (!items) return; + return [...items.values()]; + } + + dispose() { + this.items.clear(); + delete this.path; + delete this._removeWatcher; + delete this.items; + Object.freeze(this); + } +} + +const STAT_METHOD_F = 'stat'; +const STAT_METHOD_L = 'lstat'; +class WatchHelper { + constructor(path, watchPath, follow, fsw) { + this.fsw = fsw; + this.path = path = path.replace(REPLACER_RE, EMPTY_STR); + this.watchPath = watchPath; + this.fullWatchPath = sysPath.resolve(watchPath); + this.hasGlob = watchPath !== path; + /** @type {object|boolean} */ + if (path === EMPTY_STR) this.hasGlob = false; + this.globSymlink = this.hasGlob && follow ? undefined : false; + this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false; + this.dirParts = this.getDirParts(path); + this.dirParts.forEach((parts) => { + if (parts.length > 1) parts.pop(); + }); + this.followSymlinks = follow; + this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L; + } + + checkGlobSymlink(entry) { + // only need to resolve once + // first entry should always have entry.parentDir === EMPTY_STR + if (this.globSymlink === undefined) { + this.globSymlink = entry.fullParentDir === this.fullWatchPath ? + false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath}; + } + + if (this.globSymlink) { + return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath); + } + + return entry.fullPath; + } + + entryPath(entry) { + return sysPath.join(this.watchPath, + sysPath.relative(this.watchPath, this.checkGlobSymlink(entry)) + ); + } + + filterPath(entry) { + const {stats} = entry; + if (stats && stats.isSymbolicLink()) return this.filterDir(entry); + const resolvedPath = this.entryPath(entry); + const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ? + this.globFilter(resolvedPath) : true; + return matchesGlob && + this.fsw._isntIgnored(resolvedPath, stats) && + this.fsw._hasReadPermissions(stats); + } + + getDirParts(path) { + if (!this.hasGlob) return []; + const parts = []; + const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path]; + expandedPath.forEach((path) => { + parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE)); + }); + return parts; + } + + filterDir(entry) { + if (this.hasGlob) { + const entryParts = this.getDirParts(this.checkGlobSymlink(entry)); + let globstar = false; + this.unmatchedGlob = !this.dirParts.some((parts) => { + return parts.every((part, i) => { + if (part === GLOBSTAR) globstar = true; + return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS); + }); + }); + } + return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats); + } +} + +/** + * Watches files & directories for changes. Emitted events: + * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error` + * + * new FSWatcher() + * .add(directories) + * .on('add', path => log('File', path, 'was added')) + */ +class FSWatcher extends EventEmitter { +// Not indenting methods for history sake; for now. +constructor(_opts) { + super(); + + const opts = {}; + if (_opts) Object.assign(opts, _opts); // for frozen objects + + /** @type {Map} */ + this._watched = new Map(); + /** @type {Map} */ + this._closers = new Map(); + /** @type {Set} */ + this._ignoredPaths = new Set(); + + /** @type {Map} */ + this._throttled = new Map(); + + /** @type {Map} */ + this._symlinkPaths = new Map(); + + this._streams = new Set(); + this.closed = false; + + // Set up default options. + if (undef(opts, 'persistent')) opts.persistent = true; + if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false; + if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false; + if (undef(opts, 'interval')) opts.interval = 100; + if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300; + if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false; + opts.enableBinaryInterval = opts.binaryInterval !== opts.interval; + + // Enable fsevents on OS X when polling isn't explicitly enabled. + if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling; + + // If we can't use fsevents, ensure the options reflect it's disabled. + const canUseFsEvents = FsEventsHandler.canUse(); + if (!canUseFsEvents) opts.useFsEvents = false; + + // Use polling on Mac if not using fsevents. + // Other platforms use non-polling fs_watch. + if (undef(opts, 'usePolling') && !opts.useFsEvents) { + opts.usePolling = isMacos; + } + + // Always default to polling on IBM i because fs.watch() is not available on IBM i. + if(isIBMi) { + opts.usePolling = true; + } + + // Global override (useful for end-developers that need to force polling for all + // instances of chokidar, regardless of usage/dependency depth) + const envPoll = process.env.CHOKIDAR_USEPOLLING; + if (envPoll !== undefined) { + const envLower = envPoll.toLowerCase(); + + if (envLower === 'false' || envLower === '0') { + opts.usePolling = false; + } else if (envLower === 'true' || envLower === '1') { + opts.usePolling = true; + } else { + opts.usePolling = !!envLower; + } + } + const envInterval = process.env.CHOKIDAR_INTERVAL; + if (envInterval) { + opts.interval = Number.parseInt(envInterval, 10); + } + + // Editor atomic write normalization enabled by default with fs.watch + if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents; + if (opts.atomic) this._pendingUnlinks = new Map(); + + if (undef(opts, 'followSymlinks')) opts.followSymlinks = true; + + if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false; + if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {}; + const awf = opts.awaitWriteFinish; + if (awf) { + if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000; + if (!awf.pollInterval) awf.pollInterval = 100; + this._pendingWrites = new Map(); + } + if (opts.ignored) opts.ignored = arrify(opts.ignored); + + let readyCalls = 0; + this._emitReady = () => { + readyCalls++; + if (readyCalls >= this._readyCount) { + this._emitReady = EMPTY_FN; + this._readyEmitted = true; + // use process.nextTick to allow time for listener to be bound + process.nextTick(() => this.emit(EV_READY)); + } + }; + this._emitRaw = (...args) => this.emit(EV_RAW, ...args); + this._readyEmitted = false; + this.options = opts; + + // Initialize with proper watcher. + if (opts.useFsEvents) { + this._fsEventsHandler = new FsEventsHandler(this); + } else { + this._nodeFsHandler = new NodeFsHandler(this); + } + + // You’re frozen when your heart’s not open. + Object.freeze(opts); +} + +// Public methods + +/** + * Adds paths to be watched on an existing FSWatcher instance + * @param {Path|Array} paths_ + * @param {String=} _origAdd private; for handling non-existent paths to be watched + * @param {Boolean=} _internal private; indicates a non-user add + * @returns {FSWatcher} for chaining + */ +add(paths_, _origAdd, _internal) { + const {cwd, disableGlobbing} = this.options; + this.closed = false; + let paths = unifyPaths(paths_); + if (cwd) { + paths = paths.map((path) => { + const absPath = getAbsolutePath(path, cwd); + + // Check `path` instead of `absPath` because the cwd portion can't be a glob + if (disableGlobbing || !isGlob(path)) { + return absPath; + } + return normalizePath(absPath); + }); + } + + // set aside negated glob strings + paths = paths.filter((path) => { + if (path.startsWith(BANG)) { + this._ignoredPaths.add(path.slice(1)); + return false; + } + + // if a path is being added that was previously ignored, stop ignoring it + this._ignoredPaths.delete(path); + this._ignoredPaths.delete(path + SLASH_GLOBSTAR); + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = undefined; + + return true; + }); + + if (this.options.useFsEvents && this._fsEventsHandler) { + if (!this._readyCount) this._readyCount = paths.length; + if (this.options.persistent) this._readyCount += paths.length; + paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path)); + } else { + if (!this._readyCount) this._readyCount = 0; + this._readyCount += paths.length; + Promise.all( + paths.map(async path => { + const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd); + if (res) this._emitReady(); + return res; + }) + ).then(results => { + if (this.closed) return; + results.filter(item => item).forEach(item => { + this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); + }); + }); + } + + return this; +} + +/** + * Close watchers or start ignoring events from specified paths. + * @param {Path|Array} paths_ - string or array of strings, file/directory paths and/or globs + * @returns {FSWatcher} for chaining +*/ +unwatch(paths_) { + if (this.closed) return this; + const paths = unifyPaths(paths_); + const {cwd} = this.options; + + paths.forEach((path) => { + // convert to absolute path unless relative path already matches + if (!sysPath.isAbsolute(path) && !this._closers.has(path)) { + if (cwd) path = sysPath.join(cwd, path); + path = sysPath.resolve(path); + } + + this._closePath(path); + + this._ignoredPaths.add(path); + if (this._watched.has(path)) { + this._ignoredPaths.add(path + SLASH_GLOBSTAR); + } + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = undefined; + }); + + return this; +} + +/** + * Close watchers and remove all listeners from watched paths. + * @returns {Promise}. +*/ +close() { + if (this.closed) return this._closePromise; + this.closed = true; + + // Memory management. + this.removeAllListeners(); + const closers = []; + this._closers.forEach(closerList => closerList.forEach(closer => { + const promise = closer(); + if (promise instanceof Promise) closers.push(promise); + })); + this._streams.forEach(stream => stream.destroy()); + this._userIgnored = undefined; + this._readyCount = 0; + this._readyEmitted = false; + this._watched.forEach(dirent => dirent.dispose()); + ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => { + this[`_${key}`].clear(); + }); + + this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve(); + return this._closePromise; +} + +/** + * Expose list of watched paths + * @returns {Object} for chaining +*/ +getWatched() { + const watchList = {}; + this._watched.forEach((entry, dir) => { + const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; + watchList[key || ONE_DOT] = entry.getChildren().sort(); + }); + return watchList; +} + +emitWithAll(event, args) { + this.emit(...args); + if (event !== EV_ERROR) this.emit(EV_ALL, ...args); +} + +// Common helpers +// -------------- + +/** + * Normalize and emit events. + * Calling _emit DOES NOT MEAN emit() would be called! + * @param {EventName} event Type of event + * @param {Path} path File or directory path + * @param {*=} val1 arguments to be passed with event + * @param {*=} val2 + * @param {*=} val3 + * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ +async _emit(event, path, val1, val2, val3) { + if (this.closed) return; + + const opts = this.options; + if (isWindows) path = sysPath.normalize(path); + if (opts.cwd) path = sysPath.relative(opts.cwd, path); + /** @type Array */ + const args = [event, path]; + if (val3 !== undefined) args.push(val1, val2, val3); + else if (val2 !== undefined) args.push(val1, val2); + else if (val1 !== undefined) args.push(val1); + + const awf = opts.awaitWriteFinish; + let pw; + if (awf && (pw = this._pendingWrites.get(path))) { + pw.lastChange = new Date(); + return this; + } + + if (opts.atomic) { + if (event === EV_UNLINK) { + this._pendingUnlinks.set(path, args); + setTimeout(() => { + this._pendingUnlinks.forEach((entry, path) => { + this.emit(...entry); + this.emit(EV_ALL, ...entry); + this._pendingUnlinks.delete(path); + }); + }, typeof opts.atomic === 'number' ? opts.atomic : 100); + return this; + } + if (event === EV_ADD && this._pendingUnlinks.has(path)) { + event = args[0] = EV_CHANGE; + this._pendingUnlinks.delete(path); + } + } + + if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) { + const awfEmit = (err, stats) => { + if (err) { + event = args[0] = EV_ERROR; + args[1] = err; + this.emitWithAll(event, args); + } else if (stats) { + // if stats doesn't exist the file must have been deleted + if (args.length > 2) { + args[2] = stats; + } else { + args.push(stats); + } + this.emitWithAll(event, args); + } + }; + + this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); + return this; + } + + if (event === EV_CHANGE) { + const isThrottled = !this._throttle(EV_CHANGE, path, 50); + if (isThrottled) return this; + } + + if (opts.alwaysStat && val1 === undefined && + (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE) + ) { + const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path; + let stats; + try { + stats = await stat(fullPath); + } catch (err) {} + // Suppress event when fs_stat fails, to avoid sending undefined 'stat' + if (!stats || this.closed) return; + args.push(stats); + } + this.emitWithAll(event, args); + + return this; +} + +/** + * Common handler for errors + * @param {Error} error + * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ +_handleError(error) { + const code = error && error.code; + if (error && code !== 'ENOENT' && code !== 'ENOTDIR' && + (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES')) + ) { + this.emit(EV_ERROR, error); + } + return error || this.closed; +} + +/** + * Helper utility for throttling + * @param {ThrottleType} actionType type being throttled + * @param {Path} path being acted upon + * @param {Number} timeout duration of time to suppress duplicate actions + * @returns {Object|false} tracking object or false if action should be suppressed + */ +_throttle(actionType, path, timeout) { + if (!this._throttled.has(actionType)) { + this._throttled.set(actionType, new Map()); + } + + /** @type {Map} */ + const action = this._throttled.get(actionType); + /** @type {Object} */ + const actionPath = action.get(path); + + if (actionPath) { + actionPath.count++; + return false; + } + + let timeoutObject; + const clear = () => { + const item = action.get(path); + const count = item ? item.count : 0; + action.delete(path); + clearTimeout(timeoutObject); + if (item) clearTimeout(item.timeoutObject); + return count; + }; + timeoutObject = setTimeout(clear, timeout); + const thr = {timeoutObject, clear, count: 0}; + action.set(path, thr); + return thr; +} + +_incrReadyCount() { + return this._readyCount++; +} + +/** + * Awaits write operation to finish. + * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback. + * @param {Path} path being acted upon + * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished + * @param {EventName} event + * @param {Function} awfEmit Callback to be called when ready for event to be emitted. + */ +_awaitWriteFinish(path, threshold, event, awfEmit) { + let timeoutHandler; + + let fullPath = path; + if (this.options.cwd && !sysPath.isAbsolute(path)) { + fullPath = sysPath.join(this.options.cwd, path); + } + + const now = new Date(); + + const awaitWriteFinish = (prevStat) => { + fs.stat(fullPath, (err, curStat) => { + if (err || !this._pendingWrites.has(path)) { + if (err && err.code !== 'ENOENT') awfEmit(err); + return; + } + + const now = Number(new Date()); + + if (prevStat && curStat.size !== prevStat.size) { + this._pendingWrites.get(path).lastChange = now; + } + const pw = this._pendingWrites.get(path); + const df = now - pw.lastChange; + + if (df >= threshold) { + this._pendingWrites.delete(path); + awfEmit(undefined, curStat); + } else { + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval, + curStat + ); + } + }); + }; + + if (!this._pendingWrites.has(path)) { + this._pendingWrites.set(path, { + lastChange: now, + cancelWait: () => { + this._pendingWrites.delete(path); + clearTimeout(timeoutHandler); + return event; + } + }); + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval + ); + } +} + +_getGlobIgnored() { + return [...this._ignoredPaths.values()]; +} + +/** + * Determines whether user has asked to ignore this path. + * @param {Path} path filepath or dir + * @param {fs.Stats=} stats result of fs.stat + * @returns {Boolean} + */ +_isIgnored(path, stats) { + if (this.options.atomic && DOT_RE.test(path)) return true; + if (!this._userIgnored) { + const {cwd} = this.options; + const ign = this.options.ignored; + + const ignored = ign && ign.map(normalizeIgnored(cwd)); + const paths = arrify(ignored) + .filter((path) => typeof path === STRING_TYPE && !isGlob(path)) + .map((path) => path + SLASH_GLOBSTAR); + const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths); + this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS); + } + + return this._userIgnored([path, stats]); +} + +_isntIgnored(path, stat) { + return !this._isIgnored(path, stat); +} + +/** + * Provides a set of common helpers and properties relating to symlink and glob handling. + * @param {Path} path file, directory, or glob pattern being watched + * @param {Number=} depth at any depth > 0, this isn't a glob + * @returns {WatchHelper} object containing helpers for this path + */ +_getWatchHelpers(path, depth) { + const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); + const follow = this.options.followSymlinks; + + return new WatchHelper(path, watchPath, follow, this); +} + +// Directory helpers +// ----------------- + +/** + * Provides directory tracking objects + * @param {String} directory path of the directory + * @returns {DirEntry} the directory's tracking object + */ +_getWatchedDir(directory) { + if (!this._boundRemove) this._boundRemove = this._remove.bind(this); + const dir = sysPath.resolve(directory); + if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove)); + return this._watched.get(dir); +} + +// File helpers +// ------------ + +/** + * Check for read permissions. + * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405 + * @param {fs.Stats} stats - object, result of fs_stat + * @returns {Boolean} indicates whether the file can be read +*/ +_hasReadPermissions(stats) { + if (this.options.ignorePermissionErrors) return true; + + // stats.mode may be bigint + const md = stats && Number.parseInt(stats.mode, 10); + const st = md & 0o777; + const it = Number.parseInt(st.toString(8)[0], 10); + return Boolean(4 & it); +} + +/** + * Handles emitting unlink events for + * files and directories, and via recursion, for + * files and directories within directories that are unlinked + * @param {String} directory within which the following item is located + * @param {String} item base path of item/directory + * @returns {void} +*/ +_remove(directory, item, isDirectory) { + // if what is being deleted is a directory, get that directory's paths + // for recursive deleting and cleaning of watched object + // if it is not a directory, nestedDirectoryChildren will be empty array + const path = sysPath.join(directory, item); + const fullPath = sysPath.resolve(path); + isDirectory = isDirectory != null + ? isDirectory + : this._watched.has(path) || this._watched.has(fullPath); + + // prevent duplicate handling in case of arriving here nearly simultaneously + // via multiple paths (such as _handleFile and _handleDir) + if (!this._throttle('remove', path, 100)) return; + + // if the only watched file is removed, watch for its return + if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) { + this.add(directory, item, true); + } + + // This will create a new entry in the watched object in either case + // so we got to do the directory check beforehand + const wp = this._getWatchedDir(path); + const nestedDirectoryChildren = wp.getChildren(); + + // Recursively remove children directories / files. + nestedDirectoryChildren.forEach(nested => this._remove(path, nested)); + + // Check if item was on the watched list and remove it + const parent = this._getWatchedDir(directory); + const wasTracked = parent.has(item); + parent.remove(item); + + // Fixes issue #1042 -> Relative paths were detected and added as symlinks + // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612), + // but never removed from the map in case the path was deleted. + // This leads to an incorrect state if the path was recreated: + // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553 + if (this._symlinkPaths.has(fullPath)) { + this._symlinkPaths.delete(fullPath); + } + + // If we wait for this file to be fully written, cancel the wait. + let relPath = path; + if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path); + if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) { + const event = this._pendingWrites.get(relPath).cancelWait(); + if (event === EV_ADD) return; + } + + // The Entry will either be a directory that just got removed + // or a bogus entry to a file, in either case we have to remove it + this._watched.delete(path); + this._watched.delete(fullPath); + const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK; + if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path); + + // Avoid conflicts if we later create another file with the same name + if (!this.options.useFsEvents) { + this._closePath(path); + } +} + +/** + * Closes all watchers for a path + * @param {Path} path + */ +_closePath(path) { + this._closeFile(path) + const dir = sysPath.dirname(path); + this._getWatchedDir(dir).remove(sysPath.basename(path)); +} + +/** + * Closes only file-specific watchers + * @param {Path} path + */ +_closeFile(path) { + const closers = this._closers.get(path); + if (!closers) return; + closers.forEach(closer => closer()); + this._closers.delete(path); +} + +/** + * + * @param {Path} path + * @param {Function} closer + */ +_addPathCloser(path, closer) { + if (!closer) return; + let list = this._closers.get(path); + if (!list) { + list = []; + this._closers.set(path, list); + } + list.push(closer); +} + +_readdirp(root, opts) { + if (this.closed) return; + const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts}; + let stream = readdirp(root, options); + this._streams.add(stream); + stream.once(STR_CLOSE, () => { + stream = undefined; + }); + stream.once(STR_END, () => { + if (stream) { + this._streams.delete(stream); + stream = undefined; + } + }); + return stream; +} + +} + +// Export FSWatcher class +exports.FSWatcher = FSWatcher; + +/** + * Instantiates watcher with paths to be tracked. + * @param {String|Array} paths file/directory paths and/or globs + * @param {Object=} options chokidar opts + * @returns an instance of FSWatcher for chaining. + */ +const watch = (paths, options) => { + const watcher = new FSWatcher(options); + watcher.add(paths); + return watcher; +}; + +exports.watch = watch; diff --git a/node_modules/chokidar/lib/constants.js b/node_modules/chokidar/lib/constants.js new file mode 100644 index 0000000..4743865 --- /dev/null +++ b/node_modules/chokidar/lib/constants.js @@ -0,0 +1,66 @@ +'use strict'; + +const {sep} = require('path'); +const {platform} = process; +const os = require('os'); + +exports.EV_ALL = 'all'; +exports.EV_READY = 'ready'; +exports.EV_ADD = 'add'; +exports.EV_CHANGE = 'change'; +exports.EV_ADD_DIR = 'addDir'; +exports.EV_UNLINK = 'unlink'; +exports.EV_UNLINK_DIR = 'unlinkDir'; +exports.EV_RAW = 'raw'; +exports.EV_ERROR = 'error'; + +exports.STR_DATA = 'data'; +exports.STR_END = 'end'; +exports.STR_CLOSE = 'close'; + +exports.FSEVENT_CREATED = 'created'; +exports.FSEVENT_MODIFIED = 'modified'; +exports.FSEVENT_DELETED = 'deleted'; +exports.FSEVENT_MOVED = 'moved'; +exports.FSEVENT_CLONED = 'cloned'; +exports.FSEVENT_UNKNOWN = 'unknown'; +exports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1; +exports.FSEVENT_TYPE_FILE = 'file'; +exports.FSEVENT_TYPE_DIRECTORY = 'directory'; +exports.FSEVENT_TYPE_SYMLINK = 'symlink'; + +exports.KEY_LISTENERS = 'listeners'; +exports.KEY_ERR = 'errHandlers'; +exports.KEY_RAW = 'rawEmitters'; +exports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW]; + +exports.DOT_SLASH = `.${sep}`; + +exports.BACK_SLASH_RE = /\\/g; +exports.DOUBLE_SLASH_RE = /\/\//; +exports.SLASH_OR_BACK_SLASH_RE = /[/\\]/; +exports.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/; +exports.REPLACER_RE = /^\.[/\\]/; + +exports.SLASH = '/'; +exports.SLASH_SLASH = '//'; +exports.BRACE_START = '{'; +exports.BANG = '!'; +exports.ONE_DOT = '.'; +exports.TWO_DOTS = '..'; +exports.STAR = '*'; +exports.GLOBSTAR = '**'; +exports.ROOT_GLOBSTAR = '/**/*'; +exports.SLASH_GLOBSTAR = '/**'; +exports.DIR_SUFFIX = 'Dir'; +exports.ANYMATCH_OPTS = {dot: true}; +exports.STRING_TYPE = 'string'; +exports.FUNCTION_TYPE = 'function'; +exports.EMPTY_STR = ''; +exports.EMPTY_FN = () => {}; +exports.IDENTITY_FN = val => val; + +exports.isWindows = platform === 'win32'; +exports.isMacos = platform === 'darwin'; +exports.isLinux = platform === 'linux'; +exports.isIBMi = os.type() === 'OS400'; diff --git a/node_modules/chokidar/lib/fsevents-handler.js b/node_modules/chokidar/lib/fsevents-handler.js new file mode 100644 index 0000000..fe29393 --- /dev/null +++ b/node_modules/chokidar/lib/fsevents-handler.js @@ -0,0 +1,526 @@ +'use strict'; + +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); + +let fsevents; +try { + fsevents = require('fsevents'); +} catch (error) { + if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error); +} + +if (fsevents) { + // TODO: real check + const mtch = process.version.match(/v(\d+)\.(\d+)/); + if (mtch && mtch[1] && mtch[2]) { + const maj = Number.parseInt(mtch[1], 10); + const min = Number.parseInt(mtch[2], 10); + if (maj === 8 && min < 16) { + fsevents = undefined; + } + } +} + +const { + EV_ADD, + EV_CHANGE, + EV_ADD_DIR, + EV_UNLINK, + EV_ERROR, + STR_DATA, + STR_END, + FSEVENT_CREATED, + FSEVENT_MODIFIED, + FSEVENT_DELETED, + FSEVENT_MOVED, + // FSEVENT_CLONED, + FSEVENT_UNKNOWN, + FSEVENT_FLAG_MUST_SCAN_SUBDIRS, + FSEVENT_TYPE_FILE, + FSEVENT_TYPE_DIRECTORY, + FSEVENT_TYPE_SYMLINK, + + ROOT_GLOBSTAR, + DIR_SUFFIX, + DOT_SLASH, + FUNCTION_TYPE, + EMPTY_FN, + IDENTITY_FN +} = require('./constants'); + +const Depth = (value) => isNaN(value) ? {} : {depth: value}; + +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const realpath = promisify(fs.realpath); + +const statMethods = { stat, lstat }; + +/** + * @typedef {String} Path + */ + +/** + * @typedef {Object} FsEventsWatchContainer + * @property {Set} listeners + * @property {Function} rawEmitter + * @property {{stop: Function}} watcher + */ + +// fsevents instance helper functions +/** + * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances) + * @type {Map} + */ +const FSEventsWatchers = new Map(); + +// Threshold of duplicate path prefixes at which to start +// consolidating going forward +const consolidateThreshhold = 10; + +const wrongEventFlags = new Set([ + 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912 +]); + +/** + * Instantiates the fsevents interface + * @param {Path} path path to be watched + * @param {Function} callback called when fsevents is bound and ready + * @returns {{stop: Function}} new fsevents instance + */ +const createFSEventsInstance = (path, callback) => { + const stop = fsevents.watch(path, callback); + return {stop}; +}; + +/** + * Instantiates the fsevents interface or binds listeners to an existing one covering + * the same file tree. + * @param {Path} path - to be watched + * @param {Path} realPath - real path for symlinks + * @param {Function} listener - called when fsevents emits events + * @param {Function} rawEmitter - passes data to listeners of the 'raw' event + * @returns {Function} closer + */ +function setFSEventsListener(path, realPath, listener, rawEmitter) { + let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath; + + const parentPath = sysPath.dirname(watchPath); + let cont = FSEventsWatchers.get(watchPath); + + // If we've accumulated a substantial number of paths that + // could have been consolidated by watching one directory + // above the current one, create a watcher on the parent + // path instead, so that we do consolidate going forward. + if (couldConsolidate(parentPath)) { + watchPath = parentPath; + } + + const resolvedPath = sysPath.resolve(path); + const hasSymlink = resolvedPath !== realPath; + + const filteredListener = (fullPath, flags, info) => { + if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath); + if ( + fullPath === resolvedPath || + !fullPath.indexOf(resolvedPath + sysPath.sep) + ) listener(fullPath, flags, info); + }; + + // check if there is already a watcher on a parent path + // modifies `watchPath` to the parent path when it finds a match + let watchedParent = false; + for (const watchedPath of FSEventsWatchers.keys()) { + if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) { + watchPath = watchedPath; + cont = FSEventsWatchers.get(watchPath); + watchedParent = true; + break; + } + } + + if (cont || watchedParent) { + cont.listeners.add(filteredListener); + } else { + cont = { + listeners: new Set([filteredListener]), + rawEmitter, + watcher: createFSEventsInstance(watchPath, (fullPath, flags) => { + if (!cont.listeners.size) return; + if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return; + const info = fsevents.getInfo(fullPath, flags); + cont.listeners.forEach(list => { + list(fullPath, flags, info); + }); + + cont.rawEmitter(info.event, fullPath, info); + }) + }; + FSEventsWatchers.set(watchPath, cont); + } + + // removes this instance's listeners and closes the underlying fsevents + // instance if there are no more listeners left + return () => { + const lst = cont.listeners; + + lst.delete(filteredListener); + if (!lst.size) { + FSEventsWatchers.delete(watchPath); + if (cont.watcher) return cont.watcher.stop().then(() => { + cont.rawEmitter = cont.watcher = undefined; + Object.freeze(cont); + }); + } + }; +} + +// Decide whether or not we should start a new higher-level +// parent watcher +const couldConsolidate = (path) => { + let count = 0; + for (const watchPath of FSEventsWatchers.keys()) { + if (watchPath.indexOf(path) === 0) { + count++; + if (count >= consolidateThreshhold) { + return true; + } + } + } + + return false; +}; + +// returns boolean indicating whether fsevents can be used +const canUse = () => fsevents && FSEventsWatchers.size < 128; + +// determines subdirectory traversal levels from root to path +const calcDepth = (path, root) => { + let i = 0; + while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++; + return i; +}; + +// returns boolean indicating whether the fsevents' event info has the same type +// as the one returned by fs.stat +const sameTypes = (info, stats) => ( + info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() || + info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() || + info.type === FSEVENT_TYPE_FILE && stats.isFile() +) + +/** + * @mixin + */ +class FsEventsHandler { + +/** + * @param {import('../index').FSWatcher} fsw + */ +constructor(fsw) { + this.fsw = fsw; +} +checkIgnored(path, stats) { + const ipaths = this.fsw._ignoredPaths; + if (this.fsw._isIgnored(path, stats)) { + ipaths.add(path); + if (stats && stats.isDirectory()) { + ipaths.add(path + ROOT_GLOBSTAR); + } + return true; + } + + ipaths.delete(path); + ipaths.delete(path + ROOT_GLOBSTAR); +} + +addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD; + this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts); +} + +async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + try { + const stats = await stat(path) + if (this.fsw.closed) return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } catch (error) { + if (error.code === 'EACCES') { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } +} + +handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) { + if (this.fsw.closed || this.checkIgnored(path)) return; + + if (event === EV_UNLINK) { + const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY + // suppress unlink events on never before seen files + if (isDirectory || watchedDir.has(item)) { + this.fsw._remove(parent, item, isDirectory); + } + } else { + if (event === EV_ADD) { + // track new directories + if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path); + + if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) { + // push symlinks back to the top of the stack to get handled + const curDepth = opts.depth === undefined ? + undefined : calcDepth(fullPath, realPath) + 1; + return this._addToFsEvents(path, false, true, curDepth); + } + + // track new paths + // (other than symlinks being followed, which will be tracked soon) + this.fsw._getWatchedDir(parent).add(item); + } + /** + * @type {'add'|'addDir'|'unlink'|'unlinkDir'} + */ + const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event; + this.fsw._emit(eventName, path); + if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true); + } +} + +/** + * Handle symlinks encountered during directory scan + * @param {String} watchPath - file/dir path to be watched with fsevents + * @param {String} realPath - real path (in case of symlinks) + * @param {Function} transform - path transformer + * @param {Function} globFilter - path filter in case a glob pattern was provided + * @returns {Function} closer for the watcher instance +*/ +_watchWithFsEvents(watchPath, realPath, transform, globFilter) { + if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return; + const opts = this.fsw.options; + const watchCallback = async (fullPath, flags, info) => { + if (this.fsw.closed) return; + if ( + opts.depth !== undefined && + calcDepth(fullPath, realPath) > opts.depth + ) return; + const path = transform(sysPath.join( + watchPath, sysPath.relative(watchPath, fullPath) + )); + if (globFilter && !globFilter(path)) return; + // ensure directories are tracked + const parent = sysPath.dirname(path); + const item = sysPath.basename(path); + const watchedDir = this.fsw._getWatchedDir( + info.type === FSEVENT_TYPE_DIRECTORY ? path : parent + ); + + // correct for wrong events emitted + if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) { + if (typeof opts.ignored === FUNCTION_TYPE) { + let stats; + try { + stats = await stat(path); + } catch (error) {} + if (this.fsw.closed) return; + if (this.checkIgnored(path, stats)) return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + switch (info.event) { + case FSEVENT_CREATED: + case FSEVENT_MODIFIED: + return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + case FSEVENT_DELETED: + case FSEVENT_MOVED: + return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + }; + + const closer = setFSEventsListener( + watchPath, + realPath, + watchCallback, + this.fsw._emitRaw + ); + + this.fsw._emitReady(); + return closer; +} + +/** + * Handle symlinks encountered during directory scan + * @param {String} linkPath path to symlink + * @param {String} fullPath absolute path to the symlink + * @param {Function} transform pre-existing path transformer + * @param {Number} curDepth level of subdirectories traversed to where symlink is + * @returns {Promise} + */ +async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) { + // don't follow the same symlink more than once + if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return; + + this.fsw._symlinkPaths.set(fullPath, true); + this.fsw._incrReadyCount(); + + try { + const linkTarget = await realpath(linkPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(linkTarget)) { + return this.fsw._emitReady(); + } + + this.fsw._incrReadyCount(); + + // add the linkTarget for watching with a wrapper for transform + // that causes emitted paths to incorporate the link's path + this._addToFsEvents(linkTarget || linkPath, (path) => { + let aliasedPath = linkPath; + if (linkTarget && linkTarget !== DOT_SLASH) { + aliasedPath = path.replace(linkTarget, linkPath); + } else if (path !== DOT_SLASH) { + aliasedPath = sysPath.join(linkPath, path); + } + return transform(aliasedPath); + }, false, curDepth); + } catch(error) { + if (this.fsw._handleError(error)) { + return this.fsw._emitReady(); + } + } +} + +/** + * + * @param {Path} newPath + * @param {fs.Stats} stats + */ +emitAdd(newPath, stats, processPath, opts, forceAdd) { + const pp = processPath(newPath); + const isDir = stats.isDirectory(); + const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp)); + const base = sysPath.basename(pp); + + // ensure empty dirs get tracked + if (isDir) this.fsw._getWatchedDir(pp); + if (dirObj.has(base)) return; + dirObj.add(base); + + if (!opts.ignoreInitial || forceAdd === true) { + this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats); + } +} + +initWatch(realPath, path, wh, processPath) { + if (this.fsw.closed) return; + const closer = this._watchWithFsEvents( + wh.watchPath, + sysPath.resolve(realPath || wh.watchPath), + processPath, + wh.globFilter + ); + this.fsw._addPathCloser(path, closer); +} + +/** + * Handle added path with fsevents + * @param {String} path file/dir path or glob pattern + * @param {Function|Boolean=} transform converts working path to what the user expects + * @param {Boolean=} forceAdd ensure add is emitted + * @param {Number=} priorDepth Level of subdirectories already traversed. + * @returns {Promise} + */ +async _addToFsEvents(path, transform, forceAdd, priorDepth) { + if (this.fsw.closed) { + return; + } + const opts = this.fsw.options; + const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN; + + const wh = this.fsw._getWatchHelpers(path); + + // evaluate what is at the path we're being asked to watch + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + throw null; + } + if (stats.isDirectory()) { + // emit addDir unless this is a glob parent + if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd); + + // don't recurse further if it would exceed depth setting + if (priorDepth && priorDepth > opts.depth) return; + + // scan the contents of the dir + this.fsw._readdirp(wh.watchPath, { + fileFilter: entry => wh.filterPath(entry), + directoryFilter: entry => wh.filterDir(entry), + ...Depth(opts.depth - (priorDepth || 0)) + }).on(STR_DATA, (entry) => { + // need to check filterPath on dirs b/c filterDir is less restrictive + if (this.fsw.closed) { + return; + } + if (entry.stats.isDirectory() && !wh.filterPath(entry)) return; + + const joinedPath = sysPath.join(wh.watchPath, entry.path); + const {fullPath} = entry; + + if (wh.followSymlinks && entry.stats.isSymbolicLink()) { + // preserve the current depth here since it can't be derived from + // real paths past the symlink + const curDepth = opts.depth === undefined ? + undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; + + this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); + } else { + this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd); + } + }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => { + this.fsw._emitReady(); + }); + } else { + this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd); + this.fsw._emitReady(); + } + } catch (error) { + if (!error || this.fsw._handleError(error)) { + // TODO: Strange thing: "should not choke on an ignored watch path" will be failed without 2 ready calls -__- + this.fsw._emitReady(); + this.fsw._emitReady(); + } + } + + if (opts.persistent && forceAdd !== true) { + if (typeof transform === FUNCTION_TYPE) { + // realpath has already been resolved + this.initWatch(undefined, path, wh, processPath); + } else { + let realPath; + try { + realPath = await realpath(wh.watchPath); + } catch (e) {} + this.initWatch(realPath, path, wh, processPath); + } + } +} + +} + +module.exports = FsEventsHandler; +module.exports.canUse = canUse; diff --git a/node_modules/chokidar/lib/nodefs-handler.js b/node_modules/chokidar/lib/nodefs-handler.js new file mode 100644 index 0000000..199cfe9 --- /dev/null +++ b/node_modules/chokidar/lib/nodefs-handler.js @@ -0,0 +1,654 @@ +'use strict'; + +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); +const isBinaryPath = require('is-binary-path'); +const { + isWindows, + isLinux, + EMPTY_FN, + EMPTY_STR, + KEY_LISTENERS, + KEY_ERR, + KEY_RAW, + HANDLER_KEYS, + EV_CHANGE, + EV_ADD, + EV_ADD_DIR, + EV_ERROR, + STR_DATA, + STR_END, + BRACE_START, + STAR +} = require('./constants'); + +const THROTTLE_MODE_WATCH = 'watch'; + +const open = promisify(fs.open); +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const close = promisify(fs.close); +const fsrealpath = promisify(fs.realpath); + +const statMethods = { lstat, stat }; + +// TODO: emit errors properly. Example: EMFILE on Macos. +const foreach = (val, fn) => { + if (val instanceof Set) { + val.forEach(fn); + } else { + fn(val); + } +}; + +const addAndConvert = (main, prop, item) => { + let container = main[prop]; + if (!(container instanceof Set)) { + main[prop] = container = new Set([container]); + } + container.add(item); +}; + +const clearItem = cont => key => { + const set = cont[key]; + if (set instanceof Set) { + set.clear(); + } else { + delete cont[key]; + } +}; + +const delFromSet = (main, prop, item) => { + const container = main[prop]; + if (container instanceof Set) { + container.delete(item); + } else if (container === item) { + delete main[prop]; + } +}; + +const isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val; + +/** + * @typedef {String} Path + */ + +// fs_watch helpers + +// object to hold per-process fs_watch instances +// (may be shared across chokidar FSWatcher instances) + +/** + * @typedef {Object} FsWatchContainer + * @property {Set} listeners + * @property {Set} errHandlers + * @property {Set} rawEmitters + * @property {fs.FSWatcher=} watcher + * @property {Boolean=} watcherUnusable + */ + +/** + * @type {Map} + */ +const FsWatchInstances = new Map(); + +/** + * Instantiates the fs_watch interface + * @param {String} path to be watched + * @param {Object} options to be passed to fs_watch + * @param {Function} listener main event handler + * @param {Function} errHandler emits info about errors + * @param {Function} emitRaw emits raw event data + * @returns {fs.FSWatcher} new fsevents instance + */ +function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { + const handleEvent = (rawEvent, evPath) => { + listener(path); + emitRaw(rawEvent, evPath, {watchedPath: path}); + + // emit based on events occurring for files from a directory's watcher in + // case the file's watcher misses it (and rely on throttling to de-dupe) + if (evPath && path !== evPath) { + fsWatchBroadcast( + sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath) + ); + } + }; + try { + return fs.watch(path, options, handleEvent); + } catch (error) { + errHandler(error); + } +} + +/** + * Helper for passing fs_watch event data to a collection of listeners + * @param {Path} fullPath absolute path bound to fs_watch instance + * @param {String} type listener type + * @param {*=} val1 arguments to be passed to listeners + * @param {*=} val2 + * @param {*=} val3 + */ +const fsWatchBroadcast = (fullPath, type, val1, val2, val3) => { + const cont = FsWatchInstances.get(fullPath); + if (!cont) return; + foreach(cont[type], (listener) => { + listener(val1, val2, val3); + }); +}; + +/** + * Instantiates the fs_watch interface or binds listeners + * to an existing one covering the same file system entry + * @param {String} path + * @param {String} fullPath absolute path + * @param {Object} options to be passed to fs_watch + * @param {Object} handlers container for event listener functions + */ +const setFsWatchListener = (path, fullPath, options, handlers) => { + const {listener, errHandler, rawEmitter} = handlers; + let cont = FsWatchInstances.get(fullPath); + + /** @type {fs.FSWatcher=} */ + let watcher; + if (!options.persistent) { + watcher = createFsWatchInstance( + path, options, listener, errHandler, rawEmitter + ); + return watcher.close.bind(watcher); + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_ERR, errHandler); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + watcher = createFsWatchInstance( + path, + options, + fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), + errHandler, // no need to use broadcast here + fsWatchBroadcast.bind(null, fullPath, KEY_RAW) + ); + if (!watcher) return; + watcher.on(EV_ERROR, async (error) => { + const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR); + cont.watcherUnusable = true; // documented since Node 10.4.1 + // Workaround for https://github.com/joyent/node/issues/4337 + if (isWindows && error.code === 'EPERM') { + try { + const fd = await open(path, 'r'); + await close(fd); + broadcastErr(error); + } catch (err) {} + } else { + broadcastErr(error); + } + }); + cont = { + listeners: listener, + errHandlers: errHandler, + rawEmitters: rawEmitter, + watcher + }; + FsWatchInstances.set(fullPath, cont); + } + // const index = cont.listeners.indexOf(listener); + + // removes this instance's listeners and closes the underlying fs_watch + // instance if there are no more listeners left + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_ERR, errHandler); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + // Check to protect against issue gh-730. + // if (cont.watcherUnusable) { + cont.watcher.close(); + // } + FsWatchInstances.delete(fullPath); + HANDLER_KEYS.forEach(clearItem(cont)); + cont.watcher = undefined; + Object.freeze(cont); + } + }; +}; + +// fs_watchFile helpers + +// object to hold per-process fs_watchFile instances +// (may be shared across chokidar FSWatcher instances) +const FsWatchFileInstances = new Map(); + +/** + * Instantiates the fs_watchFile interface or binds listeners + * to an existing one covering the same file system entry + * @param {String} path to be watched + * @param {String} fullPath absolute path + * @param {Object} options options to be passed to fs_watchFile + * @param {Object} handlers container for event listener functions + * @returns {Function} closer + */ +const setFsWatchFileListener = (path, fullPath, options, handlers) => { + const {listener, rawEmitter} = handlers; + let cont = FsWatchFileInstances.get(fullPath); + + /* eslint-disable no-unused-vars, prefer-destructuring */ + let listeners = new Set(); + let rawEmitters = new Set(); + + const copts = cont && cont.options; + if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) { + // "Upgrade" the watcher to persistence or a quicker interval. + // This creates some unlikely edge case issues if the user mixes + // settings in a very weird way, but solving for those cases + // doesn't seem worthwhile for the added complexity. + listeners = cont.listeners; + rawEmitters = cont.rawEmitters; + fs.unwatchFile(fullPath); + cont = undefined; + } + + /* eslint-enable no-unused-vars, prefer-destructuring */ + + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + // TODO + // listeners.add(listener); + // rawEmitters.add(rawEmitter); + cont = { + listeners: listener, + rawEmitters: rawEmitter, + options, + watcher: fs.watchFile(fullPath, options, (curr, prev) => { + foreach(cont.rawEmitters, (rawEmitter) => { + rawEmitter(EV_CHANGE, fullPath, {curr, prev}); + }); + const currmtime = curr.mtimeMs; + if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) { + foreach(cont.listeners, (listener) => listener(path, curr)); + } + }) + }; + FsWatchFileInstances.set(fullPath, cont); + } + // const index = cont.listeners.indexOf(listener); + + // Removes this instance's listeners and closes the underlying fs_watchFile + // instance if there are no more listeners left. + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + FsWatchFileInstances.delete(fullPath); + fs.unwatchFile(fullPath); + cont.options = cont.watcher = undefined; + Object.freeze(cont); + } + }; +}; + +/** + * @mixin + */ +class NodeFsHandler { + +/** + * @param {import("../index").FSWatcher} fsW + */ +constructor(fsW) { + this.fsw = fsW; + this._boundHandleError = (error) => fsW._handleError(error); +} + +/** + * Watch file for changes with fs_watchFile or fs_watch. + * @param {String} path to file or dir + * @param {Function} listener on fs change + * @returns {Function} closer for the watcher instance + */ +_watchWithNodeFs(path, listener) { + const opts = this.fsw.options; + const directory = sysPath.dirname(path); + const basename = sysPath.basename(path); + const parent = this.fsw._getWatchedDir(directory); + parent.add(basename); + const absolutePath = sysPath.resolve(path); + const options = {persistent: opts.persistent}; + if (!listener) listener = EMPTY_FN; + + let closer; + if (opts.usePolling) { + options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ? + opts.binaryInterval : opts.interval; + closer = setFsWatchFileListener(path, absolutePath, options, { + listener, + rawEmitter: this.fsw._emitRaw + }); + } else { + closer = setFsWatchListener(path, absolutePath, options, { + listener, + errHandler: this._boundHandleError, + rawEmitter: this.fsw._emitRaw + }); + } + return closer; +} + +/** + * Watch a file and emit add event if warranted. + * @param {Path} file Path + * @param {fs.Stats} stats result of fs_stat + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @returns {Function} closer for the watcher instance + */ +_handleFile(file, stats, initialAdd) { + if (this.fsw.closed) { + return; + } + const dirname = sysPath.dirname(file); + const basename = sysPath.basename(file); + const parent = this.fsw._getWatchedDir(dirname); + // stats is always present + let prevStats = stats; + + // if the file is already being watched, do nothing + if (parent.has(basename)) return; + + const listener = async (path, newStats) => { + if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return; + if (!newStats || newStats.mtimeMs === 0) { + try { + const newStats = await stat(file); + if (this.fsw.closed) return; + // Check that change event was not fired because of changed only accessTime. + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + if (isLinux && prevStats.ino !== newStats.ino) { + this.fsw._closeFile(path) + prevStats = newStats; + this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener)); + } else { + prevStats = newStats; + } + } catch (error) { + // Fix issues where mtime is null but file is still present + this.fsw._remove(dirname, basename); + } + // add is about to be emitted if file not already tracked in parent + } else if (parent.has(basename)) { + // Check that change event was not fired because of changed only accessTime. + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + prevStats = newStats; + } + } + // kick off the watcher + const closer = this._watchWithNodeFs(file, listener); + + // emit an add event if we're supposed to + if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) { + if (!this.fsw._throttle(EV_ADD, file, 0)) return; + this.fsw._emit(EV_ADD, file, stats); + } + + return closer; +} + +/** + * Handle symlinks encountered while reading a dir. + * @param {Object} entry returned by readdirp + * @param {String} directory path of dir being read + * @param {String} path of this item + * @param {String} item basename of this item + * @returns {Promise} true if no more processing is needed for this entry. + */ +async _handleSymlink(entry, directory, path, item) { + if (this.fsw.closed) { + return; + } + const full = entry.fullPath; + const dir = this.fsw._getWatchedDir(directory); + + if (!this.fsw.options.followSymlinks) { + // watch symlink directly (don't follow) and detect changes + this.fsw._incrReadyCount(); + + let linkPath; + try { + linkPath = await fsrealpath(path); + } catch (e) { + this.fsw._emitReady(); + return true; + } + + if (this.fsw.closed) return; + if (dir.has(item)) { + if (this.fsw._symlinkPaths.get(full) !== linkPath) { + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_CHANGE, path, entry.stats); + } + } else { + dir.add(item); + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_ADD, path, entry.stats); + } + this.fsw._emitReady(); + return true; + } + + // don't follow the same symlink more than once + if (this.fsw._symlinkPaths.has(full)) { + return true; + } + + this.fsw._symlinkPaths.set(full, true); +} + +_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) { + // Normalize the directory name on Windows + directory = sysPath.join(directory, EMPTY_STR); + + if (!wh.hasGlob) { + throttler = this.fsw._throttle('readdir', directory, 1000); + if (!throttler) return; + } + + const previous = this.fsw._getWatchedDir(wh.path); + const current = new Set(); + + let stream = this.fsw._readdirp(directory, { + fileFilter: entry => wh.filterPath(entry), + directoryFilter: entry => wh.filterDir(entry), + depth: 0 + }).on(STR_DATA, async (entry) => { + if (this.fsw.closed) { + stream = undefined; + return; + } + const item = entry.path; + let path = sysPath.join(directory, item); + current.add(item); + + if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) { + return; + } + + if (this.fsw.closed) { + stream = undefined; + return; + } + // Files that present in current directory snapshot + // but absent in previous are added to watch list and + // emit `add` event. + if (item === target || !target && !previous.has(item)) { + this.fsw._incrReadyCount(); + + // ensure relativeness of path is preserved in case of watcher reuse + path = sysPath.join(dir, sysPath.relative(dir, path)); + + this._addToNodeFs(path, initialAdd, wh, depth + 1); + } + }).on(EV_ERROR, this._boundHandleError); + + return new Promise(resolve => + stream.once(STR_END, () => { + if (this.fsw.closed) { + stream = undefined; + return; + } + const wasThrottled = throttler ? throttler.clear() : false; + + resolve(); + + // Files that absent in current directory snapshot + // but present in previous emit `remove` event + // and are removed from @watched[directory]. + previous.getChildren().filter((item) => { + return item !== directory && + !current.has(item) && + // in case of intersecting globs; + // a path may have been filtered out of this readdir, but + // shouldn't be removed because it matches a different glob + (!wh.hasGlob || wh.filterPath({ + fullPath: sysPath.resolve(directory, item) + })); + }).forEach((item) => { + this.fsw._remove(directory, item); + }); + + stream = undefined; + + // one more time for any missed in case changes came in extremely quickly + if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler); + }) + ); +} + +/** + * Read directory to add / remove files from `@watched` list and re-read it on change. + * @param {String} dir fs path + * @param {fs.Stats} stats + * @param {Boolean} initialAdd + * @param {Number} depth relative to user-supplied path + * @param {String} target child path targeted for watch + * @param {Object} wh Common watch helpers for this path + * @param {String} realpath + * @returns {Promise} closer for the watcher instance. + */ +async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) { + const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir)); + const tracked = parentDir.has(sysPath.basename(dir)); + if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) { + if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats); + } + + // ensure dir is tracked (harmless if redundant) + parentDir.add(sysPath.basename(dir)); + this.fsw._getWatchedDir(dir); + let throttler; + let closer; + + const oDepth = this.fsw.options.depth; + if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) { + if (!target) { + await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler); + if (this.fsw.closed) return; + } + + closer = this._watchWithNodeFs(dir, (dirPath, stats) => { + // if current directory is removed, do nothing + if (stats && stats.mtimeMs === 0) return; + + this._handleRead(dirPath, false, wh, target, dir, depth, throttler); + }); + } + return closer; +} + +/** + * Handle added file, directory, or glob pattern. + * Delegates call to _handleFile / _handleDir after checks. + * @param {String} path to file or ir + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @param {Object} priorWh depth relative to user-supplied path + * @param {Number} depth Child path actually targeted for watch + * @param {String=} target Child path actually targeted for watch + * @returns {Promise} + */ +async _addToNodeFs(path, initialAdd, priorWh, depth, target) { + const ready = this.fsw._emitReady; + if (this.fsw._isIgnored(path) || this.fsw.closed) { + ready(); + return false; + } + + const wh = this.fsw._getWatchHelpers(path, depth); + if (!wh.hasGlob && priorWh) { + wh.hasGlob = priorWh.hasGlob; + wh.globFilter = priorWh.globFilter; + wh.filterPath = entry => priorWh.filterPath(entry); + wh.filterDir = entry => priorWh.filterDir(entry); + } + + // evaluate what is at the path we're being asked to watch + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + ready(); + return false; + } + + const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START); + let closer; + if (stats.isDirectory()) { + const absPath = sysPath.resolve(path); + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) return; + closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath); + if (this.fsw.closed) return; + // preserve this symlink's target path + if (absPath !== targetPath && targetPath !== undefined) { + this.fsw._symlinkPaths.set(absPath, targetPath); + } + } else if (stats.isSymbolicLink()) { + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) return; + const parent = sysPath.dirname(wh.watchPath); + this.fsw._getWatchedDir(parent).add(wh.watchPath); + this.fsw._emit(EV_ADD, wh.watchPath, stats); + closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath); + if (this.fsw.closed) return; + + // preserve this symlink's target path + if (targetPath !== undefined) { + this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath); + } + } else { + closer = this._handleFile(wh.watchPath, stats, initialAdd); + } + ready(); + + this.fsw._addPathCloser(path, closer); + return false; + + } catch (error) { + if (this.fsw._handleError(error)) { + ready(); + return path; + } + } +} + +} + +module.exports = NodeFsHandler; diff --git a/node_modules/chokidar/package.json b/node_modules/chokidar/package.json new file mode 100644 index 0000000..e8f8b3d --- /dev/null +++ b/node_modules/chokidar/package.json @@ -0,0 +1,70 @@ +{ + "name": "chokidar", + "description": "Minimal and efficient cross-platform file watching library", + "version": "3.6.0", + "homepage": "https://github.com/paulmillr/chokidar", + "author": "Paul Miller (https://paulmillr.com)", + "contributors": [ + "Paul Miller (https://paulmillr.com)", + "Elan Shanker" + ], + "engines": { + "node": ">= 8.10.0" + }, + "main": "index.js", + "types": "./types/index.d.ts", + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "devDependencies": { + "@types/node": "^14", + "chai": "^4.3", + "dtslint": "^3.3.0", + "eslint": "^7.0.0", + "mocha": "^7.0.0", + "rimraf": "^3.0.0", + "sinon": "^9.0.1", + "sinon-chai": "^3.3.0", + "typescript": "^4.4.3", + "upath": "^1.2.0" + }, + "files": [ + "index.js", + "lib/*.js", + "types/index.d.ts" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/paulmillr/chokidar.git" + }, + "bugs": { + "url": "https://github.com/paulmillr/chokidar/issues" + }, + "license": "MIT", + "scripts": { + "dtslint": "dtslint types", + "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", + "build": "npm ls", + "mocha": "mocha --exit --timeout 90000", + "test": "npm run lint && npm run mocha" + }, + "keywords": [ + "fs", + "watch", + "watchFile", + "watcher", + "watching", + "file", + "fsevents" + ], + "funding": "https://paulmillr.com/funding/" +} diff --git a/node_modules/chokidar/types/index.d.ts b/node_modules/chokidar/types/index.d.ts new file mode 100644 index 0000000..4558066 --- /dev/null +++ b/node_modules/chokidar/types/index.d.ts @@ -0,0 +1,192 @@ +// TypeScript Version: 3.0 + +/// + +import * as fs from "fs"; +import { EventEmitter } from "events"; +import { Matcher } from 'anymatch'; + +export class FSWatcher extends EventEmitter implements fs.FSWatcher { + options: WatchOptions; + + /** + * Constructs a new FSWatcher instance with optional WatchOptions parameter. + */ + constructor(options?: WatchOptions); + + /** + * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one + * string. + */ + add(paths: string | ReadonlyArray): this; + + /** + * Stop watching files, directories, or glob patterns. Takes an array of strings or just one + * string. + */ + unwatch(paths: string | ReadonlyArray): this; + + /** + * Returns an object representing all the paths on the file system being watched by this + * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless + * the `cwd` option was used), and the values are arrays of the names of the items contained in + * each directory. + */ + getWatched(): { + [directory: string]: string[]; + }; + + /** + * Removes all listeners from watched files. + */ + close(): Promise; + + on(event: 'add'|'addDir'|'change', listener: (path: string, stats?: fs.Stats) => void): this; + + on(event: 'all', listener: (eventName: 'add'|'addDir'|'change'|'unlink'|'unlinkDir', path: string, stats?: fs.Stats) => void): this; + + /** + * Error occurred + */ + on(event: 'error', listener: (error: Error) => void): this; + + /** + * Exposes the native Node `fs.FSWatcher events` + */ + on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this; + + /** + * Fires when the initial scan is complete + */ + on(event: 'ready', listener: () => void): this; + + on(event: 'unlink'|'unlinkDir', listener: (path: string) => void): this; + + on(event: string, listener: (...args: any[]) => void): this; + + ref(): this; + + unref(): this; +} + +export interface WatchOptions { + /** + * Indicates whether the process should continue to run as long as files are being watched. If + * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`, + * even if the process continues to run. + */ + persistent?: boolean; + + /** + * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to + * be ignored. The whole relative or absolute path is tested, not just filename. If a function + * with two arguments is provided, it gets called twice per path - once with a single argument + * (the path), second time with two arguments (the path and the + * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path). + */ + ignored?: Matcher; + + /** + * If set to `false` then `add`/`addDir` events are also emitted for matching paths while + * instantiating the watching as chokidar discovers these file paths (before the `ready` event). + */ + ignoreInitial?: boolean; + + /** + * When `false`, only the symlinks themselves will be watched for changes instead of following + * the link references and bubbling events through the link's path. + */ + followSymlinks?: boolean; + + /** + * The base directory from which watch `paths` are to be derived. Paths emitted with events will + * be relative to this. + */ + cwd?: string; + + /** + * If set to true then the strings passed to .watch() and .add() are treated as literal path + * names, even if they look like globs. Default: false. + */ + disableGlobbing?: boolean; + + /** + * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU + * utilization, consider setting this to `false`. It is typically necessary to **set this to + * `true` to successfully watch files over a network**, and it may be necessary to successfully + * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides + * the `useFsEvents` default. + */ + usePolling?: boolean; + + /** + * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly + * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on + * OS X, `usePolling: true` becomes the default. + */ + useFsEvents?: boolean; + + /** + * If relying upon the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that + * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is + * provided even in cases where it wasn't already available from the underlying watch events. + */ + alwaysStat?: boolean; + + /** + * If set, limits how many levels of subdirectories will be traversed. + */ + depth?: number; + + /** + * Interval of file system polling. + */ + interval?: number; + + /** + * Interval of file system polling for binary files. ([see list of binary extensions](https://gi + * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) + */ + binaryInterval?: number; + + /** + * Indicates whether to watch files that don't have read permissions if possible. If watching + * fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed + * silently. + */ + ignorePermissionErrors?: boolean; + + /** + * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts + * that occur when using editors that use "atomic writes" instead of writing directly to the + * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change` + * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you, + * you can override it by setting `atomic` to a custom value, in milliseconds. + */ + atomic?: boolean | number; + + /** + * can be set to an object in order to adjust timing params: + */ + awaitWriteFinish?: AwaitWriteFinishOptions | boolean; +} + +export interface AwaitWriteFinishOptions { + /** + * Amount of time in milliseconds for a file size to remain constant before emitting its event. + */ + stabilityThreshold?: number; + + /** + * File size polling interval. + */ + pollInterval?: number; +} + +/** + * produces an instance of `FSWatcher`. + */ +export function watch( + paths: string | ReadonlyArray, + options?: WatchOptions +): FSWatcher; diff --git a/node_modules/color-convert/CHANGELOG.md b/node_modules/color-convert/CHANGELOG.md new file mode 100644 index 0000000..0a7bce4 --- /dev/null +++ b/node_modules/color-convert/CHANGELOG.md @@ -0,0 +1,54 @@ +# 1.0.0 - 2016-01-07 + +- Removed: unused speed test +- Added: Automatic routing between previously unsupported conversions +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Removed: `convert()` class +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Changed: all functions to lookup dictionary +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Changed: `ansi` to `ansi256` +([#27](https://github.com/Qix-/color-convert/pull/27)) +- Fixed: argument grouping for functions requiring only one argument +([#27](https://github.com/Qix-/color-convert/pull/27)) + +# 0.6.0 - 2015-07-23 + +- Added: methods to handle +[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors: + - rgb2ansi16 + - rgb2ansi + - hsl2ansi16 + - hsl2ansi + - hsv2ansi16 + - hsv2ansi + - hwb2ansi16 + - hwb2ansi + - cmyk2ansi16 + - cmyk2ansi + - keyword2ansi16 + - keyword2ansi + - ansi162rgb + - ansi162hsl + - ansi162hsv + - ansi162hwb + - ansi162cmyk + - ansi162keyword + - ansi2rgb + - ansi2hsl + - ansi2hsv + - ansi2hwb + - ansi2cmyk + - ansi2keyword +([#18](https://github.com/harthur/color-convert/pull/18)) + +# 0.5.3 - 2015-06-02 + +- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]` +([#15](https://github.com/harthur/color-convert/issues/15)) + +--- + +Check out commit logs for older releases diff --git a/node_modules/color-convert/LICENSE b/node_modules/color-convert/LICENSE new file mode 100644 index 0000000..5b4c386 --- /dev/null +++ b/node_modules/color-convert/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2016 Heather Arthur + +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/color-convert/README.md b/node_modules/color-convert/README.md new file mode 100644 index 0000000..d4b08fc --- /dev/null +++ b/node_modules/color-convert/README.md @@ -0,0 +1,68 @@ +# color-convert + +[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert) + +Color-convert is a color conversion library for JavaScript and node. +It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest): + +```js +var convert = require('color-convert'); + +convert.rgb.hsl(140, 200, 100); // [96, 48, 59] +convert.keyword.rgb('blue'); // [0, 0, 255] + +var rgbChannels = convert.rgb.channels; // 3 +var cmykChannels = convert.cmyk.channels; // 4 +var ansiChannels = convert.ansi16.channels; // 1 +``` + +# Install + +```console +$ npm install color-convert +``` + +# API + +Simply get the property of the _from_ and _to_ conversion that you're looking for. + +All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function. + +All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha). + +```js +var convert = require('color-convert'); + +// Hex to LAB +convert.hex.lab('DEADBF'); // [ 76, 21, -2 ] +convert.hex.lab.raw('DEADBF'); // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ] + +// RGB to CMYK +convert.rgb.cmyk(167, 255, 4); // [ 35, 0, 98, 0 ] +convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ] +``` + +### Arrays +All functions that accept multiple arguments also support passing an array. + +Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.) + +```js +var convert = require('color-convert'); + +convert.rgb.hex(123, 45, 67); // '7B2D43' +convert.rgb.hex([123, 45, 67]); // '7B2D43' +``` + +## Routing + +Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex). + +Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js). + +# Contribute + +If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request. + +# License +Copyright © 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE). diff --git a/node_modules/color-convert/conversions.js b/node_modules/color-convert/conversions.js new file mode 100644 index 0000000..2657f26 --- /dev/null +++ b/node_modules/color-convert/conversions.js @@ -0,0 +1,839 @@ +/* MIT license */ +/* eslint-disable no-mixed-operators */ +const cssKeywords = require('color-name'); + +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) + +const reverseKeywords = {}; +for (const key of Object.keys(cssKeywords)) { + reverseKeywords[cssKeywords[key]] = key; +} + +const convert = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; + +module.exports = convert; + +// Hide .channels and .labels properties +for (const model of Object.keys(convert)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } + + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } + + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } + + const {channels, labels} = convert[model]; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); +} + +convert.rgb.hsl = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; + + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } + + h = Math.min(h * 60, 360); + + if (h < 0) { + h += 360; + } + + const l = (min + max) / 2; + + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + + return [h, s * 100, l * 100]; +}; + +convert.rgb.hsv = function (rgb) { + let rdif; + let gdif; + let bdif; + let h; + let s; + + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const v = Math.max(r, g, b); + const diff = v - Math.min(r, g, b); + const diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; + + if (diff === 0) { + h = 0; + s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } + + return [ + h * 360, + s * 100, + v * 100 + ]; +}; + +convert.rgb.hwb = function (rgb) { + const r = rgb[0]; + const g = rgb[1]; + let b = rgb[2]; + const h = convert.rgb.hsl(rgb)[0]; + const w = 1 / 255 * Math.min(r, Math.min(g, b)); + + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; +}; + +convert.rgb.cmyk = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + + const k = Math.min(1 - r, 1 - g, 1 - b); + const c = (1 - r - k) / (1 - k) || 0; + const m = (1 - g - k) / (1 - k) || 0; + const y = (1 - b - k) / (1 - k) || 0; + + return [c * 100, m * 100, y * 100, k * 100]; +}; + +function comparativeDistance(x, y) { + /* + See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + */ + return ( + ((x[0] - y[0]) ** 2) + + ((x[1] - y[1]) ** 2) + + ((x[2] - y[2]) ** 2) + ); +} + +convert.rgb.keyword = function (rgb) { + const reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + + let currentClosestDistance = Infinity; + let currentClosestKeyword; + + for (const keyword of Object.keys(cssKeywords)) { + const value = cssKeywords[keyword]; + + // Compute comparative distance + const distance = comparativeDistance(rgb, value); + + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + + return currentClosestKeyword; +}; + +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; + +convert.rgb.xyz = function (rgb) { + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; + + // Assume sRGB + r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); + g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); + b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); + + const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y * 100, z * 100]; +}; + +convert.rgb.lab = function (rgb) { + const xyz = convert.rgb.xyz(rgb); + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); + + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); + + return [l, a, b]; +}; + +convert.hsl.rgb = function (hsl) { + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t2; + let t3; + let val; + + if (s === 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + + const t1 = 2 * l - t2; + + const rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + + if (t3 > 1) { + t3--; + } + + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + + rgb[i] = val * 255; + } + + return rgb; +}; + +convert.hsl.hsv = function (hsl) { + const h = hsl[0]; + let s = hsl[1] / 100; + let l = hsl[2] / 100; + let smin = s; + const lmin = Math.max(l, 0.01); + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + const v = (l + s) / 2; + const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + + return [h, sv * 100, v * 100]; +}; + +convert.hsv.rgb = function (hsv) { + const h = hsv[0] / 60; + const s = hsv[1] / 100; + let v = hsv[2] / 100; + const hi = Math.floor(h) % 6; + + const f = h - Math.floor(h); + const p = 255 * v * (1 - s); + const q = 255 * v * (1 - (s * f)); + const t = 255 * v * (1 - (s * (1 - f))); + v *= 255; + + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; + +convert.hsv.hsl = function (hsv) { + const h = hsv[0]; + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const vmin = Math.max(v, 0.01); + let sl; + let l; + + l = (2 - s) * v; + const lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + + return [h, sl * 100, l * 100]; +}; + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let f; + + // Wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + const i = Math.floor(6 * h); + const v = 1 - bl; + f = 6 * h - i; + + if ((i & 0x01) !== 0) { + f = 1 - f; + } + + const n = wh + f * (v - wh); // Linear interpolation + + let r; + let g; + let b; + /* eslint-disable max-statements-per-line,no-multi-spaces */ + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + /* eslint-enable max-statements-per-line,no-multi-spaces */ + + return [r * 255, g * 255, b * 255]; +}; + +convert.cmyk.rgb = function (cmyk) { + const c = cmyk[0] / 100; + const m = cmyk[1] / 100; + const y = cmyk[2] / 100; + const k = cmyk[3] / 100; + + const r = 1 - Math.min(1, c * (1 - k) + k); + const g = 1 - Math.min(1, m * (1 - k) + k); + const b = 1 - Math.min(1, y * (1 - k) + k); + + return [r * 255, g * 255, b * 255]; +}; + +convert.xyz.rgb = function (xyz) { + const x = xyz[0] / 100; + const y = xyz[1] / 100; + const z = xyz[2] / 100; + let r; + let g; + let b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // Assume sRGB + r = r > 0.0031308 + ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055) + : r * 12.92; + + g = g > 0.0031308 + ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055) + : g * 12.92; + + b = b > 0.0031308 + ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055) + : b * 12.92; + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +}; + +convert.xyz.lab = function (xyz) { + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); + + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); + + return [l, a, b]; +}; + +convert.lab.xyz = function (lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let x; + let y; + let z; + + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; + + const y2 = y ** 3; + const x2 = x ** 3; + const z2 = z ** 3; + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + + x *= 95.047; + y *= 100; + z *= 108.883; + + return [x, y, z]; +}; + +convert.lab.lch = function (lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let h; + + const hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + + if (h < 0) { + h += 360; + } + + const c = Math.sqrt(a * a + b * b); + + return [l, c, h]; +}; + +convert.lch.lab = function (lch) { + const l = lch[0]; + const c = lch[1]; + const h = lch[2]; + + const hr = h / 360 * 2 * Math.PI; + const a = c * Math.cos(hr); + const b = c * Math.sin(hr); + + return [l, a, b]; +}; + +convert.rgb.ansi16 = function (args, saturation = null) { + const [r, g, b] = args; + let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization + + value = Math.round(value / 50); + + if (value === 0) { + return 30; + } + + let ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + + if (value === 2) { + ansi += 60; + } + + return ansi; +}; + +convert.hsv.ansi16 = function (args) { + // Optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; + +convert.rgb.ansi256 = function (args) { + const r = args[0]; + const g = args[1]; + const b = args[2]; + + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } + + if (r > 248) { + return 231; + } + + return Math.round(((r - 8) / 247) * 24) + 232; + } + + const ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); + + return ansi; +}; + +convert.ansi16.rgb = function (args) { + let color = args % 10; + + // Handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } + + color = color / 10.5 * 255; + + return [color, color, color]; + } + + const mult = (~~(args > 50) + 1) * 0.5; + const r = ((color & 1) * mult) * 255; + const g = (((color >> 1) & 1) * mult) * 255; + const b = (((color >> 2) & 1) * mult) * 255; + + return [r, g, b]; +}; + +convert.ansi256.rgb = function (args) { + // Handle greyscale + if (args >= 232) { + const c = (args - 232) * 10 + 8; + return [c, c, c]; + } + + args -= 16; + + let rem; + const r = Math.floor(args / 36) / 5 * 255; + const g = Math.floor((rem = args % 36) / 6) / 5 * 255; + const b = (rem % 6) / 5 * 255; + + return [r, g, b]; +}; + +convert.rgb.hex = function (args) { + const integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); + + const string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; + +convert.hex.rgb = function (args) { + const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } + + let colorString = match[0]; + + if (match[0].length === 3) { + colorString = colorString.split('').map(char => { + return char + char; + }).join(''); + } + + const integer = parseInt(colorString, 16); + const r = (integer >> 16) & 0xFF; + const g = (integer >> 8) & 0xFF; + const b = integer & 0xFF; + + return [r, g, b]; +}; + +convert.rgb.hcg = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(Math.max(r, g), b); + const min = Math.min(Math.min(r, g), b); + const chroma = (max - min); + let grayscale; + let hue; + + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } + + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma; + } + + hue /= 6; + hue %= 1; + + return [hue * 360, chroma * 100, grayscale * 100]; +}; + +convert.hsl.hcg = function (hsl) { + const s = hsl[1] / 100; + const l = hsl[2] / 100; + + const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l)); + + let f = 0; + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } + + return [hsl[0], c * 100, f * 100]; +}; + +convert.hsv.hcg = function (hsv) { + const s = hsv[1] / 100; + const v = hsv[2] / 100; + + const c = s * v; + let f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); + } + + return [hsv[0], c * 100, f * 100]; +}; + +convert.hcg.rgb = function (hcg) { + const h = hcg[0] / 360; + const c = hcg[1] / 100; + const g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } + + const pure = [0, 0, 0]; + const hi = (h % 1) * 6; + const v = hi % 1; + const w = 1 - v; + let mg = 0; + + /* eslint-disable max-statements-per-line */ + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + /* eslint-enable max-statements-per-line */ + + mg = (1.0 - c) * g; + + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; + +convert.hcg.hsv = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + + const v = c + g * (1.0 - c); + let f = 0; + + if (v > 0.0) { + f = c / v; + } + + return [hcg[0], f * 100, v * 100]; +}; + +convert.hcg.hsl = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + + const l = g * (1.0 - c) + 0.5 * c; + let s = 0; + + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + + return [hcg[0], s * 100, l * 100]; +}; + +convert.hcg.hwb = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; + +convert.hwb.hcg = function (hwb) { + const w = hwb[1] / 100; + const b = hwb[2] / 100; + const v = 1 - b; + const c = v - w; + let g = 0; + + if (c < 1) { + g = (v - c) / (1 - c); + } + + return [hwb[0], c * 100, g * 100]; +}; + +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; +}; + +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; + +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; + +convert.gray.hsl = function (args) { + return [0, 0, args[0]]; +}; + +convert.gray.hsv = convert.gray.hsl; + +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; + +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; + +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; +}; + +convert.gray.hex = function (gray) { + const val = Math.round(gray[0] / 100 * 255) & 0xFF; + const integer = (val << 16) + (val << 8) + val; + + const string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; + +convert.rgb.gray = function (rgb) { + const val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; diff --git a/node_modules/color-convert/index.js b/node_modules/color-convert/index.js new file mode 100644 index 0000000..b648e57 --- /dev/null +++ b/node_modules/color-convert/index.js @@ -0,0 +1,81 @@ +const conversions = require('./conversions'); +const route = require('./route'); + +const convert = {}; + +const models = Object.keys(conversions); + +function wrapRaw(fn) { + const wrappedFn = function (...args) { + const arg0 = args[0]; + if (arg0 === undefined || arg0 === null) { + return arg0; + } + + if (arg0.length > 1) { + args = arg0; + } + + return fn(args); + }; + + // Preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; +} + +function wrapRounded(fn) { + const wrappedFn = function (...args) { + const arg0 = args[0]; + + if (arg0 === undefined || arg0 === null) { + return arg0; + } + + if (arg0.length > 1) { + args = arg0; + } + + const result = fn(args); + + // We're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (let len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // Preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } + + return wrappedFn; +} + +models.forEach(fromModel => { + convert[fromModel] = {}; + + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); + + const routes = route(fromModel); + const routeModels = Object.keys(routes); + + routeModels.forEach(toModel => { + const fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); + +module.exports = convert; diff --git a/node_modules/color-convert/package.json b/node_modules/color-convert/package.json new file mode 100644 index 0000000..6e48000 --- /dev/null +++ b/node_modules/color-convert/package.json @@ -0,0 +1,48 @@ +{ + "name": "color-convert", + "description": "Plain color conversion functions", + "version": "2.0.1", + "author": "Heather Arthur ", + "license": "MIT", + "repository": "Qix-/color-convert", + "scripts": { + "pretest": "xo", + "test": "node test/basic.js" + }, + "engines": { + "node": ">=7.0.0" + }, + "keywords": [ + "color", + "colour", + "convert", + "converter", + "conversion", + "rgb", + "hsl", + "hsv", + "hwb", + "cmyk", + "ansi", + "ansi16" + ], + "files": [ + "index.js", + "conversions.js", + "route.js" + ], + "xo": { + "rules": { + "default-case": 0, + "no-inline-comments": 0, + "operator-linebreak": 0 + } + }, + "devDependencies": { + "chalk": "^2.4.2", + "xo": "^0.24.0" + }, + "dependencies": { + "color-name": "~1.1.4" + } +} diff --git a/node_modules/color-convert/route.js b/node_modules/color-convert/route.js new file mode 100644 index 0000000..1a08521 --- /dev/null +++ b/node_modules/color-convert/route.js @@ -0,0 +1,97 @@ +const conversions = require('./conversions'); + +/* + This function routes a model to all other models. + + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). + + conversions that are not possible simply are not included. +*/ + +function buildGraph() { + const graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + const models = Object.keys(conversions); + + for (let len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; +} + +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + const graph = buildGraph(); + const queue = [fromModel]; // Unshift -> queue -> pop + + graph[fromModel].distance = 0; + + while (queue.length) { + const current = queue.pop(); + const adjacents = Object.keys(conversions[current]); + + for (let len = adjacents.length, i = 0; i < len; i++) { + const adjacent = adjacents[i]; + const node = graph[adjacent]; + + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } + + return graph; +} + +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} + +function wrapConversion(toModel, graph) { + const path = [graph[toModel].parent, toModel]; + let fn = conversions[graph[toModel].parent][toModel]; + + let cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } + + fn.conversion = path; + return fn; +} + +module.exports = function (fromModel) { + const graph = deriveBFS(fromModel); + const conversion = {}; + + const models = Object.keys(graph); + for (let len = models.length, i = 0; i < len; i++) { + const toModel = models[i]; + const node = graph[toModel]; + + if (node.parent === null) { + // No possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; +}; + diff --git a/node_modules/color-name/LICENSE b/node_modules/color-name/LICENSE new file mode 100644 index 0000000..c6b1001 --- /dev/null +++ b/node_modules/color-name/LICENSE @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +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. \ No newline at end of file diff --git a/node_modules/color-name/README.md b/node_modules/color-name/README.md new file mode 100644 index 0000000..932b979 --- /dev/null +++ b/node_modules/color-name/README.md @@ -0,0 +1,11 @@ +A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors. + +[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/) + + +```js +var colors = require('color-name'); +colors.red //[255,0,0] +``` + + diff --git a/node_modules/color-name/index.js b/node_modules/color-name/index.js new file mode 100644 index 0000000..b7c198a --- /dev/null +++ b/node_modules/color-name/index.js @@ -0,0 +1,152 @@ +'use strict' + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; diff --git a/node_modules/color-name/package.json b/node_modules/color-name/package.json new file mode 100644 index 0000000..782dd82 --- /dev/null +++ b/node_modules/color-name/package.json @@ -0,0 +1,28 @@ +{ + "name": "color-name", + "version": "1.1.4", + "description": "A list of color names and its values", + "main": "index.js", + "files": [ + "index.js" + ], + "scripts": { + "test": "node test.js" + }, + "repository": { + "type": "git", + "url": "git@github.com:colorjs/color-name.git" + }, + "keywords": [ + "color-name", + "color", + "color-keyword", + "keyword" + ], + "author": "DY ", + "license": "MIT", + "bugs": { + "url": "https://github.com/colorjs/color-name/issues" + }, + "homepage": "https://github.com/colorjs/color-name" +} diff --git a/node_modules/color-string/LICENSE b/node_modules/color-string/LICENSE new file mode 100644 index 0000000..a8b08d4 --- /dev/null +++ b/node_modules/color-string/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011 Heather Arthur + +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/color-string/README.md b/node_modules/color-string/README.md new file mode 100644 index 0000000..e58670c --- /dev/null +++ b/node_modules/color-string/README.md @@ -0,0 +1,62 @@ +# color-string + +> library for parsing and generating CSS color strings. + +## Install + +With [npm](http://npmjs.org/): + +```console +$ npm install color-string +``` + +## Usage + +### Parsing + +```js +colorString.get('#FFF') // {model: 'rgb', value: [255, 255, 255, 1]} +colorString.get('#FFFA') // {model: 'rgb', value: [255, 255, 255, 0.67]} +colorString.get('#FFFFFFAA') // {model: 'rgb', value: [255, 255, 255, 0.67]} +colorString.get('hsl(360, 100%, 50%)') // {model: 'hsl', value: [0, 100, 50, 1]} +colorString.get('hsl(360 100% 50%)') // {model: 'hsl', value: [0, 100, 50, 1]} +colorString.get('hwb(60, 3%, 60%)') // {model: 'hwb', value: [60, 3, 60, 1]} + +colorString.get.rgb('#FFF') // [255, 255, 255, 1] +colorString.get.rgb('blue') // [0, 0, 255, 1] +colorString.get.rgb('rgba(200, 60, 60, 0.3)') // [200, 60, 60, 0.3] +colorString.get.rgb('rgba(200 60 60 / 0.3)') // [200, 60, 60, 0.3] +colorString.get.rgb('rgba(200 60 60 / 30%)') // [200, 60, 60, 0.3] +colorString.get.rgb('rgb(200, 200, 200)') // [200, 200, 200, 1] +colorString.get.rgb('rgb(200 200 200)') // [200, 200, 200, 1] + +colorString.get.hsl('hsl(360, 100%, 50%)') // [0, 100, 50, 1] +colorString.get.hsl('hsl(360 100% 50%)') // [0, 100, 50, 1] +colorString.get.hsl('hsla(360, 60%, 50%, 0.4)') // [0, 60, 50, 0.4] +colorString.get.hsl('hsl(360 60% 50% / 0.4)') // [0, 60, 50, 0.4] + +colorString.get.hwb('hwb(60, 3%, 60%)') // [60, 3, 60, 1] +colorString.get.hwb('hwb(60, 3%, 60%, 0.6)') // [60, 3, 60, 0.6] + +colorString.get.rgb('invalid color string') // null +``` + +### Generation + +```js +colorString.to.hex([255, 255, 255]) // "#FFFFFF" +colorString.to.hex([0, 0, 255, 0.4]) // "#0000FF66" +colorString.to.hex([0, 0, 255], 0.4) // "#0000FF66" +colorString.to.rgb([255, 255, 255]) // "rgb(255, 255, 255)" +colorString.to.rgb([0, 0, 255, 0.4]) // "rgba(0, 0, 255, 0.4)" +colorString.to.rgb([0, 0, 255], 0.4) // "rgba(0, 0, 255, 0.4)" +colorString.to.rgb.percent([0, 0, 255]) // "rgb(0%, 0%, 100%)" +colorString.to.keyword([255, 255, 0]) // "yellow" +colorString.to.hsl([360, 100, 100]) // "hsl(360, 100%, 100%)" +colorString.to.hwb([50, 3, 15]) // "hwb(50, 3%, 15%)" + +// all functions also support swizzling +colorString.to.rgb(0, [0, 255], 0.4) // "rgba(0, 0, 255, 0.4)" +colorString.to.rgb([0, 0], [255], 0.4) // "rgba(0, 0, 255, 0.4)" +colorString.to.rgb([0], 0, [255, 0.4]) // "rgba(0, 0, 255, 0.4)" +``` diff --git a/node_modules/color-string/index.js b/node_modules/color-string/index.js new file mode 100644 index 0000000..dd5d2b7 --- /dev/null +++ b/node_modules/color-string/index.js @@ -0,0 +1,242 @@ +/* MIT license */ +var colorNames = require('color-name'); +var swizzle = require('simple-swizzle'); +var hasOwnProperty = Object.hasOwnProperty; + +var reverseNames = Object.create(null); + +// create a list of reverse color names +for (var name in colorNames) { + if (hasOwnProperty.call(colorNames, name)) { + reverseNames[colorNames[name]] = name; + } +} + +var cs = module.exports = { + to: {}, + get: {} +}; + +cs.get = function (string) { + var prefix = string.substring(0, 3).toLowerCase(); + var val; + var model; + switch (prefix) { + case 'hsl': + val = cs.get.hsl(string); + model = 'hsl'; + break; + case 'hwb': + val = cs.get.hwb(string); + model = 'hwb'; + break; + default: + val = cs.get.rgb(string); + model = 'rgb'; + break; + } + + if (!val) { + return null; + } + + return {model: model, value: val}; +}; + +cs.get.rgb = function (string) { + if (!string) { + return null; + } + + var abbr = /^#([a-f0-9]{3,4})$/i; + var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i; + var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/; + var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/; + var keyword = /^(\w+)$/; + + var rgb = [0, 0, 0, 1]; + var match; + var i; + var hexAlpha; + + if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + + for (i = 0; i < 3; i++) { + // https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19 + var i2 = i * 2; + rgb[i] = parseInt(match.slice(i2, i2 + 2), 16); + } + + if (hexAlpha) { + rgb[3] = parseInt(hexAlpha, 16) / 255; + } + } else if (match = string.match(abbr)) { + match = match[1]; + hexAlpha = match[3]; + + for (i = 0; i < 3; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + + if (hexAlpha) { + rgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255; + } + } else if (match = string.match(rgba)) { + for (i = 0; i < 3; i++) { + rgb[i] = parseInt(match[i + 1], 0); + } + + if (match[4]) { + if (match[5]) { + rgb[3] = parseFloat(match[4]) * 0.01; + } else { + rgb[3] = parseFloat(match[4]); + } + } + } else if (match = string.match(per)) { + for (i = 0; i < 3; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + + if (match[4]) { + if (match[5]) { + rgb[3] = parseFloat(match[4]) * 0.01; + } else { + rgb[3] = parseFloat(match[4]); + } + } + } else if (match = string.match(keyword)) { + if (match[1] === 'transparent') { + return [0, 0, 0, 0]; + } + + if (!hasOwnProperty.call(colorNames, match[1])) { + return null; + } + + rgb = colorNames[match[1]]; + rgb[3] = 1; + + return rgb; + } else { + return null; + } + + for (i = 0; i < 3; i++) { + rgb[i] = clamp(rgb[i], 0, 255); + } + rgb[3] = clamp(rgb[3], 0, 1); + + return rgb; +}; + +cs.get.hsl = function (string) { + if (!string) { + return null; + } + + var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/; + var match = string.match(hsl); + + if (match) { + var alpha = parseFloat(match[4]); + var h = ((parseFloat(match[1]) % 360) + 360) % 360; + var s = clamp(parseFloat(match[2]), 0, 100); + var l = clamp(parseFloat(match[3]), 0, 100); + var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1); + + return [h, s, l, a]; + } + + return null; +}; + +cs.get.hwb = function (string) { + if (!string) { + return null; + } + + var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/; + var match = string.match(hwb); + + if (match) { + var alpha = parseFloat(match[4]); + var h = ((parseFloat(match[1]) % 360) + 360) % 360; + var w = clamp(parseFloat(match[2]), 0, 100); + var b = clamp(parseFloat(match[3]), 0, 100); + var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } + + return null; +}; + +cs.to.hex = function () { + var rgba = swizzle(arguments); + + return ( + '#' + + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + (rgba[3] < 1 + ? (hexDouble(Math.round(rgba[3] * 255))) + : '') + ); +}; + +cs.to.rgb = function () { + var rgba = swizzle(arguments); + + return rgba.length < 4 || rgba[3] === 1 + ? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')' + : 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')'; +}; + +cs.to.rgb.percent = function () { + var rgba = swizzle(arguments); + + var r = Math.round(rgba[0] / 255 * 100); + var g = Math.round(rgba[1] / 255 * 100); + var b = Math.round(rgba[2] / 255 * 100); + + return rgba.length < 4 || rgba[3] === 1 + ? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)' + : 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')'; +}; + +cs.to.hsl = function () { + var hsla = swizzle(arguments); + return hsla.length < 4 || hsla[3] === 1 + ? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)' + : 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')'; +}; + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +cs.to.hwb = function () { + var hwba = swizzle(arguments); + + var a = ''; + if (hwba.length >= 4 && hwba[3] !== 1) { + a = ', ' + hwba[3]; + } + + return 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')'; +}; + +cs.to.keyword = function (rgb) { + return reverseNames[rgb.slice(0, 3)]; +}; + +// helpers +function clamp(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = Math.round(num).toString(16).toUpperCase(); + return (str.length < 2) ? '0' + str : str; +} diff --git a/node_modules/color-string/package.json b/node_modules/color-string/package.json new file mode 100644 index 0000000..f34ee98 --- /dev/null +++ b/node_modules/color-string/package.json @@ -0,0 +1,39 @@ +{ + "name": "color-string", + "description": "Parser and generator for CSS color strings", + "version": "1.9.1", + "author": "Heather Arthur ", + "contributors": [ + "Maxime Thirouin", + "Dyma Ywanov ", + "Josh Junon" + ], + "repository": "Qix-/color-string", + "scripts": { + "pretest": "xo", + "test": "node test/basic.js" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "xo": { + "rules": { + "no-cond-assign": 0, + "operator-linebreak": 0 + } + }, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + }, + "devDependencies": { + "xo": "^0.12.1" + }, + "keywords": [ + "color", + "colour", + "rgb", + "css" + ] +} diff --git a/node_modules/color/LICENSE b/node_modules/color/LICENSE new file mode 100644 index 0000000..68c864e --- /dev/null +++ b/node_modules/color/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2012 Heather Arthur + +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/color/README.md b/node_modules/color/README.md new file mode 100644 index 0000000..674a731 --- /dev/null +++ b/node_modules/color/README.md @@ -0,0 +1,123 @@ +# color + +> JavaScript library for immutable color conversion and manipulation with support for CSS color strings. + +```js +const color = Color('#7743CE').alpha(0.5).lighten(0.5); +console.log(color.hsl().string()); // 'hsla(262, 59%, 81%, 0.5)' + +console.log(color.cmyk().round().array()); // [ 16, 25, 0, 8, 0.5 ] + +console.log(color.ansi256().object()); // { ansi256: 183, alpha: 0.5 } +``` + +## Install +```console +$ npm install color +``` + +## Usage +```js +const Color = require('color'); +``` + +### Constructors +```js +const color = Color('rgb(255, 255, 255)') +const color = Color({r: 255, g: 255, b: 255}) +const color = Color.rgb(255, 255, 255) +const color = Color.rgb([255, 255, 255]) +``` + +Set the values for individual channels with `alpha`, `red`, `green`, `blue`, `hue`, `saturationl` (hsl), `saturationv` (hsv), `lightness`, `whiteness`, `blackness`, `cyan`, `magenta`, `yellow`, `black` + +String constructors are handled by [color-string](https://www.npmjs.com/package/color-string) + +### Getters +```js +color.hsl(); +``` +Convert a color to a different space (`hsl()`, `cmyk()`, etc.). + +```js +color.object(); // {r: 255, g: 255, b: 255} +``` +Get a hash of the color value. Reflects the color's current model (see above). + +```js +color.rgb().array() // [255, 255, 255] +``` +Get an array of the values with `array()`. Reflects the color's current model (see above). + +```js +color.rgbNumber() // 16777215 (0xffffff) +``` +Get the rgb number value. + +```js +color.hex() // #ffffff +``` +Get the hex value. (**NOTE:** `.hex()` does not return alpha values; use `.hexa()` for an RGBA representation) + +```js +color.red() // 255 +``` +Get the value for an individual channel. + +### CSS Strings +```js +color.hsl().string() // 'hsl(320, 50%, 100%)' +``` + +Calling `.string()` with a number rounds the numbers to that decimal place. It defaults to 1. + +### Luminosity +```js +color.luminosity(); // 0.412 +``` +The [WCAG luminosity](http://www.w3.org/TR/WCAG20/#relativeluminancedef) of the color. 0 is black, 1 is white. + +```js +color.contrast(Color("blue")) // 12 +``` +The [WCAG contrast ratio](http://www.w3.org/TR/WCAG20/#contrast-ratiodef) to another color, from 1 (same color) to 21 (contrast b/w white and black). + +```js +color.isLight(); // true +color.isDark(); // false +``` +Get whether the color is "light" or "dark", useful for deciding text color. + +### Manipulation +```js +color.negate() // rgb(0, 100, 255) -> rgb(255, 155, 0) + +color.lighten(0.5) // hsl(100, 50%, 50%) -> hsl(100, 50%, 75%) +color.lighten(0.5) // hsl(100, 50%, 0) -> hsl(100, 50%, 0) +color.darken(0.5) // hsl(100, 50%, 50%) -> hsl(100, 50%, 25%) +color.darken(0.5) // hsl(100, 50%, 0) -> hsl(100, 50%, 0) + +color.lightness(50) // hsl(100, 50%, 10%) -> hsl(100, 50%, 50%) + +color.saturate(0.5) // hsl(100, 50%, 50%) -> hsl(100, 75%, 50%) +color.desaturate(0.5) // hsl(100, 50%, 50%) -> hsl(100, 25%, 50%) +color.grayscale() // #5CBF54 -> #969696 + +color.whiten(0.5) // hwb(100, 50%, 50%) -> hwb(100, 75%, 50%) +color.blacken(0.5) // hwb(100, 50%, 50%) -> hwb(100, 50%, 75%) + +color.fade(0.5) // rgba(10, 10, 10, 0.8) -> rgba(10, 10, 10, 0.4) +color.opaquer(0.5) // rgba(10, 10, 10, 0.8) -> rgba(10, 10, 10, 1.0) + +color.rotate(180) // hsl(60, 20%, 20%) -> hsl(240, 20%, 20%) +color.rotate(-90) // hsl(60, 20%, 20%) -> hsl(330, 20%, 20%) + +color.mix(Color("yellow")) // cyan -> rgb(128, 255, 128) +color.mix(Color("yellow"), 0.3) // cyan -> rgb(77, 255, 179) + +// chaining +color.green(100).grayscale().lighten(0.6) +``` + +## Propers +The API was inspired by [color-js](https://github.com/brehaut/color-js). Manipulation functions by CSS tools like Sass, LESS, and Stylus. diff --git a/node_modules/color/index.js b/node_modules/color/index.js new file mode 100644 index 0000000..ddb0b5d --- /dev/null +++ b/node_modules/color/index.js @@ -0,0 +1,496 @@ +const colorString = require('color-string'); +const convert = require('color-convert'); + +const skippedModels = [ + // To be honest, I don't really feel like keyword belongs in color convert, but eh. + 'keyword', + + // Gray conflicts with some method names, and has its own method defined. + 'gray', + + // Shouldn't really be in color-convert either... + 'hex', +]; + +const hashedModelKeys = {}; +for (const model of Object.keys(convert)) { + hashedModelKeys[[...convert[model].labels].sort().join('')] = model; +} + +const limiters = {}; + +function Color(object, model) { + if (!(this instanceof Color)) { + return new Color(object, model); + } + + if (model && model in skippedModels) { + model = null; + } + + if (model && !(model in convert)) { + throw new Error('Unknown model: ' + model); + } + + let i; + let channels; + + if (object == null) { // eslint-disable-line no-eq-null,eqeqeq + this.model = 'rgb'; + this.color = [0, 0, 0]; + this.valpha = 1; + } else if (object instanceof Color) { + this.model = object.model; + this.color = [...object.color]; + this.valpha = object.valpha; + } else if (typeof object === 'string') { + const result = colorString.get(object); + if (result === null) { + throw new Error('Unable to parse color from string: ' + object); + } + + this.model = result.model; + channels = convert[this.model].channels; + this.color = result.value.slice(0, channels); + this.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1; + } else if (object.length > 0) { + this.model = model || 'rgb'; + channels = convert[this.model].channels; + const newArray = Array.prototype.slice.call(object, 0, channels); + this.color = zeroArray(newArray, channels); + this.valpha = typeof object[channels] === 'number' ? object[channels] : 1; + } else if (typeof object === 'number') { + // This is always RGB - can be converted later on. + this.model = 'rgb'; + this.color = [ + (object >> 16) & 0xFF, + (object >> 8) & 0xFF, + object & 0xFF, + ]; + this.valpha = 1; + } else { + this.valpha = 1; + + const keys = Object.keys(object); + if ('alpha' in object) { + keys.splice(keys.indexOf('alpha'), 1); + this.valpha = typeof object.alpha === 'number' ? object.alpha : 0; + } + + const hashedKeys = keys.sort().join(''); + if (!(hashedKeys in hashedModelKeys)) { + throw new Error('Unable to parse color from object: ' + JSON.stringify(object)); + } + + this.model = hashedModelKeys[hashedKeys]; + + const {labels} = convert[this.model]; + const color = []; + for (i = 0; i < labels.length; i++) { + color.push(object[labels[i]]); + } + + this.color = zeroArray(color); + } + + // Perform limitations (clamping, etc.) + if (limiters[this.model]) { + channels = convert[this.model].channels; + for (i = 0; i < channels; i++) { + const limit = limiters[this.model][i]; + if (limit) { + this.color[i] = limit(this.color[i]); + } + } + } + + this.valpha = Math.max(0, Math.min(1, this.valpha)); + + if (Object.freeze) { + Object.freeze(this); + } +} + +Color.prototype = { + toString() { + return this.string(); + }, + + toJSON() { + return this[this.model](); + }, + + string(places) { + let self = this.model in colorString.to ? this : this.rgb(); + self = self.round(typeof places === 'number' ? places : 1); + const args = self.valpha === 1 ? self.color : [...self.color, this.valpha]; + return colorString.to[self.model](args); + }, + + percentString(places) { + const self = this.rgb().round(typeof places === 'number' ? places : 1); + const args = self.valpha === 1 ? self.color : [...self.color, this.valpha]; + return colorString.to.rgb.percent(args); + }, + + array() { + return this.valpha === 1 ? [...this.color] : [...this.color, this.valpha]; + }, + + object() { + const result = {}; + const {channels} = convert[this.model]; + const {labels} = convert[this.model]; + + for (let i = 0; i < channels; i++) { + result[labels[i]] = this.color[i]; + } + + if (this.valpha !== 1) { + result.alpha = this.valpha; + } + + return result; + }, + + unitArray() { + const rgb = this.rgb().color; + rgb[0] /= 255; + rgb[1] /= 255; + rgb[2] /= 255; + + if (this.valpha !== 1) { + rgb.push(this.valpha); + } + + return rgb; + }, + + unitObject() { + const rgb = this.rgb().object(); + rgb.r /= 255; + rgb.g /= 255; + rgb.b /= 255; + + if (this.valpha !== 1) { + rgb.alpha = this.valpha; + } + + return rgb; + }, + + round(places) { + places = Math.max(places || 0, 0); + return new Color([...this.color.map(roundToPlace(places)), this.valpha], this.model); + }, + + alpha(value) { + if (value !== undefined) { + return new Color([...this.color, Math.max(0, Math.min(1, value))], this.model); + } + + return this.valpha; + }, + + // Rgb + red: getset('rgb', 0, maxfn(255)), + green: getset('rgb', 1, maxfn(255)), + blue: getset('rgb', 2, maxfn(255)), + + hue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, value => ((value % 360) + 360) % 360), + + saturationl: getset('hsl', 1, maxfn(100)), + lightness: getset('hsl', 2, maxfn(100)), + + saturationv: getset('hsv', 1, maxfn(100)), + value: getset('hsv', 2, maxfn(100)), + + chroma: getset('hcg', 1, maxfn(100)), + gray: getset('hcg', 2, maxfn(100)), + + white: getset('hwb', 1, maxfn(100)), + wblack: getset('hwb', 2, maxfn(100)), + + cyan: getset('cmyk', 0, maxfn(100)), + magenta: getset('cmyk', 1, maxfn(100)), + yellow: getset('cmyk', 2, maxfn(100)), + black: getset('cmyk', 3, maxfn(100)), + + x: getset('xyz', 0, maxfn(95.047)), + y: getset('xyz', 1, maxfn(100)), + z: getset('xyz', 2, maxfn(108.833)), + + l: getset('lab', 0, maxfn(100)), + a: getset('lab', 1), + b: getset('lab', 2), + + keyword(value) { + if (value !== undefined) { + return new Color(value); + } + + return convert[this.model].keyword(this.color); + }, + + hex(value) { + if (value !== undefined) { + return new Color(value); + } + + return colorString.to.hex(this.rgb().round().color); + }, + + hexa(value) { + if (value !== undefined) { + return new Color(value); + } + + const rgbArray = this.rgb().round().color; + + let alphaHex = Math.round(this.valpha * 255).toString(16).toUpperCase(); + if (alphaHex.length === 1) { + alphaHex = '0' + alphaHex; + } + + return colorString.to.hex(rgbArray) + alphaHex; + }, + + rgbNumber() { + const rgb = this.rgb().color; + return ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF); + }, + + luminosity() { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + const rgb = this.rgb().color; + + const lum = []; + for (const [i, element] of rgb.entries()) { + const chan = element / 255; + lum[i] = (chan <= 0.04045) ? chan / 12.92 : ((chan + 0.055) / 1.055) ** 2.4; + } + + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast(color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + const lum1 = this.luminosity(); + const lum2 = color2.luminosity(); + + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level(color2) { + // https://www.w3.org/TR/WCAG/#contrast-enhanced + const contrastRatio = this.contrast(color2); + if (contrastRatio >= 7) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + isDark() { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + const rgb = this.rgb().color; + const yiq = (rgb[0] * 2126 + rgb[1] * 7152 + rgb[2] * 722) / 10000; + return yiq < 128; + }, + + isLight() { + return !this.isDark(); + }, + + negate() { + const rgb = this.rgb(); + for (let i = 0; i < 3; i++) { + rgb.color[i] = 255 - rgb.color[i]; + } + + return rgb; + }, + + lighten(ratio) { + const hsl = this.hsl(); + hsl.color[2] += hsl.color[2] * ratio; + return hsl; + }, + + darken(ratio) { + const hsl = this.hsl(); + hsl.color[2] -= hsl.color[2] * ratio; + return hsl; + }, + + saturate(ratio) { + const hsl = this.hsl(); + hsl.color[1] += hsl.color[1] * ratio; + return hsl; + }, + + desaturate(ratio) { + const hsl = this.hsl(); + hsl.color[1] -= hsl.color[1] * ratio; + return hsl; + }, + + whiten(ratio) { + const hwb = this.hwb(); + hwb.color[1] += hwb.color[1] * ratio; + return hwb; + }, + + blacken(ratio) { + const hwb = this.hwb(); + hwb.color[2] += hwb.color[2] * ratio; + return hwb; + }, + + grayscale() { + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + const rgb = this.rgb().color; + const value = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + return Color.rgb(value, value, value); + }, + + fade(ratio) { + return this.alpha(this.valpha - (this.valpha * ratio)); + }, + + opaquer(ratio) { + return this.alpha(this.valpha + (this.valpha * ratio)); + }, + + rotate(degrees) { + const hsl = this.hsl(); + let hue = hsl.color[0]; + hue = (hue + degrees) % 360; + hue = hue < 0 ? 360 + hue : hue; + hsl.color[0] = hue; + return hsl; + }, + + mix(mixinColor, weight) { + // Ported from sass implementation in C + // https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + if (!mixinColor || !mixinColor.rgb) { + throw new Error('Argument to "mix" was not a Color instance, but rather an instance of ' + typeof mixinColor); + } + + const color1 = mixinColor.rgb(); + const color2 = this.rgb(); + const p = weight === undefined ? 0.5 : weight; + + const w = 2 * p - 1; + const a = color1.alpha() - color2.alpha(); + + const w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2; + const w2 = 1 - w1; + + return Color.rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue(), + color1.alpha() * p + color2.alpha() * (1 - p)); + }, +}; + +// Model conversion methods and static constructors +for (const model of Object.keys(convert)) { + if (skippedModels.includes(model)) { + continue; + } + + const {channels} = convert[model]; + + // Conversion methods + Color.prototype[model] = function (...args) { + if (this.model === model) { + return new Color(this); + } + + if (args.length > 0) { + return new Color(args, model); + } + + return new Color([...assertArray(convert[this.model][model].raw(this.color)), this.valpha], model); + }; + + // 'static' construction methods + Color[model] = function (...args) { + let color = args[0]; + if (typeof color === 'number') { + color = zeroArray(args, channels); + } + + return new Color(color, model); + }; +} + +function roundTo(number, places) { + return Number(number.toFixed(places)); +} + +function roundToPlace(places) { + return function (number) { + return roundTo(number, places); + }; +} + +function getset(model, channel, modifier) { + model = Array.isArray(model) ? model : [model]; + + for (const m of model) { + (limiters[m] || (limiters[m] = []))[channel] = modifier; + } + + model = model[0]; + + return function (value) { + let result; + + if (value !== undefined) { + if (modifier) { + value = modifier(value); + } + + result = this[model](); + result.color[channel] = value; + return result; + } + + result = this[model]().color[channel]; + if (modifier) { + result = modifier(result); + } + + return result; + }; +} + +function maxfn(max) { + return function (v) { + return Math.max(0, Math.min(max, v)); + }; +} + +function assertArray(value) { + return Array.isArray(value) ? value : [value]; +} + +function zeroArray(array, length) { + for (let i = 0; i < length; i++) { + if (typeof array[i] !== 'number') { + array[i] = 0; + } + } + + return array; +} + +module.exports = Color; diff --git a/node_modules/color/package.json b/node_modules/color/package.json new file mode 100644 index 0000000..4cdb6e3 --- /dev/null +++ b/node_modules/color/package.json @@ -0,0 +1,47 @@ +{ + "name": "color", + "version": "4.2.3", + "description": "Color conversion and manipulation with CSS string support", + "sideEffects": false, + "keywords": [ + "color", + "colour", + "css" + ], + "authors": [ + "Josh Junon ", + "Heather Arthur ", + "Maxime Thirouin" + ], + "license": "MIT", + "repository": "Qix-/color", + "xo": { + "rules": { + "no-cond-assign": 0, + "new-cap": 0, + "unicorn/prefer-module": 0, + "no-mixed-operators": 0, + "complexity": 0, + "unicorn/numeric-separators-style": 0 + } + }, + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "pretest": "xo", + "test": "mocha" + }, + "engines": { + "node": ">=12.5.0" + }, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "devDependencies": { + "mocha": "9.0.2", + "xo": "0.42.0" + } +} diff --git a/node_modules/commander/LICENSE b/node_modules/commander/LICENSE new file mode 100644 index 0000000..10f997a --- /dev/null +++ b/node_modules/commander/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +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/commander/Readme.md b/node_modules/commander/Readme.md new file mode 100644 index 0000000..095e2ae --- /dev/null +++ b/node_modules/commander/Readme.md @@ -0,0 +1,1134 @@ +# Commander.js + +[![Build Status](https://github.com/tj/commander.js/workflows/build/badge.svg)](https://github.com/tj/commander.js/actions?query=workflow%3A%22build%22) +[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) +[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) +[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) + +The complete solution for [node.js](http://nodejs.org) command-line interfaces. + +Read this in other languages: English | [简体中文](./Readme_zh-CN.md) + +- [Commander.js](#commanderjs) + - [Installation](#installation) + - [Quick Start](#quick-start) + - [Declaring _program_ variable](#declaring-program-variable) + - [Options](#options) + - [Common option types, boolean and value](#common-option-types-boolean-and-value) + - [Default option value](#default-option-value) + - [Other option types, negatable boolean and boolean|value](#other-option-types-negatable-boolean-and-booleanvalue) + - [Required option](#required-option) + - [Variadic option](#variadic-option) + - [Version option](#version-option) + - [More configuration](#more-configuration) + - [Custom option processing](#custom-option-processing) + - [Commands](#commands) + - [Command-arguments](#command-arguments) + - [More configuration](#more-configuration-1) + - [Custom argument processing](#custom-argument-processing) + - [Action handler](#action-handler) + - [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands) + - [Life cycle hooks](#life-cycle-hooks) + - [Automated help](#automated-help) + - [Custom help](#custom-help) + - [Display help after errors](#display-help-after-errors) + - [Display help from code](#display-help-from-code) + - [.name](#name) + - [.usage](#usage) + - [.description and .summary](#description-and-summary) + - [.helpOption(flags, description)](#helpoptionflags-description) + - [.addHelpCommand()](#addhelpcommand) + - [More configuration](#more-configuration-2) + - [Custom event listeners](#custom-event-listeners) + - [Bits and pieces](#bits-and-pieces) + - [.parse() and .parseAsync()](#parse-and-parseasync) + - [Parsing Configuration](#parsing-configuration) + - [Legacy options as properties](#legacy-options-as-properties) + - [TypeScript](#typescript) + - [createCommand()](#createcommand) + - [Node options such as `--harmony`](#node-options-such-as---harmony) + - [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands) + - [Display error](#display-error) + - [Override exit and output handling](#override-exit-and-output-handling) + - [Additional documentation](#additional-documentation) + - [Support](#support) + - [Commander for enterprise](#commander-for-enterprise) + +For information about terms used in this document see: [terminology](./docs/terminology.md) + +## Installation + +```sh +npm install commander +``` + +## Quick Start + +You write code to describe your command line interface. +Commander looks after parsing the arguments into options and command-arguments, +displays usage errors for problems, and implements a help system. + +Commander is strict and displays an error for unrecognised options. +The two most used option types are a boolean option, and an option which takes its value from the following argument. + +Example file: [split.js](./examples/split.js) + +```js +const { program } = require('commander'); + +program + .option('--first') + .option('-s, --separator '); + +program.parse(); + +const options = program.opts(); +const limit = options.first ? 1 : undefined; +console.log(program.args[0].split(options.separator, limit)); +``` + +```console +$ node split.js -s / --fits a/b/c +error: unknown option '--fits' +(Did you mean --first?) +$ node split.js -s / --first a/b/c +[ 'a' ] +``` + +Here is a more complete program using a subcommand and with descriptions for the help. In a multi-command program, you have an action handler for each command (or stand-alone executables for the commands). + +Example file: [string-util.js](./examples/string-util.js) + +```js +const { Command } = require('commander'); +const program = new Command(); + +program + .name('string-util') + .description('CLI to some JavaScript string utilities') + .version('0.8.0'); + +program.command('split') + .description('Split a string into substrings and display as an array') + .argument('', 'string to split') + .option('--first', 'display just the first substring') + .option('-s, --separator ', 'separator character', ',') + .action((str, options) => { + const limit = options.first ? 1 : undefined; + console.log(str.split(options.separator, limit)); + }); + +program.parse(); +``` + +```console +$ node string-util.js help split +Usage: string-util split [options] + +Split a string into substrings and display as an array. + +Arguments: + string string to split + +Options: + --first display just the first substring + -s, --separator separator character (default: ",") + -h, --help display help for command + +$ node string-util.js split --separator=/ a/b/c +[ 'a', 'b', 'c' ] +``` + +More samples can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. + +## Declaring _program_ variable + +Commander exports a global object which is convenient for quick programs. +This is used in the examples in this README for brevity. + +```js +// CommonJS (.cjs) +const { program } = require('commander'); +``` + +For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. + +```js +// CommonJS (.cjs) +const { Command } = require('commander'); +const program = new Command(); +``` + +```js +// ECMAScript (.mjs) +import { Command } from 'commander'; +const program = new Command(); +``` + +```ts +// TypeScript (.ts) +import { Command } from 'commander'; +const program = new Command(); +``` + +## Options + +Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|'). + +The parsed options can be accessed by calling `.opts()` on a `Command` object, and are passed to the action handler. + +Multi-word options such as "--template-engine" are camel-cased, becoming `program.opts().templateEngine` etc. + +An option and its option-argument can be separated by a space, or combined into the same argument. The option-argument can follow the short option directly or follow an `=` for a long option. + +```sh +serve -p 80 +serve -p80 +serve --port 80 +serve --port=80 +``` + +You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted. + +By default options on the command line are not positional, and can be specified before or after other arguments. + +There are additional related routines for when `.opts()` is not enough: + +- `.optsWithGlobals()` returns merged local and global option values +- `.getOptionValue()` and `.setOptionValue()` work with a single option value +- `.getOptionValueSource()` and `.setOptionValueWithSource()` include where the option value came from + +### Common option types, boolean and value + +The two most used option types are a boolean option, and an option which takes its value +from the following argument (declared with angle brackets like `--expect `). Both are `undefined` unless specified on command line. + +Example file: [options-common.js](./examples/options-common.js) + +```js +program + .option('-d, --debug', 'output extra debugging') + .option('-s, --small', 'small pizza size') + .option('-p, --pizza-type ', 'flavour of pizza'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.debug) console.log(options); +console.log('pizza details:'); +if (options.small) console.log('- small pizza size'); +if (options.pizzaType) console.log(`- ${options.pizzaType}`); +``` + +```console +$ pizza-options -p +error: option '-p, --pizza-type ' argument missing +$ pizza-options -d -s -p vegetarian +{ debug: true, small: true, pizzaType: 'vegetarian' } +pizza details: +- small pizza size +- vegetarian +$ pizza-options --pizza-type=cheese +pizza details: +- cheese +``` + +Multiple boolean short options may be combined together following the dash, and may be followed by a single short option taking a value. +For example `-d -s -p cheese` may be written as `-ds -p cheese` or even `-dsp cheese`. + +Options with an expected option-argument are greedy and will consume the following argument whatever the value. +So `--id -xyz` reads `-xyz` as the option-argument. + +`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array. The parameter is optional and defaults to `process.argv`. + +### Default option value + +You can specify a default value for an option. + +Example file: [options-defaults.js](./examples/options-defaults.js) + +```js +program + .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); + +program.parse(); + +console.log(`cheese: ${program.opts().cheese}`); +``` + +```console +$ pizza-options +cheese: blue +$ pizza-options --cheese stilton +cheese: stilton +``` + +### Other option types, negatable boolean and boolean|value + +You can define a boolean option long name with a leading `no-` to set the option value to false when used. +Defined alone this also makes the option true by default. + +If you define `--foo` first, adding `--no-foo` does not change the default value from what it would +otherwise be. + +Example file: [options-negatable.js](./examples/options-negatable.js) + +```js +program + .option('--no-sauce', 'Remove sauce') + .option('--cheese ', 'cheese flavour', 'mozzarella') + .option('--no-cheese', 'plain with no cheese') + .parse(); + +const options = program.opts(); +const sauceStr = options.sauce ? 'sauce' : 'no sauce'; +const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`; +console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); +``` + +```console +$ pizza-options +You ordered a pizza with sauce and mozzarella cheese +$ pizza-options --sauce +error: unknown option '--sauce' +$ pizza-options --cheese=blue +You ordered a pizza with sauce and blue cheese +$ pizza-options --no-sauce --no-cheese +You ordered a pizza with no sauce and no cheese +``` + +You can specify an option which may be used as a boolean option but may optionally take an option-argument +(declared with square brackets like `--optional [value]`). + +Example file: [options-boolean-or-value.js](./examples/options-boolean-or-value.js) + +```js +program + .option('-c, --cheese [type]', 'Add cheese with optional type'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.cheese === undefined) console.log('no cheese'); +else if (options.cheese === true) console.log('add cheese'); +else console.log(`add cheese type ${options.cheese}`); +``` + +```console +$ pizza-options +no cheese +$ pizza-options --cheese +add cheese +$ pizza-options --cheese mozzarella +add cheese type mozzarella +``` + +Options with an optional option-argument are not greedy and will ignore arguments starting with a dash. +So `id` behaves as a boolean option for `--id -5`, but you can use a combined form if needed like `--id=-5`. + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Required option + +You may specify a required (mandatory) option using `.requiredOption()`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option()` in format, taking flags and description, and optional default value or custom processing. + +Example file: [options-required.js](./examples/options-required.js) + +```js +program + .requiredOption('-c, --cheese ', 'pizza must have cheese'); + +program.parse(); +``` + +```console +$ pizza +error: required option '-c, --cheese ' not specified +``` + +### Variadic option + +You may make an option variadic by appending `...` to the value placeholder when declaring the option. On the command line you +can then specify multiple option-arguments, and the parsed option value will be an array. The extra arguments +are read until the first argument starting with a dash. The special argument `--` stops option processing entirely. If a value +is specified in the same argument as the option then no further values are read. + +Example file: [options-variadic.js](./examples/options-variadic.js) + +```js +program + .option('-n, --number ', 'specify numbers') + .option('-l, --letter [letters...]', 'specify letters'); + +program.parse(); + +console.log('Options: ', program.opts()); +console.log('Remaining arguments: ', program.args); +``` + +```console +$ collect -n 1 2 3 --letter a b c +Options: { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] } +Remaining arguments: [] +$ collect --letter=A -n80 operand +Options: { number: [ '80' ], letter: [ 'A' ] } +Remaining arguments: [ 'operand' ] +$ collect --letter -n 1 -n 2 3 -- operand +Options: { number: [ '1', '2', '3' ], letter: true } +Remaining arguments: [ 'operand' ] +``` + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Version option + +The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. + +```js +program.version('0.0.1'); +``` + +```console +$ ./examples/pizza -V +0.0.1 +``` + +You may change the flags and description by passing additional parameters to the `version` method, using +the same syntax for flags as the `option` method. + +```js +program.version('0.0.1', '-v, --vers', 'output the current version'); +``` + +### More configuration + +You can add most options using the `.option()` method, but there are some additional features available +by constructing an `Option` explicitly for less common cases. + +Example files: [options-extra.js](./examples/options-extra.js), [options-env.js](./examples/options-env.js), [options-conflicts.js](./examples/options-conflicts.js), [options-implies.js](./examples/options-implies.js) + +```js +program + .addOption(new Option('-s, --secret').hideHelp()) + .addOption(new Option('-t, --timeout ', 'timeout in seconds').default(60, 'one minute')) + .addOption(new Option('-d, --drink ', 'drink size').choices(['small', 'medium', 'large'])) + .addOption(new Option('-p, --port ', 'port number').env('PORT')) + .addOption(new Option('--donate [amount]', 'optional donation in dollars').preset('20').argParser(parseFloat)) + .addOption(new Option('--disable-server', 'disables the server').conflicts('port')) + .addOption(new Option('--free-drink', 'small drink included free ').implies({ drink: 'small' })); +``` + +```console +$ extra --help +Usage: help [options] + +Options: + -t, --timeout timeout in seconds (default: one minute) + -d, --drink drink cup size (choices: "small", "medium", "large") + -p, --port port number (env: PORT) + --donate [amount] optional donation in dollars (preset: "20") + --disable-server disables the server + --free-drink small drink included free + -h, --help display help for command + +$ extra --drink huge +error: option '-d, --drink ' argument 'huge' is invalid. Allowed choices are small, medium, large. + +$ PORT=80 extra --donate --free-drink +Options: { timeout: 60, donate: 20, port: '80', freeDrink: true, drink: 'small' } + +$ extra --disable-server --port 8000 +error: option '--disable-server' cannot be used with option '-p, --port ' +``` + +Specify a required (mandatory) option using the `Option` method `.makeOptionMandatory()`. This matches the `Command` method [.requiredOption()](#required-option). + +### Custom option processing + +You may specify a function to do custom processing of option-arguments. The callback function receives two parameters, +the user specified option-argument and the previous value for the option. It returns the new value for the option. + +This allows you to coerce the option-argument to the desired type, or accumulate values, or do entirely custom processing. + +You can optionally specify the default/starting value for the option after the function parameter. + +Example file: [options-custom-processing.js](./examples/options-custom-processing.js) + +```js +function myParseInt(value, dummyPrevious) { + // parseInt takes a string and a radix + const parsedValue = parseInt(value, 10); + if (isNaN(parsedValue)) { + throw new commander.InvalidArgumentError('Not a number.'); + } + return parsedValue; +} + +function increaseVerbosity(dummyValue, previous) { + return previous + 1; +} + +function collect(value, previous) { + return previous.concat([value]); +} + +function commaSeparatedList(value, dummyPrevious) { + return value.split(','); +} + +program + .option('-f, --float ', 'float argument', parseFloat) + .option('-i, --integer ', 'integer argument', myParseInt) + .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) + .option('-c, --collect ', 'repeatable value', collect, []) + .option('-l, --list ', 'comma separated list', commaSeparatedList) +; + +program.parse(); + +const options = program.opts(); +if (options.float !== undefined) console.log(`float: ${options.float}`); +if (options.integer !== undefined) console.log(`integer: ${options.integer}`); +if (options.verbose > 0) console.log(`verbosity: ${options.verbose}`); +if (options.collect.length > 0) console.log(options.collect); +if (options.list !== undefined) console.log(options.list); +``` + +```console +$ custom -f 1e2 +float: 100 +$ custom --integer 2 +integer: 2 +$ custom -v -v -v +verbose: 3 +$ custom -c a -c b -c c +[ 'a', 'b', 'c' ] +$ custom --list x,y,z +[ 'x', 'y', 'z' ] +``` + +## Commands + +You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)). + +In the first parameter to `.command()` you specify the command name. You may append the command-arguments after the command name, or specify them separately using `.argument()`. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. + +You can use `.addCommand()` to add an already configured subcommand to the program. + +For example: + +```js +// Command implemented using action handler (description is supplied separately to `.command`) +// Returns new command for configuring. +program + .command('clone [destination]') + .description('clone a repository into a newly created directory') + .action((source, destination) => { + console.log('clone command called'); + }); + +// Command implemented using stand-alone executable file, indicated by adding description as second parameter to `.command`. +// Returns `this` for adding more commands. +program + .command('start ', 'start named service') + .command('stop [service]', 'stop named service, or all if no name supplied'); + +// Command prepared separately. +// Returns `this` for adding more commands. +program + .addCommand(build.makeBuildCommand()); +``` + +Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `hidden: true` will +remove the command from the generated help output. Specifying `isDefault: true` will run the subcommand if no other +subcommand is specified ([example](./examples/defaultCommand.js)). + +You can add alternative names for a command with `.alias()`. ([example](./examples/alias.js)) + +For safety, `.addCommand()` does not automatically copy the inherited settings from the parent command. There is a helper routine `.copyInheritedSettings()` for copying the settings when they are wanted. + +### Command-arguments + +For subcommands, you can specify the argument syntax in the call to `.command()` (as shown above). This +is the only method usable for subcommands implemented using a stand-alone executable, but for other subcommands +you can instead use the following method. + +To configure a command, you can use `.argument()` to specify each expected command-argument. +You supply the argument name and an optional description. The argument may be `` or `[optional]`. +You can specify a default value for an optional command-argument. + +Example file: [argument.js](./examples/argument.js) + +```js +program + .version('0.1.0') + .argument('', 'user to login') + .argument('[password]', 'password for user, if required', 'no password given') + .action((username, password) => { + console.log('username:', username); + console.log('password:', password); + }); +``` + + The last argument of a command can be variadic, and only the last argument. To make an argument variadic you + append `...` to the argument name. A variadic argument is passed to the action handler as an array. For example: + +```js +program + .version('0.1.0') + .command('rmdir') + .argument('') + .action(function (dirs) { + dirs.forEach((dir) => { + console.log('rmdir %s', dir); + }); + }); +``` + +There is a convenience method to add multiple arguments at once, but without descriptions: + +```js +program + .arguments(' '); +``` + +#### More configuration + +There are some additional features available by constructing an `Argument` explicitly for less common cases. + +Example file: [arguments-extra.js](./examples/arguments-extra.js) + +```js +program + .addArgument(new commander.Argument('', 'drink cup size').choices(['small', 'medium', 'large'])) + .addArgument(new commander.Argument('[timeout]', 'timeout in seconds').default(60, 'one minute')) +``` + +#### Custom argument processing + +You may specify a function to do custom processing of command-arguments (like for option-arguments). +The callback function receives two parameters, the user specified command-argument and the previous value for the argument. +It returns the new value for the argument. + +The processed argument values are passed to the action handler, and saved as `.processedArgs`. + +You can optionally specify the default/starting value for the argument after the function parameter. + +Example file: [arguments-custom-processing.js](./examples/arguments-custom-processing.js) + +```js +program + .command('add') + .argument('', 'integer argument', myParseInt) + .argument('[second]', 'integer argument', myParseInt, 1000) + .action((first, second) => { + console.log(`${first} + ${second} = ${first + second}`); + }) +; +``` + +### Action handler + +The action handler gets passed a parameter for each command-argument you declared, and two additional parameters +which are the parsed options and the command object itself. + +Example file: [thank.js](./examples/thank.js) + +```js +program + .argument('') + .option('-t, --title ', 'title to use before name') + .option('-d, --debug', 'display some debugging') + .action((name, options, command) => { + if (options.debug) { + console.error('Called %s with options %o', command.name(), options); + } + const title = options.title ? `${options.title} ` : ''; + console.log(`Thank-you ${title}${name}`); + }); +``` + +If you prefer, you can work with the command directly and skip declaring the parameters for the action handler. The `this` keyword is set to the running command and can be used from a function expression (but not from an arrow function). + +Example file: [action-this.js](./examples/action-this.js) + +```js +program + .command('serve') + .argument('"; +const handler = new DomHandler((error, dom) => { + if (error) { + // Handle error + } else { + // Parsing completed, do something + console.log(dom); + } +}); +const parser = new Parser(handler); +parser.write(rawHtml); +parser.end(); +``` + +Output: + +```javascript +[ + { + data: "Xyz ", + type: "text", + }, + { + type: "script", + name: "script", + attribs: { + language: "javascript", + }, + children: [ + { + data: "var foo = '';<", + type: "text", + }, + ], + }, + { + data: "' is a single-line comment + this.index += 3; + var comment = this.skipSingleLineComment(3); + if (this.trackComment) { + comments = comments.concat(comment); + } + } + else { + break; + } + } + else if (ch === 0x3C && !this.isModule) { + if (this.source.slice(this.index + 1, this.index + 4) === '!--') { + this.index += 4; // ` + +```js +var etag = require('etag') +``` + +### etag(entity, [options]) + +Generate a strong ETag for the given entity. This should be the complete +body of the entity. Strings, `Buffer`s, and `fs.Stats` are accepted. By +default, a strong ETag is generated except for `fs.Stats`, which will +generate a weak ETag (this can be overwritten by `options.weak`). + + + +```js +res.setHeader('ETag', etag(body)) +``` + +#### Options + +`etag` accepts these properties in the options object. + +##### weak + +Specifies if the generated ETag will include the weak validator mark (that +is, the leading `W/`). The actual entity tag is the same. The default value +is `false`, unless the `entity` is `fs.Stats`, in which case it is `true`. + +## Testing + +```sh +$ npm test +``` + +## Benchmark + +```bash +$ npm run-script bench + +> etag@1.8.1 bench nodejs-etag +> node benchmark/index.js + + http_parser@2.7.0 + node@6.11.1 + v8@5.1.281.103 + uv@1.11.0 + zlib@1.2.11 + ares@1.10.1-DEV + icu@58.2 + modules@48 + openssl@1.0.2k + +> node benchmark/body0-100b.js + + 100B body + + 4 tests completed. + + buffer - strong x 258,647 ops/sec ±1.07% (180 runs sampled) + buffer - weak x 263,812 ops/sec ±0.61% (184 runs sampled) + string - strong x 259,955 ops/sec ±1.19% (185 runs sampled) + string - weak x 264,356 ops/sec ±1.09% (184 runs sampled) + +> node benchmark/body1-1kb.js + + 1KB body + + 4 tests completed. + + buffer - strong x 189,018 ops/sec ±1.12% (182 runs sampled) + buffer - weak x 190,586 ops/sec ±0.81% (186 runs sampled) + string - strong x 144,272 ops/sec ±0.96% (188 runs sampled) + string - weak x 145,380 ops/sec ±1.43% (187 runs sampled) + +> node benchmark/body2-5kb.js + + 5KB body + + 4 tests completed. + + buffer - strong x 92,435 ops/sec ±0.42% (188 runs sampled) + buffer - weak x 92,373 ops/sec ±0.58% (189 runs sampled) + string - strong x 48,850 ops/sec ±0.56% (186 runs sampled) + string - weak x 49,380 ops/sec ±0.56% (190 runs sampled) + +> node benchmark/body3-10kb.js + + 10KB body + + 4 tests completed. + + buffer - strong x 55,989 ops/sec ±0.93% (188 runs sampled) + buffer - weak x 56,148 ops/sec ±0.55% (190 runs sampled) + string - strong x 27,345 ops/sec ±0.43% (188 runs sampled) + string - weak x 27,496 ops/sec ±0.45% (190 runs sampled) + +> node benchmark/body4-100kb.js + + 100KB body + + 4 tests completed. + + buffer - strong x 7,083 ops/sec ±0.22% (190 runs sampled) + buffer - weak x 7,115 ops/sec ±0.26% (191 runs sampled) + string - strong x 3,068 ops/sec ±0.34% (190 runs sampled) + string - weak x 3,096 ops/sec ±0.35% (190 runs sampled) + +> node benchmark/stats.js + + stat + + 4 tests completed. + + real - strong x 871,642 ops/sec ±0.34% (189 runs sampled) + real - weak x 867,613 ops/sec ±0.39% (190 runs sampled) + fake - strong x 401,051 ops/sec ±0.40% (189 runs sampled) + fake - weak x 400,100 ops/sec ±0.47% (188 runs sampled) +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/etag.svg +[npm-url]: https://npmjs.org/package/etag +[node-version-image]: https://img.shields.io/node/v/etag.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/jshttp/etag/master.svg +[travis-url]: https://travis-ci.org/jshttp/etag +[coveralls-image]: https://img.shields.io/coveralls/jshttp/etag/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/etag?branch=master +[downloads-image]: https://img.shields.io/npm/dm/etag.svg +[downloads-url]: https://npmjs.org/package/etag diff --git a/node_modules/etag/index.js b/node_modules/etag/index.js new file mode 100644 index 0000000..2a585c9 --- /dev/null +++ b/node_modules/etag/index.js @@ -0,0 +1,131 @@ +/*! + * etag + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module exports. + * @public + */ + +module.exports = etag + +/** + * Module dependencies. + * @private + */ + +var crypto = require('crypto') +var Stats = require('fs').Stats + +/** + * Module variables. + * @private + */ + +var toString = Object.prototype.toString + +/** + * Generate an entity tag. + * + * @param {Buffer|string} entity + * @return {string} + * @private + */ + +function entitytag (entity) { + if (entity.length === 0) { + // fast-path empty + return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"' + } + + // compute hash of entity + var hash = crypto + .createHash('sha1') + .update(entity, 'utf8') + .digest('base64') + .substring(0, 27) + + // compute length of entity + var len = typeof entity === 'string' + ? Buffer.byteLength(entity, 'utf8') + : entity.length + + return '"' + len.toString(16) + '-' + hash + '"' +} + +/** + * Create a simple ETag. + * + * @param {string|Buffer|Stats} entity + * @param {object} [options] + * @param {boolean} [options.weak] + * @return {String} + * @public + */ + +function etag (entity, options) { + if (entity == null) { + throw new TypeError('argument entity is required') + } + + // support fs.Stats object + var isStats = isstats(entity) + var weak = options && typeof options.weak === 'boolean' + ? options.weak + : isStats + + // validate argument + if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) { + throw new TypeError('argument entity must be string, Buffer, or fs.Stats') + } + + // generate entity tag + var tag = isStats + ? stattag(entity) + : entitytag(entity) + + return weak + ? 'W/' + tag + : tag +} + +/** + * Determine if object is a Stats object. + * + * @param {object} obj + * @return {boolean} + * @api private + */ + +function isstats (obj) { + // genuine fs.Stats + if (typeof Stats === 'function' && obj instanceof Stats) { + return true + } + + // quack quack + return obj && typeof obj === 'object' && + 'ctime' in obj && toString.call(obj.ctime) === '[object Date]' && + 'mtime' in obj && toString.call(obj.mtime) === '[object Date]' && + 'ino' in obj && typeof obj.ino === 'number' && + 'size' in obj && typeof obj.size === 'number' +} + +/** + * Generate a tag for a stat. + * + * @param {object} stat + * @return {string} + * @private + */ + +function stattag (stat) { + var mtime = stat.mtime.getTime().toString(16) + var size = stat.size.toString(16) + + return '"' + size + '-' + mtime + '"' +} diff --git a/node_modules/etag/package.json b/node_modules/etag/package.json new file mode 100644 index 0000000..b06ab80 --- /dev/null +++ b/node_modules/etag/package.json @@ -0,0 +1,47 @@ +{ + "name": "etag", + "description": "Create simple HTTP ETags", + "version": "1.8.1", + "contributors": [ + "Douglas Christopher Wilson ", + "David Björklund " + ], + "license": "MIT", + "keywords": [ + "etag", + "http", + "res" + ], + "repository": "jshttp/etag", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-markdown": "1.0.0-beta.6", + "eslint-plugin-node": "5.1.1", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-standard": "3.0.1", + "istanbul": "0.4.5", + "mocha": "1.21.5", + "safe-buffer": "5.1.1", + "seedrandom": "2.4.3" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "README.md", + "index.js" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --bail --check-leaks test/", + "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", + "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + } +} diff --git a/node_modules/evaluate-value/LICENSE b/node_modules/evaluate-value/LICENSE new file mode 100644 index 0000000..274147a --- /dev/null +++ b/node_modules/evaluate-value/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 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/evaluate-value/README.md b/node_modules/evaluate-value/README.md new file mode 100644 index 0000000..8f835bb --- /dev/null +++ b/node_modules/evaluate-value/README.md @@ -0,0 +1,41 @@ +# evaluate-value [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] + +> Return a value or an evaluated function (with arguments). + + +* When the first input argument is a function, it is executed with the remaining arguments, and the result is returned. +* When the first input argument is *not* a function, it is simply returned. + + +## Installation + +[Node.js](http://nodejs.org/) `>= 8` is required. To install, type this at the command line: +```shell +npm install evaluate-value +``` + + +## Usage + +```js +const evaluateValue = require('evaluate-value'); + +evaluateValue(true); +//-> true + +evaluateValue(() => true); +//-> true + +evaluateValue( + (arg1, arg2) => arg1 === arg2, + true, + false +); +//-> false +``` + + +[npm-image]: https://img.shields.io/npm/v/evaluate-value.svg +[npm-url]: https://npmjs.com/package/evaluate-value +[travis-image]: https://img.shields.io/travis/stevenvachon/evaluate-value.svg +[travis-url]: https://travis-ci.org/stevenvachon/evaluate-value diff --git a/node_modules/evaluate-value/index-es5.js b/node_modules/evaluate-value/index-es5.js new file mode 100644 index 0000000..bb24dae --- /dev/null +++ b/node_modules/evaluate-value/index-es5.js @@ -0,0 +1,17 @@ +"use strict"; + +var evaluateValue = function evaluateValue(value) { + if (typeof value === "function") { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return value.apply(void 0, args); + } + + return value; +}; + +module.exports = evaluateValue; + +//# sourceMappingURL=index-es5.js.map \ No newline at end of file diff --git a/node_modules/evaluate-value/index-es5.js.map b/node_modules/evaluate-value/index-es5.js.map new file mode 100644 index 0000000..feb7428 --- /dev/null +++ b/node_modules/evaluate-value/index-es5.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.js"],"names":[],"mappings":"AAAA;;AAIA,IAAM,aAAa,GAAG,SAAhB,aAAgB,CAAC,KAAD,EACtB;AACC,MAAI,OAAO,KAAP,KAAiB,UAArB,EACA;AAAA,sCAHgC,IAGhC;AAHgC,MAAA,IAGhC;AAAA;;AACC,WAAO,KAAK,MAAL,SAAS,IAAT,CAAP;AACA;;AAED,SAAO,KAAP;AACA,CARD;;AAYA,MAAM,CAAC,OAAP,GAAiB,aAAjB","file":"index-es5.js","sourcesContent":["\"use strict\";\n\n\n\nconst evaluateValue = (value, ...args) =>\n{\n\tif (typeof value === \"function\")\n\t{\n\t\treturn value(...args);\n\t}\n\n\treturn value;\n};\n\n\n\nmodule.exports = evaluateValue;\n"]} \ No newline at end of file diff --git a/node_modules/evaluate-value/index.js b/node_modules/evaluate-value/index.js new file mode 100644 index 0000000..7ee35b0 --- /dev/null +++ b/node_modules/evaluate-value/index.js @@ -0,0 +1,17 @@ +"use strict"; + + + +const evaluateValue = (value, ...args) => +{ + if (typeof value === "function") + { + return value(...args); + } + + return value; +}; + + + +module.exports = evaluateValue; diff --git a/node_modules/evaluate-value/package.json b/node_modules/evaluate-value/package.json new file mode 100644 index 0000000..6e068d1 --- /dev/null +++ b/node_modules/evaluate-value/package.json @@ -0,0 +1,33 @@ +{ + "name": "evaluate-value", + "description": "Return a value or an evaluated function (with arguments).", + "version": "2.0.0", + "license": "MIT", + "author": "Steven Vachon (https://svachon.com)", + "browser": "index-es5.js", + "repository": "github:stevenvachon/evaluate-value", + "devDependencies": { + "@babel/cli": "^7.4.3", + "@babel/core": "^7.4.3", + "@babel/preset-env": "^7.4.3", + "chai": "^4.2.0", + "mocha": "^6.1.4" + }, + "engines": { + "node": ">= 8" + }, + "scripts": { + "prepublishOnly": "npm test && babel index.js --out-file=index-es5.js --presets=@babel/env --source-maps", + "test": "mocha test.js --check-leaks --bail" + }, + "files": [ + "index.js", + "index-es5.js", + "index-es5.js.map" + ], + "keywords": [ + "function", + "options", + "value" + ] +} diff --git a/node_modules/eventemitter3/LICENSE b/node_modules/eventemitter3/LICENSE new file mode 100644 index 0000000..abcbd54 --- /dev/null +++ b/node_modules/eventemitter3/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Arnout Kazemier + +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/eventemitter3/README.md b/node_modules/eventemitter3/README.md new file mode 100644 index 0000000..aba7e18 --- /dev/null +++ b/node_modules/eventemitter3/README.md @@ -0,0 +1,94 @@ +# EventEmitter3 + +[![Version npm](https://img.shields.io/npm/v/eventemitter3.svg?style=flat-square)](https://www.npmjs.com/package/eventemitter3)[![Build Status](https://img.shields.io/travis/primus/eventemitter3/master.svg?style=flat-square)](https://travis-ci.org/primus/eventemitter3)[![Dependencies](https://img.shields.io/david/primus/eventemitter3.svg?style=flat-square)](https://david-dm.org/primus/eventemitter3)[![Coverage Status](https://img.shields.io/coveralls/primus/eventemitter3/master.svg?style=flat-square)](https://coveralls.io/r/primus/eventemitter3?branch=master)[![IRC channel](https://img.shields.io/badge/IRC-irc.freenode.net%23primus-00a8ff.svg?style=flat-square)](https://webchat.freenode.net/?channels=primus) + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/eventemitter3.svg)](https://saucelabs.com/u/eventemitter3) + +EventEmitter3 is a high performance EventEmitter. It has been micro-optimized +for various of code paths making this, one of, if not the fastest EventEmitter +available for Node.js and browsers. The module is API compatible with the +EventEmitter that ships by default with Node.js but there are some slight +differences: + +- Domain support has been removed. +- We do not `throw` an error when you emit an `error` event and nobody is + listening. +- The `newListener` and `removeListener` events have been removed as they + are useful only in some uncommon use-cases. +- The `setMaxListeners`, `getMaxListeners`, `prependListener` and + `prependOnceListener` methods are not available. +- Support for custom context for events so there is no need to use `fn.bind`. +- The `removeListener` method removes all matching listeners, not only the + first. + +It's a drop in replacement for existing EventEmitters, but just faster. Free +performance, who wouldn't want that? The EventEmitter is written in EcmaScript 3 +so it will work in the oldest browsers and node versions that you need to +support. + +## Installation + +```bash +$ npm install --save eventemitter3 +``` + +## CDN + +Recommended CDN: + +```text +https://unpkg.com/eventemitter3@latest/umd/eventemitter3.min.js +``` + +## Usage + +After installation the only thing you need to do is require the module: + +```js +var EventEmitter = require('eventemitter3'); +``` + +And you're ready to create your own EventEmitter instances. For the API +documentation, please follow the official Node.js documentation: + +http://nodejs.org/api/events.html + +### Contextual emits + +We've upgraded the API of the `EventEmitter.on`, `EventEmitter.once` and +`EventEmitter.removeListener` to accept an extra argument which is the `context` +or `this` value that should be set for the emitted events. This means you no +longer have the overhead of an event that required `fn.bind` in order to get a +custom `this` value. + +```js +var EE = new EventEmitter() + , context = { foo: 'bar' }; + +function emitted() { + console.log(this === context); // true +} + +EE.once('event-name', emitted, context); +EE.on('another-event', emitted, context); +EE.removeListener('another-event', emitted, context); +``` + +### Tests and benchmarks + +This module is well tested. You can run: + +- `npm test` to run the tests under Node.js. +- `npm run test-browser` to run the tests in real browsers via Sauce Labs. + +We also have a set of benchmarks to compare EventEmitter3 with some available +alternatives. To run the benchmarks run `npm run benchmark`. + +Tests and benchmarks are not included in the npm package. If you want to play +with them you have to clone the GitHub repository. +Note that you will have to run an additional `npm i` in the benchmarks folder +before `npm run benchmark`. + +## License + +[MIT](LICENSE) diff --git a/node_modules/eventemitter3/index.d.ts b/node_modules/eventemitter3/index.d.ts new file mode 100644 index 0000000..118f68b --- /dev/null +++ b/node_modules/eventemitter3/index.d.ts @@ -0,0 +1,134 @@ +/** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + */ +declare class EventEmitter< + EventTypes extends EventEmitter.ValidEventTypes = string | symbol, + Context extends any = any +> { + static prefixed: string | boolean; + + /** + * Return an array listing the events for which the emitter has registered + * listeners. + */ + eventNames(): Array>; + + /** + * Return the listeners registered for a given event. + */ + listeners>( + event: T + ): Array>; + + /** + * Return the number of listeners listening to a given event. + */ + listenerCount(event: EventEmitter.EventNames): number; + + /** + * Calls each of the listeners registered for a given event. + */ + emit>( + event: T, + ...args: EventEmitter.EventArgs + ): boolean; + + /** + * Add a listener for a given event. + */ + on>( + event: T, + fn: EventEmitter.EventListener, + context?: Context + ): this; + addListener>( + event: T, + fn: EventEmitter.EventListener, + context?: Context + ): this; + + /** + * Add a one-time listener for a given event. + */ + once>( + event: T, + fn: EventEmitter.EventListener, + context?: Context + ): this; + + /** + * Remove the listeners of a given event. + */ + removeListener>( + event: T, + fn?: EventEmitter.EventListener, + context?: Context, + once?: boolean + ): this; + off>( + event: T, + fn?: EventEmitter.EventListener, + context?: Context, + once?: boolean + ): this; + + /** + * Remove all listeners, or those of the specified event. + */ + removeAllListeners(event?: EventEmitter.EventNames): this; +} + +declare namespace EventEmitter { + export interface ListenerFn { + (...args: Args): void; + } + + export interface EventEmitterStatic { + new < + EventTypes extends ValidEventTypes = string | symbol, + Context = any + >(): EventEmitter; + } + + /** + * `object` should be in either of the following forms: + * ``` + * interface EventTypes { + * 'event-with-parameters': any[] + * 'event-with-example-handler': (...args: any[]) => void + * } + * ``` + */ + export type ValidEventTypes = string | symbol | object; + + export type EventNames = T extends string | symbol + ? T + : keyof T; + + export type ArgumentMap = { + [K in keyof T]: T[K] extends (...args: any[]) => void + ? Parameters + : T[K] extends any[] + ? T[K] + : any[]; + }; + + export type EventListener< + T extends ValidEventTypes, + K extends EventNames + > = T extends string | symbol + ? (...args: any[]) => void + : ( + ...args: ArgumentMap>[Extract] + ) => void; + + export type EventArgs< + T extends ValidEventTypes, + K extends EventNames + > = Parameters>; + + export const EventEmitter: EventEmitterStatic; +} + +export = EventEmitter; diff --git a/node_modules/eventemitter3/index.js b/node_modules/eventemitter3/index.js new file mode 100644 index 0000000..6ea485c --- /dev/null +++ b/node_modules/eventemitter3/index.js @@ -0,0 +1,336 @@ +'use strict'; + +var has = Object.prototype.hasOwnProperty + , prefix = '~'; + +/** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @private + */ +function Events() {} + +// +// We try to not inherit from `Object.prototype`. In some engines creating an +// instance in this way is faster than calling `Object.create(null)` directly. +// If `Object.create(null)` is not supported we prefix the event names with a +// character to make sure that the built-in object properties are not +// overridden or used as an attack vector. +// +if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; +} + +/** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @private + */ +function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; +} + +/** + * Add a listener for a given event. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} once Specify if the listener is a one-time listener. + * @returns {EventEmitter} + * @private + */ +function addListener(emitter, event, fn, context, once) { + if (typeof fn !== 'function') { + throw new TypeError('The listener must be a function'); + } + + var listener = new EE(fn, context || emitter, once) + , evt = prefix ? prefix + event : event; + + if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++; + else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); + else emitter._events[evt] = [emitter._events[evt], listener]; + + return emitter; +} + +/** + * Clear event by name. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} evt The Event name. + * @private + */ +function clearEvent(emitter, evt) { + if (--emitter._eventsCount === 0) emitter._events = new Events(); + else delete emitter._events[evt]; +} + +/** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @public + */ +function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; +} + +/** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @public + */ +EventEmitter.prototype.eventNames = function eventNames() { + var names = [] + , events + , name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; +}; + +/** + * Return the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Array} The registered listeners. + * @public + */ +EventEmitter.prototype.listeners = function listeners(event) { + var evt = prefix ? prefix + event : event + , handlers = this._events[evt]; + + if (!handlers) return []; + if (handlers.fn) return [handlers.fn]; + + for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { + ee[i] = handlers[i].fn; + } + + return ee; +}; + +/** + * Return the number of listeners listening to a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Number} The number of listeners. + * @public + */ +EventEmitter.prototype.listenerCount = function listenerCount(event) { + var evt = prefix ? prefix + event : event + , listeners = this._events[evt]; + + if (!listeners) return 0; + if (listeners.fn) return 1; + return listeners.length; +}; + +/** + * Calls each of the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @public + */ +EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt] + , len = arguments.length + , args + , i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: return listeners.fn.call(listeners.context), true; + case 2: return listeners.fn.call(listeners.context, a1), true; + case 3: return listeners.fn.call(listeners.context, a1, a2), true; + case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len -1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length + , j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: listeners[i].fn.call(listeners[i].context); break; + case 2: listeners[i].fn.call(listeners[i].context, a1); break; + case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; + case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; + default: + if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; +}; + +/** + * Add a listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ +EventEmitter.prototype.on = function on(event, fn, context) { + return addListener(this, event, fn, context, false); +}; + +/** + * Add a one-time listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ +EventEmitter.prototype.once = function once(event, fn, context) { + return addListener(this, event, fn, context, true); +}; + +/** + * Remove the listeners of a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {*} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @public + */ +EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + clearEvent(this, evt); + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn && + (!once || listeners.once) && + (!context || listeners.context === context) + ) { + clearEvent(this, evt); + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn || + (once && !listeners[i].once) || + (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else clearEvent(this, evt); + } + + return this; +}; + +/** + * Remove all listeners, or those of the specified event. + * + * @param {(String|Symbol)} [event] The event name. + * @returns {EventEmitter} `this`. + * @public + */ +EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) clearEvent(this, evt); + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; +}; + +// +// Alias methods names because people roll like that. +// +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +// +// Expose the prefix. +// +EventEmitter.prefixed = prefix; + +// +// Allow `EventEmitter` to be imported as module namespace. +// +EventEmitter.EventEmitter = EventEmitter; + +// +// Expose the module. +// +if ('undefined' !== typeof module) { + module.exports = EventEmitter; +} diff --git a/node_modules/eventemitter3/package.json b/node_modules/eventemitter3/package.json new file mode 100644 index 0000000..3c575b4 --- /dev/null +++ b/node_modules/eventemitter3/package.json @@ -0,0 +1,56 @@ +{ + "name": "eventemitter3", + "version": "4.0.7", + "description": "EventEmitter3 focuses on performance while maintaining a Node.js AND browser compatible interface.", + "main": "index.js", + "typings": "index.d.ts", + "scripts": { + "browserify": "rm -rf umd && mkdir umd && browserify index.js -s EventEmitter3 -o umd/eventemitter3.js", + "minify": "uglifyjs umd/eventemitter3.js --source-map -cm -o umd/eventemitter3.min.js", + "benchmark": "find benchmarks/run -name '*.js' -exec benchmarks/start.sh {} \\;", + "test": "nyc --reporter=html --reporter=text mocha test/test.js", + "prepublishOnly": "npm run browserify && npm run minify", + "test-browser": "node test/browser.js" + }, + "files": [ + "index.js", + "index.d.ts", + "umd" + ], + "repository": { + "type": "git", + "url": "git://github.com/primus/eventemitter3.git" + }, + "keywords": [ + "EventEmitter", + "EventEmitter2", + "EventEmitter3", + "Events", + "addEventListener", + "addListener", + "emit", + "emits", + "emitter", + "event", + "once", + "pub/sub", + "publish", + "reactor", + "subscribe" + ], + "author": "Arnout Kazemier", + "license": "MIT", + "bugs": { + "url": "https://github.com/primus/eventemitter3/issues" + }, + "devDependencies": { + "assume": "^2.2.0", + "browserify": "^16.5.0", + "mocha": "^8.0.1", + "nyc": "^15.1.0", + "pre-commit": "^1.2.0", + "sauce-browsers": "^2.0.0", + "sauce-test": "^1.3.3", + "uglify-js": "^3.9.0" + } +} diff --git a/node_modules/eventemitter3/umd/eventemitter3.js b/node_modules/eventemitter3/umd/eventemitter3.js new file mode 100644 index 0000000..888fcb8 --- /dev/null +++ b/node_modules/eventemitter3/umd/eventemitter3.js @@ -0,0 +1,340 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.EventEmitter3 = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i Extend an object with the properties of additional objects. node.js/javascript util. + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i extend-shallow --save +``` + +## Usage + +```js +var extend = require('extend-shallow'); + +extend({a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +Pass an empty object to shallow clone: + +```js +var obj = {}; +extend(obj, {a: 'b'}, {c: 'd'}) +//=> {a: 'b', c: 'd'} +``` + +## Related + +* [extend-shallow](https://github.com/jonschlinkert/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. +* [for-own](https://github.com/jonschlinkert/for-own): Iterate over the own enumerable properties of an object, and return an object with properties… [more](https://github.com/jonschlinkert/for-own) +* [for-in](https://github.com/jonschlinkert/for-in): Iterate over the own and inherited enumerable properties of an objecte, and return an object… [more](https://github.com/jonschlinkert/for-in) +* [is-plain-object](https://github.com/jonschlinkert/is-plain-object): Returns true if an object was created by the `Object` constructor. +* [isobject](https://github.com/jonschlinkert/isobject): Returns true if the value is an object and not an array or null. +* [kind-of](https://github.com/jonschlinkert/kind-of): Get the native type of a value. + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on June 29, 2015._ \ No newline at end of file diff --git a/node_modules/extend-shallow/index.js b/node_modules/extend-shallow/index.js new file mode 100644 index 0000000..92a067f --- /dev/null +++ b/node_modules/extend-shallow/index.js @@ -0,0 +1,33 @@ +'use strict'; + +var isObject = require('is-extendable'); + +module.exports = function extend(o/*, objects*/) { + if (!isObject(o)) { o = {}; } + + var len = arguments.length; + for (var i = 1; i < len; i++) { + var obj = arguments[i]; + + if (isObject(obj)) { + assign(o, obj); + } + } + return o; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} diff --git a/node_modules/extend-shallow/package.json b/node_modules/extend-shallow/package.json new file mode 100644 index 0000000..b42e01c --- /dev/null +++ b/node_modules/extend-shallow/package.json @@ -0,0 +1,56 @@ +{ + "name": "extend-shallow", + "description": "Extend an object with the properties of additional objects. node.js/javascript util.", + "version": "2.0.1", + "homepage": "https://github.com/jonschlinkert/extend-shallow", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/extend-shallow", + "bugs": { + "url": "https://github.com/jonschlinkert/extend-shallow/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "devDependencies": { + "array-slice": "^0.2.3", + "benchmarked": "^0.1.4", + "chalk": "^1.0.0", + "for-own": "^0.1.3", + "glob": "^5.0.12", + "is-plain-object": "^2.0.1", + "kind-of": "^2.0.0", + "minimist": "^1.1.1", + "mocha": "^2.2.5", + "should": "^7.0.1" + }, + "keywords": [ + "assign", + "extend", + "javascript", + "js", + "keys", + "merge", + "obj", + "object", + "prop", + "properties", + "property", + "props", + "shallow", + "util", + "utility", + "utils", + "value" + ] +} \ No newline at end of file diff --git a/node_modules/fdir/LICENSE b/node_modules/fdir/LICENSE new file mode 100644 index 0000000..bb7fdee --- /dev/null +++ b/node_modules/fdir/LICENSE @@ -0,0 +1,7 @@ +Copyright 2023 Abdullah Atta + +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/fdir/README.md b/node_modules/fdir/README.md new file mode 100644 index 0000000..5c70530 --- /dev/null +++ b/node_modules/fdir/README.md @@ -0,0 +1,91 @@ +

    + + +

    The Fastest Directory Crawler & Globber for NodeJS

    +

    + + + + + + + + +

    +

    + +⚡ **The Fastest:** Nothing similar (in the NodeJS world) beats `fdir` in speed. It can easily crawl a directory containing **1 million files in < 1 second.** + +💡 **Stupidly Easy:** `fdir` uses expressive Builder pattern to build the crawler increasing code readability. + +🤖 **Zero Dependencies\*:** `fdir` only uses NodeJS `fs` & `path` modules. + +🕺 **Astonishingly Small:** < 2KB in size gzipped & minified. + +🖮 **Hackable:** Extending `fdir` is extremely simple now that the new Builder API is here. Feel free to experiment around. + +_\* `picomatch` must be installed manually by the user to support globbing._ + +## 🚄 Quickstart + +### Installation + +You can install using `npm`: + +```sh +$ npm i fdir +``` + +or Yarn: + +```sh +$ yarn add fdir +``` + +### Usage + +```ts +import { fdir } from "fdir"; + +// create the builder +const api = new fdir().withFullPaths().crawl("path/to/dir"); + +// get all files in a directory synchronously +const files = api.sync(); + +// or asynchronously +api.withPromise().then((files) => { + // do something with the result here. +}); +``` + +## Documentation: + +Documentation for all methods is available [here](/documentation.md). + +## 📊 Benchmarks: + +Please check the benchmark against the latest version [here](/BENCHMARKS.md). + +## 🙏Used by: + +`fdir` is downloaded over 200k+ times a week by projects around the world. Here's a list of some notable projects using `fdir` in production: + +> Note: if you think your project should be here, feel free to open an issue. Notable is anything with a considerable amount of GitHub stars. + +1. [rollup/plugins](https://github.com/rollup/plugins) +2. [SuperchupuDev/tinyglobby](https://github.com/SuperchupuDev/tinyglobby) +3. [pulumi/pulumi](https://github.com/pulumi/pulumi) +4. [dotenvx/dotenvx](https://github.com/dotenvx/dotenvx) +5. [mdn/yari](https://github.com/mdn/yari) +6. [streetwriters/notesnook](https://github.com/streetwriters/notesnook) +7. [imba/imba](https://github.com/imba/imba) +8. [moroshko/react-scanner](https://github.com/moroshko/react-scanner) +9. [netlify/build](https://github.com/netlify/build) +10. [yassinedoghri/astro-i18next](https://github.com/yassinedoghri/astro-i18next) +11. [selfrefactor/rambda](https://github.com/selfrefactor/rambda) +12. [whyboris/Video-Hub-App](https://github.com/whyboris/Video-Hub-App) + +## 🦮 LICENSE + +Copyright © 2024 Abdullah Atta under MIT. [Read full text here.](https://github.com/thecodrr/fdir/raw/master/LICENSE) diff --git a/node_modules/fdir/dist/index.cjs b/node_modules/fdir/dist/index.cjs new file mode 100644 index 0000000..4868ffb --- /dev/null +++ b/node_modules/fdir/dist/index.cjs @@ -0,0 +1,588 @@ +//#region rolldown:runtime +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { + key = keys[i]; + if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { + get: ((k) => from[k]).bind(null, key), + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { + value: mod, + enumerable: true +}) : target, mod)); + +//#endregion +const path = __toESM(require("path")); +const fs = __toESM(require("fs")); + +//#region src/utils.ts +function cleanPath(path$1) { + let normalized = (0, path.normalize)(path$1); + if (normalized.length > 1 && normalized[normalized.length - 1] === path.sep) normalized = normalized.substring(0, normalized.length - 1); + return normalized; +} +const SLASHES_REGEX = /[\\/]/g; +function convertSlashes(path$1, separator) { + return path$1.replace(SLASHES_REGEX, separator); +} +const WINDOWS_ROOT_DIR_REGEX = /^[a-z]:[\\/]$/i; +function isRootDirectory(path$1) { + return path$1 === "/" || WINDOWS_ROOT_DIR_REGEX.test(path$1); +} +function normalizePath(path$1, options) { + const { resolvePaths, normalizePath: normalizePath$1, pathSeparator } = options; + const pathNeedsCleaning = process.platform === "win32" && path$1.includes("/") || path$1.startsWith("."); + if (resolvePaths) path$1 = (0, path.resolve)(path$1); + if (normalizePath$1 || pathNeedsCleaning) path$1 = cleanPath(path$1); + if (path$1 === ".") return ""; + const needsSeperator = path$1[path$1.length - 1] !== pathSeparator; + return convertSlashes(needsSeperator ? path$1 + pathSeparator : path$1, pathSeparator); +} + +//#endregion +//#region src/api/functions/join-path.ts +function joinPathWithBasePath(filename, directoryPath) { + return directoryPath + filename; +} +function joinPathWithRelativePath(root, options) { + return function(filename, directoryPath) { + const sameRoot = directoryPath.startsWith(root); + if (sameRoot) return directoryPath.slice(root.length) + filename; + else return convertSlashes((0, path.relative)(root, directoryPath), options.pathSeparator) + options.pathSeparator + filename; + }; +} +function joinPath(filename) { + return filename; +} +function joinDirectoryPath(filename, directoryPath, separator) { + return directoryPath + filename + separator; +} +function build$7(root, options) { + const { relativePaths, includeBasePath } = options; + return relativePaths && root ? joinPathWithRelativePath(root, options) : includeBasePath ? joinPathWithBasePath : joinPath; +} + +//#endregion +//#region src/api/functions/push-directory.ts +function pushDirectoryWithRelativePath(root) { + return function(directoryPath, paths) { + paths.push(directoryPath.substring(root.length) || "."); + }; +} +function pushDirectoryFilterWithRelativePath(root) { + return function(directoryPath, paths, filters) { + const relativePath = directoryPath.substring(root.length) || "."; + if (filters.every((filter) => filter(relativePath, true))) paths.push(relativePath); + }; +} +const pushDirectory = (directoryPath, paths) => { + paths.push(directoryPath || "."); +}; +const pushDirectoryFilter = (directoryPath, paths, filters) => { + const path$1 = directoryPath || "."; + if (filters.every((filter) => filter(path$1, true))) paths.push(path$1); +}; +const empty$2 = () => {}; +function build$6(root, options) { + const { includeDirs, filters, relativePaths } = options; + if (!includeDirs) return empty$2; + if (relativePaths) return filters && filters.length ? pushDirectoryFilterWithRelativePath(root) : pushDirectoryWithRelativePath(root); + return filters && filters.length ? pushDirectoryFilter : pushDirectory; +} + +//#endregion +//#region src/api/functions/push-file.ts +const pushFileFilterAndCount = (filename, _paths, counts, filters) => { + if (filters.every((filter) => filter(filename, false))) counts.files++; +}; +const pushFileFilter = (filename, paths, _counts, filters) => { + if (filters.every((filter) => filter(filename, false))) paths.push(filename); +}; +const pushFileCount = (_filename, _paths, counts, _filters) => { + counts.files++; +}; +const pushFile = (filename, paths) => { + paths.push(filename); +}; +const empty$1 = () => {}; +function build$5(options) { + const { excludeFiles, filters, onlyCounts } = options; + if (excludeFiles) return empty$1; + if (filters && filters.length) return onlyCounts ? pushFileFilterAndCount : pushFileFilter; + else if (onlyCounts) return pushFileCount; + else return pushFile; +} + +//#endregion +//#region src/api/functions/get-array.ts +const getArray = (paths) => { + return paths; +}; +const getArrayGroup = () => { + return [""].slice(0, 0); +}; +function build$4(options) { + return options.group ? getArrayGroup : getArray; +} + +//#endregion +//#region src/api/functions/group-files.ts +const groupFiles = (groups, directory, files) => { + groups.push({ + directory, + files, + dir: directory + }); +}; +const empty = () => {}; +function build$3(options) { + return options.group ? groupFiles : empty; +} + +//#endregion +//#region src/api/functions/resolve-symlink.ts +const resolveSymlinksAsync = function(path$1, state, callback$1) { + const { queue, fs: fs$1, options: { suppressErrors } } = state; + queue.enqueue(); + fs$1.realpath(path$1, (error, resolvedPath) => { + if (error) return queue.dequeue(suppressErrors ? null : error, state); + fs$1.stat(resolvedPath, (error$1, stat) => { + if (error$1) return queue.dequeue(suppressErrors ? null : error$1, state); + if (stat.isDirectory() && isRecursive(path$1, resolvedPath, state)) return queue.dequeue(null, state); + callback$1(stat, resolvedPath); + queue.dequeue(null, state); + }); + }); +}; +const resolveSymlinks = function(path$1, state, callback$1) { + const { queue, fs: fs$1, options: { suppressErrors } } = state; + queue.enqueue(); + try { + const resolvedPath = fs$1.realpathSync(path$1); + const stat = fs$1.statSync(resolvedPath); + if (stat.isDirectory() && isRecursive(path$1, resolvedPath, state)) return; + callback$1(stat, resolvedPath); + } catch (e) { + if (!suppressErrors) throw e; + } +}; +function build$2(options, isSynchronous) { + if (!options.resolveSymlinks || options.excludeSymlinks) return null; + return isSynchronous ? resolveSymlinks : resolveSymlinksAsync; +} +function isRecursive(path$1, resolved, state) { + if (state.options.useRealPaths) return isRecursiveUsingRealPaths(resolved, state); + let parent = (0, path.dirname)(path$1); + let depth = 1; + while (parent !== state.root && depth < 2) { + const resolvedPath = state.symlinks.get(parent); + const isSameRoot = !!resolvedPath && (resolvedPath === resolved || resolvedPath.startsWith(resolved) || resolved.startsWith(resolvedPath)); + if (isSameRoot) depth++; + else parent = (0, path.dirname)(parent); + } + state.symlinks.set(path$1, resolved); + return depth > 1; +} +function isRecursiveUsingRealPaths(resolved, state) { + return state.visited.includes(resolved + state.options.pathSeparator); +} + +//#endregion +//#region src/api/functions/invoke-callback.ts +const onlyCountsSync = (state) => { + return state.counts; +}; +const groupsSync = (state) => { + return state.groups; +}; +const defaultSync = (state) => { + return state.paths; +}; +const limitFilesSync = (state) => { + return state.paths.slice(0, state.options.maxFiles); +}; +const onlyCountsAsync = (state, error, callback$1) => { + report(error, callback$1, state.counts, state.options.suppressErrors); + return null; +}; +const defaultAsync = (state, error, callback$1) => { + report(error, callback$1, state.paths, state.options.suppressErrors); + return null; +}; +const limitFilesAsync = (state, error, callback$1) => { + report(error, callback$1, state.paths.slice(0, state.options.maxFiles), state.options.suppressErrors); + return null; +}; +const groupsAsync = (state, error, callback$1) => { + report(error, callback$1, state.groups, state.options.suppressErrors); + return null; +}; +function report(error, callback$1, output, suppressErrors) { + if (error && !suppressErrors) callback$1(error, output); + else callback$1(null, output); +} +function build$1(options, isSynchronous) { + const { onlyCounts, group, maxFiles } = options; + if (onlyCounts) return isSynchronous ? onlyCountsSync : onlyCountsAsync; + else if (group) return isSynchronous ? groupsSync : groupsAsync; + else if (maxFiles) return isSynchronous ? limitFilesSync : limitFilesAsync; + else return isSynchronous ? defaultSync : defaultAsync; +} + +//#endregion +//#region src/api/functions/walk-directory.ts +const readdirOpts = { withFileTypes: true }; +const walkAsync = (state, crawlPath, directoryPath, currentDepth, callback$1) => { + state.queue.enqueue(); + if (currentDepth < 0) return state.queue.dequeue(null, state); + const { fs: fs$1 } = state; + state.visited.push(crawlPath); + state.counts.directories++; + fs$1.readdir(crawlPath || ".", readdirOpts, (error, entries = []) => { + callback$1(entries, directoryPath, currentDepth); + state.queue.dequeue(state.options.suppressErrors ? null : error, state); + }); +}; +const walkSync = (state, crawlPath, directoryPath, currentDepth, callback$1) => { + const { fs: fs$1 } = state; + if (currentDepth < 0) return; + state.visited.push(crawlPath); + state.counts.directories++; + let entries = []; + try { + entries = fs$1.readdirSync(crawlPath || ".", readdirOpts); + } catch (e) { + if (!state.options.suppressErrors) throw e; + } + callback$1(entries, directoryPath, currentDepth); +}; +function build(isSynchronous) { + return isSynchronous ? walkSync : walkAsync; +} + +//#endregion +//#region src/api/queue.ts +/** +* This is a custom stateless queue to track concurrent async fs calls. +* It increments a counter whenever a call is queued and decrements it +* as soon as it completes. When the counter hits 0, it calls onQueueEmpty. +*/ +var Queue = class { + count = 0; + constructor(onQueueEmpty) { + this.onQueueEmpty = onQueueEmpty; + } + enqueue() { + this.count++; + return this.count; + } + dequeue(error, output) { + if (this.onQueueEmpty && (--this.count <= 0 || error)) { + this.onQueueEmpty(error, output); + if (error) { + output.controller.abort(); + this.onQueueEmpty = void 0; + } + } + } +}; + +//#endregion +//#region src/api/counter.ts +var Counter = class { + _files = 0; + _directories = 0; + set files(num) { + this._files = num; + } + get files() { + return this._files; + } + set directories(num) { + this._directories = num; + } + get directories() { + return this._directories; + } + /** + * @deprecated use `directories` instead + */ + /* c8 ignore next 3 */ + get dirs() { + return this._directories; + } +}; + +//#endregion +//#region src/api/aborter.ts +/** +* AbortController is not supported on Node 14 so we use this until we can drop +* support for Node 14. +*/ +var Aborter = class { + aborted = false; + abort() { + this.aborted = true; + } +}; + +//#endregion +//#region src/api/walker.ts +var Walker = class { + root; + isSynchronous; + state; + joinPath; + pushDirectory; + pushFile; + getArray; + groupFiles; + resolveSymlink; + walkDirectory; + callbackInvoker; + constructor(root, options, callback$1) { + this.isSynchronous = !callback$1; + this.callbackInvoker = build$1(options, this.isSynchronous); + this.root = normalizePath(root, options); + this.state = { + root: isRootDirectory(this.root) ? this.root : this.root.slice(0, -1), + paths: [""].slice(0, 0), + groups: [], + counts: new Counter(), + options, + queue: new Queue((error, state) => this.callbackInvoker(state, error, callback$1)), + symlinks: /* @__PURE__ */ new Map(), + visited: [""].slice(0, 0), + controller: new Aborter(), + fs: options.fs || fs + }; + this.joinPath = build$7(this.root, options); + this.pushDirectory = build$6(this.root, options); + this.pushFile = build$5(options); + this.getArray = build$4(options); + this.groupFiles = build$3(options); + this.resolveSymlink = build$2(options, this.isSynchronous); + this.walkDirectory = build(this.isSynchronous); + } + start() { + this.pushDirectory(this.root, this.state.paths, this.state.options.filters); + this.walkDirectory(this.state, this.root, this.root, this.state.options.maxDepth, this.walk); + return this.isSynchronous ? this.callbackInvoker(this.state, null) : null; + } + walk = (entries, directoryPath, depth) => { + const { paths, options: { filters, resolveSymlinks: resolveSymlinks$1, excludeSymlinks, exclude, maxFiles, signal, useRealPaths, pathSeparator }, controller } = this.state; + if (controller.aborted || signal && signal.aborted || maxFiles && paths.length > maxFiles) return; + const files = this.getArray(this.state.paths); + for (let i = 0; i < entries.length; ++i) { + const entry = entries[i]; + if (entry.isFile() || entry.isSymbolicLink() && !resolveSymlinks$1 && !excludeSymlinks) { + const filename = this.joinPath(entry.name, directoryPath); + this.pushFile(filename, files, this.state.counts, filters); + } else if (entry.isDirectory()) { + let path$1 = joinDirectoryPath(entry.name, directoryPath, this.state.options.pathSeparator); + if (exclude && exclude(entry.name, path$1)) continue; + this.pushDirectory(path$1, paths, filters); + this.walkDirectory(this.state, path$1, path$1, depth - 1, this.walk); + } else if (this.resolveSymlink && entry.isSymbolicLink()) { + let path$1 = joinPathWithBasePath(entry.name, directoryPath); + this.resolveSymlink(path$1, this.state, (stat, resolvedPath) => { + if (stat.isDirectory()) { + resolvedPath = normalizePath(resolvedPath, this.state.options); + if (exclude && exclude(entry.name, useRealPaths ? resolvedPath : path$1 + pathSeparator)) return; + this.walkDirectory(this.state, resolvedPath, useRealPaths ? resolvedPath : path$1 + pathSeparator, depth - 1, this.walk); + } else { + resolvedPath = useRealPaths ? resolvedPath : path$1; + const filename = (0, path.basename)(resolvedPath); + const directoryPath$1 = normalizePath((0, path.dirname)(resolvedPath), this.state.options); + resolvedPath = this.joinPath(filename, directoryPath$1); + this.pushFile(resolvedPath, files, this.state.counts, filters); + } + }); + } + } + this.groupFiles(this.state.groups, directoryPath, files); + }; +}; + +//#endregion +//#region src/api/async.ts +function promise(root, options) { + return new Promise((resolve$1, reject) => { + callback(root, options, (err, output) => { + if (err) return reject(err); + resolve$1(output); + }); + }); +} +function callback(root, options, callback$1) { + let walker = new Walker(root, options, callback$1); + walker.start(); +} + +//#endregion +//#region src/api/sync.ts +function sync(root, options) { + const walker = new Walker(root, options); + return walker.start(); +} + +//#endregion +//#region src/builder/api-builder.ts +var APIBuilder = class { + constructor(root, options) { + this.root = root; + this.options = options; + } + withPromise() { + return promise(this.root, this.options); + } + withCallback(cb) { + callback(this.root, this.options, cb); + } + sync() { + return sync(this.root, this.options); + } +}; + +//#endregion +//#region src/builder/index.ts +let pm = null; +/* c8 ignore next 6 */ +try { + require.resolve("picomatch"); + pm = require("picomatch"); +} catch {} +var Builder = class { + globCache = {}; + options = { + maxDepth: Infinity, + suppressErrors: true, + pathSeparator: path.sep, + filters: [] + }; + globFunction; + constructor(options) { + this.options = { + ...this.options, + ...options + }; + this.globFunction = this.options.globFunction; + } + group() { + this.options.group = true; + return this; + } + withPathSeparator(separator) { + this.options.pathSeparator = separator; + return this; + } + withBasePath() { + this.options.includeBasePath = true; + return this; + } + withRelativePaths() { + this.options.relativePaths = true; + return this; + } + withDirs() { + this.options.includeDirs = true; + return this; + } + withMaxDepth(depth) { + this.options.maxDepth = depth; + return this; + } + withMaxFiles(limit) { + this.options.maxFiles = limit; + return this; + } + withFullPaths() { + this.options.resolvePaths = true; + this.options.includeBasePath = true; + return this; + } + withErrors() { + this.options.suppressErrors = false; + return this; + } + withSymlinks({ resolvePaths = true } = {}) { + this.options.resolveSymlinks = true; + this.options.useRealPaths = resolvePaths; + return this.withFullPaths(); + } + withAbortSignal(signal) { + this.options.signal = signal; + return this; + } + normalize() { + this.options.normalizePath = true; + return this; + } + filter(predicate) { + this.options.filters.push(predicate); + return this; + } + onlyDirs() { + this.options.excludeFiles = true; + this.options.includeDirs = true; + return this; + } + exclude(predicate) { + this.options.exclude = predicate; + return this; + } + onlyCounts() { + this.options.onlyCounts = true; + return this; + } + crawl(root) { + return new APIBuilder(root || ".", this.options); + } + withGlobFunction(fn) { + this.globFunction = fn; + return this; + } + /** + * @deprecated Pass options using the constructor instead: + * ```ts + * new fdir(options).crawl("/path/to/root"); + * ``` + * This method will be removed in v7.0 + */ + /* c8 ignore next 4 */ + crawlWithOptions(root, options) { + this.options = { + ...this.options, + ...options + }; + return new APIBuilder(root || ".", this.options); + } + glob(...patterns) { + if (this.globFunction) return this.globWithOptions(patterns); + return this.globWithOptions(patterns, ...[{ dot: true }]); + } + globWithOptions(patterns, ...options) { + const globFn = this.globFunction || pm; + /* c8 ignore next 5 */ + if (!globFn) throw new Error("Please specify a glob function to use glob matching."); + var isMatch = this.globCache[patterns.join("\0")]; + if (!isMatch) { + isMatch = globFn(patterns, ...options); + this.globCache[patterns.join("\0")] = isMatch; + } + this.options.filters.push((path$1) => isMatch(path$1)); + return this; + } +}; + +//#endregion +exports.fdir = Builder; \ No newline at end of file diff --git a/node_modules/fdir/dist/index.d.cts b/node_modules/fdir/dist/index.d.cts new file mode 100644 index 0000000..f448ef5 --- /dev/null +++ b/node_modules/fdir/dist/index.d.cts @@ -0,0 +1,155 @@ +/// +import * as nativeFs from "fs"; +import picomatch from "picomatch"; + +//#region src/api/aborter.d.ts +/** + * AbortController is not supported on Node 14 so we use this until we can drop + * support for Node 14. + */ +declare class Aborter { + aborted: boolean; + abort(): void; +} +//#endregion +//#region src/api/queue.d.ts +type OnQueueEmptyCallback = (error: Error | null, output: WalkerState) => void; +/** + * This is a custom stateless queue to track concurrent async fs calls. + * It increments a counter whenever a call is queued and decrements it + * as soon as it completes. When the counter hits 0, it calls onQueueEmpty. + */ +declare class Queue { + private onQueueEmpty?; + count: number; + constructor(onQueueEmpty?: OnQueueEmptyCallback | undefined); + enqueue(): number; + dequeue(error: Error | null, output: WalkerState): void; +} +//#endregion +//#region src/types.d.ts +type Counts = { + files: number; + directories: number; + /** + * @deprecated use `directories` instead. Will be removed in v7.0. + */ + dirs: number; +}; +type Group = { + directory: string; + files: string[]; + /** + * @deprecated use `directory` instead. Will be removed in v7.0. + */ + dir: string; +}; +type GroupOutput = Group[]; +type OnlyCountsOutput = Counts; +type PathsOutput = string[]; +type Output = OnlyCountsOutput | PathsOutput | GroupOutput; +type FSLike = { + readdir: typeof nativeFs.readdir; + readdirSync: typeof nativeFs.readdirSync; + realpath: typeof nativeFs.realpath; + realpathSync: typeof nativeFs.realpathSync; + stat: typeof nativeFs.stat; + statSync: typeof nativeFs.statSync; +}; +type WalkerState = { + root: string; + paths: string[]; + groups: Group[]; + counts: Counts; + options: Options; + queue: Queue; + controller: Aborter; + fs: FSLike; + symlinks: Map; + visited: string[]; +}; +type ResultCallback = (error: Error | null, output: TOutput) => void; +type FilterPredicate = (path: string, isDirectory: boolean) => boolean; +type ExcludePredicate = (dirName: string, dirPath: string) => boolean; +type PathSeparator = "/" | "\\"; +type Options = { + includeBasePath?: boolean; + includeDirs?: boolean; + normalizePath?: boolean; + maxDepth: number; + maxFiles?: number; + resolvePaths?: boolean; + suppressErrors: boolean; + group?: boolean; + onlyCounts?: boolean; + filters: FilterPredicate[]; + resolveSymlinks?: boolean; + useRealPaths?: boolean; + excludeFiles?: boolean; + excludeSymlinks?: boolean; + exclude?: ExcludePredicate; + relativePaths?: boolean; + pathSeparator: PathSeparator; + signal?: AbortSignal; + globFunction?: TGlobFunction; + fs?: FSLike; +}; +type GlobMatcher = (test: string) => boolean; +type GlobFunction = (glob: string | string[], ...params: unknown[]) => GlobMatcher; +type GlobParams = T extends ((globs: string | string[], ...params: infer TParams extends unknown[]) => GlobMatcher) ? TParams : []; +//#endregion +//#region src/builder/api-builder.d.ts +declare class APIBuilder { + private readonly root; + private readonly options; + constructor(root: string, options: Options); + withPromise(): Promise; + withCallback(cb: ResultCallback): void; + sync(): TReturnType; +} +//#endregion +//#region src/builder/index.d.ts +declare class Builder { + private readonly globCache; + private options; + private globFunction?; + constructor(options?: Partial>); + group(): Builder; + withPathSeparator(separator: "/" | "\\"): this; + withBasePath(): this; + withRelativePaths(): this; + withDirs(): this; + withMaxDepth(depth: number): this; + withMaxFiles(limit: number): this; + withFullPaths(): this; + withErrors(): this; + withSymlinks({ + resolvePaths + }?: { + resolvePaths?: boolean | undefined; + }): this; + withAbortSignal(signal: AbortSignal): this; + normalize(): this; + filter(predicate: FilterPredicate): this; + onlyDirs(): this; + exclude(predicate: ExcludePredicate): this; + onlyCounts(): Builder; + crawl(root?: string): APIBuilder; + withGlobFunction(fn: TFunc): Builder; + /** + * @deprecated Pass options using the constructor instead: + * ```ts + * new fdir(options).crawl("/path/to/root"); + * ``` + * This method will be removed in v7.0 + */ + crawlWithOptions(root: string, options: Partial>): APIBuilder; + glob(...patterns: string[]): Builder; + globWithOptions(patterns: string[]): Builder; + globWithOptions(patterns: string[], ...options: GlobParams): Builder; +} +//#endregion +//#region src/index.d.ts +type Fdir = typeof Builder; +//#endregion +export { Counts, ExcludePredicate, FSLike, Fdir, FilterPredicate, GlobFunction, GlobMatcher, GlobParams, Group, GroupOutput, OnlyCountsOutput, Options, Output, PathSeparator, PathsOutput, ResultCallback, WalkerState, Builder as fdir }; \ No newline at end of file diff --git a/node_modules/fdir/dist/index.d.mts b/node_modules/fdir/dist/index.d.mts new file mode 100644 index 0000000..f448ef5 --- /dev/null +++ b/node_modules/fdir/dist/index.d.mts @@ -0,0 +1,155 @@ +/// +import * as nativeFs from "fs"; +import picomatch from "picomatch"; + +//#region src/api/aborter.d.ts +/** + * AbortController is not supported on Node 14 so we use this until we can drop + * support for Node 14. + */ +declare class Aborter { + aborted: boolean; + abort(): void; +} +//#endregion +//#region src/api/queue.d.ts +type OnQueueEmptyCallback = (error: Error | null, output: WalkerState) => void; +/** + * This is a custom stateless queue to track concurrent async fs calls. + * It increments a counter whenever a call is queued and decrements it + * as soon as it completes. When the counter hits 0, it calls onQueueEmpty. + */ +declare class Queue { + private onQueueEmpty?; + count: number; + constructor(onQueueEmpty?: OnQueueEmptyCallback | undefined); + enqueue(): number; + dequeue(error: Error | null, output: WalkerState): void; +} +//#endregion +//#region src/types.d.ts +type Counts = { + files: number; + directories: number; + /** + * @deprecated use `directories` instead. Will be removed in v7.0. + */ + dirs: number; +}; +type Group = { + directory: string; + files: string[]; + /** + * @deprecated use `directory` instead. Will be removed in v7.0. + */ + dir: string; +}; +type GroupOutput = Group[]; +type OnlyCountsOutput = Counts; +type PathsOutput = string[]; +type Output = OnlyCountsOutput | PathsOutput | GroupOutput; +type FSLike = { + readdir: typeof nativeFs.readdir; + readdirSync: typeof nativeFs.readdirSync; + realpath: typeof nativeFs.realpath; + realpathSync: typeof nativeFs.realpathSync; + stat: typeof nativeFs.stat; + statSync: typeof nativeFs.statSync; +}; +type WalkerState = { + root: string; + paths: string[]; + groups: Group[]; + counts: Counts; + options: Options; + queue: Queue; + controller: Aborter; + fs: FSLike; + symlinks: Map; + visited: string[]; +}; +type ResultCallback = (error: Error | null, output: TOutput) => void; +type FilterPredicate = (path: string, isDirectory: boolean) => boolean; +type ExcludePredicate = (dirName: string, dirPath: string) => boolean; +type PathSeparator = "/" | "\\"; +type Options = { + includeBasePath?: boolean; + includeDirs?: boolean; + normalizePath?: boolean; + maxDepth: number; + maxFiles?: number; + resolvePaths?: boolean; + suppressErrors: boolean; + group?: boolean; + onlyCounts?: boolean; + filters: FilterPredicate[]; + resolveSymlinks?: boolean; + useRealPaths?: boolean; + excludeFiles?: boolean; + excludeSymlinks?: boolean; + exclude?: ExcludePredicate; + relativePaths?: boolean; + pathSeparator: PathSeparator; + signal?: AbortSignal; + globFunction?: TGlobFunction; + fs?: FSLike; +}; +type GlobMatcher = (test: string) => boolean; +type GlobFunction = (glob: string | string[], ...params: unknown[]) => GlobMatcher; +type GlobParams = T extends ((globs: string | string[], ...params: infer TParams extends unknown[]) => GlobMatcher) ? TParams : []; +//#endregion +//#region src/builder/api-builder.d.ts +declare class APIBuilder { + private readonly root; + private readonly options; + constructor(root: string, options: Options); + withPromise(): Promise; + withCallback(cb: ResultCallback): void; + sync(): TReturnType; +} +//#endregion +//#region src/builder/index.d.ts +declare class Builder { + private readonly globCache; + private options; + private globFunction?; + constructor(options?: Partial>); + group(): Builder; + withPathSeparator(separator: "/" | "\\"): this; + withBasePath(): this; + withRelativePaths(): this; + withDirs(): this; + withMaxDepth(depth: number): this; + withMaxFiles(limit: number): this; + withFullPaths(): this; + withErrors(): this; + withSymlinks({ + resolvePaths + }?: { + resolvePaths?: boolean | undefined; + }): this; + withAbortSignal(signal: AbortSignal): this; + normalize(): this; + filter(predicate: FilterPredicate): this; + onlyDirs(): this; + exclude(predicate: ExcludePredicate): this; + onlyCounts(): Builder; + crawl(root?: string): APIBuilder; + withGlobFunction(fn: TFunc): Builder; + /** + * @deprecated Pass options using the constructor instead: + * ```ts + * new fdir(options).crawl("/path/to/root"); + * ``` + * This method will be removed in v7.0 + */ + crawlWithOptions(root: string, options: Partial>): APIBuilder; + glob(...patterns: string[]): Builder; + globWithOptions(patterns: string[]): Builder; + globWithOptions(patterns: string[], ...options: GlobParams): Builder; +} +//#endregion +//#region src/index.d.ts +type Fdir = typeof Builder; +//#endregion +export { Counts, ExcludePredicate, FSLike, Fdir, FilterPredicate, GlobFunction, GlobMatcher, GlobParams, Group, GroupOutput, OnlyCountsOutput, Options, Output, PathSeparator, PathsOutput, ResultCallback, WalkerState, Builder as fdir }; \ No newline at end of file diff --git a/node_modules/fdir/dist/index.mjs b/node_modules/fdir/dist/index.mjs new file mode 100644 index 0000000..5c37e09 --- /dev/null +++ b/node_modules/fdir/dist/index.mjs @@ -0,0 +1,570 @@ +import { createRequire } from "module"; +import { basename, dirname, normalize, relative, resolve, sep } from "path"; +import * as nativeFs from "fs"; + +//#region rolldown:runtime +var __require = /* @__PURE__ */ createRequire(import.meta.url); + +//#endregion +//#region src/utils.ts +function cleanPath(path) { + let normalized = normalize(path); + if (normalized.length > 1 && normalized[normalized.length - 1] === sep) normalized = normalized.substring(0, normalized.length - 1); + return normalized; +} +const SLASHES_REGEX = /[\\/]/g; +function convertSlashes(path, separator) { + return path.replace(SLASHES_REGEX, separator); +} +const WINDOWS_ROOT_DIR_REGEX = /^[a-z]:[\\/]$/i; +function isRootDirectory(path) { + return path === "/" || WINDOWS_ROOT_DIR_REGEX.test(path); +} +function normalizePath(path, options) { + const { resolvePaths, normalizePath: normalizePath$1, pathSeparator } = options; + const pathNeedsCleaning = process.platform === "win32" && path.includes("/") || path.startsWith("."); + if (resolvePaths) path = resolve(path); + if (normalizePath$1 || pathNeedsCleaning) path = cleanPath(path); + if (path === ".") return ""; + const needsSeperator = path[path.length - 1] !== pathSeparator; + return convertSlashes(needsSeperator ? path + pathSeparator : path, pathSeparator); +} + +//#endregion +//#region src/api/functions/join-path.ts +function joinPathWithBasePath(filename, directoryPath) { + return directoryPath + filename; +} +function joinPathWithRelativePath(root, options) { + return function(filename, directoryPath) { + const sameRoot = directoryPath.startsWith(root); + if (sameRoot) return directoryPath.slice(root.length) + filename; + else return convertSlashes(relative(root, directoryPath), options.pathSeparator) + options.pathSeparator + filename; + }; +} +function joinPath(filename) { + return filename; +} +function joinDirectoryPath(filename, directoryPath, separator) { + return directoryPath + filename + separator; +} +function build$7(root, options) { + const { relativePaths, includeBasePath } = options; + return relativePaths && root ? joinPathWithRelativePath(root, options) : includeBasePath ? joinPathWithBasePath : joinPath; +} + +//#endregion +//#region src/api/functions/push-directory.ts +function pushDirectoryWithRelativePath(root) { + return function(directoryPath, paths) { + paths.push(directoryPath.substring(root.length) || "."); + }; +} +function pushDirectoryFilterWithRelativePath(root) { + return function(directoryPath, paths, filters) { + const relativePath = directoryPath.substring(root.length) || "."; + if (filters.every((filter) => filter(relativePath, true))) paths.push(relativePath); + }; +} +const pushDirectory = (directoryPath, paths) => { + paths.push(directoryPath || "."); +}; +const pushDirectoryFilter = (directoryPath, paths, filters) => { + const path = directoryPath || "."; + if (filters.every((filter) => filter(path, true))) paths.push(path); +}; +const empty$2 = () => {}; +function build$6(root, options) { + const { includeDirs, filters, relativePaths } = options; + if (!includeDirs) return empty$2; + if (relativePaths) return filters && filters.length ? pushDirectoryFilterWithRelativePath(root) : pushDirectoryWithRelativePath(root); + return filters && filters.length ? pushDirectoryFilter : pushDirectory; +} + +//#endregion +//#region src/api/functions/push-file.ts +const pushFileFilterAndCount = (filename, _paths, counts, filters) => { + if (filters.every((filter) => filter(filename, false))) counts.files++; +}; +const pushFileFilter = (filename, paths, _counts, filters) => { + if (filters.every((filter) => filter(filename, false))) paths.push(filename); +}; +const pushFileCount = (_filename, _paths, counts, _filters) => { + counts.files++; +}; +const pushFile = (filename, paths) => { + paths.push(filename); +}; +const empty$1 = () => {}; +function build$5(options) { + const { excludeFiles, filters, onlyCounts } = options; + if (excludeFiles) return empty$1; + if (filters && filters.length) return onlyCounts ? pushFileFilterAndCount : pushFileFilter; + else if (onlyCounts) return pushFileCount; + else return pushFile; +} + +//#endregion +//#region src/api/functions/get-array.ts +const getArray = (paths) => { + return paths; +}; +const getArrayGroup = () => { + return [""].slice(0, 0); +}; +function build$4(options) { + return options.group ? getArrayGroup : getArray; +} + +//#endregion +//#region src/api/functions/group-files.ts +const groupFiles = (groups, directory, files) => { + groups.push({ + directory, + files, + dir: directory + }); +}; +const empty = () => {}; +function build$3(options) { + return options.group ? groupFiles : empty; +} + +//#endregion +//#region src/api/functions/resolve-symlink.ts +const resolveSymlinksAsync = function(path, state, callback$1) { + const { queue, fs, options: { suppressErrors } } = state; + queue.enqueue(); + fs.realpath(path, (error, resolvedPath) => { + if (error) return queue.dequeue(suppressErrors ? null : error, state); + fs.stat(resolvedPath, (error$1, stat) => { + if (error$1) return queue.dequeue(suppressErrors ? null : error$1, state); + if (stat.isDirectory() && isRecursive(path, resolvedPath, state)) return queue.dequeue(null, state); + callback$1(stat, resolvedPath); + queue.dequeue(null, state); + }); + }); +}; +const resolveSymlinks = function(path, state, callback$1) { + const { queue, fs, options: { suppressErrors } } = state; + queue.enqueue(); + try { + const resolvedPath = fs.realpathSync(path); + const stat = fs.statSync(resolvedPath); + if (stat.isDirectory() && isRecursive(path, resolvedPath, state)) return; + callback$1(stat, resolvedPath); + } catch (e) { + if (!suppressErrors) throw e; + } +}; +function build$2(options, isSynchronous) { + if (!options.resolveSymlinks || options.excludeSymlinks) return null; + return isSynchronous ? resolveSymlinks : resolveSymlinksAsync; +} +function isRecursive(path, resolved, state) { + if (state.options.useRealPaths) return isRecursiveUsingRealPaths(resolved, state); + let parent = dirname(path); + let depth = 1; + while (parent !== state.root && depth < 2) { + const resolvedPath = state.symlinks.get(parent); + const isSameRoot = !!resolvedPath && (resolvedPath === resolved || resolvedPath.startsWith(resolved) || resolved.startsWith(resolvedPath)); + if (isSameRoot) depth++; + else parent = dirname(parent); + } + state.symlinks.set(path, resolved); + return depth > 1; +} +function isRecursiveUsingRealPaths(resolved, state) { + return state.visited.includes(resolved + state.options.pathSeparator); +} + +//#endregion +//#region src/api/functions/invoke-callback.ts +const onlyCountsSync = (state) => { + return state.counts; +}; +const groupsSync = (state) => { + return state.groups; +}; +const defaultSync = (state) => { + return state.paths; +}; +const limitFilesSync = (state) => { + return state.paths.slice(0, state.options.maxFiles); +}; +const onlyCountsAsync = (state, error, callback$1) => { + report(error, callback$1, state.counts, state.options.suppressErrors); + return null; +}; +const defaultAsync = (state, error, callback$1) => { + report(error, callback$1, state.paths, state.options.suppressErrors); + return null; +}; +const limitFilesAsync = (state, error, callback$1) => { + report(error, callback$1, state.paths.slice(0, state.options.maxFiles), state.options.suppressErrors); + return null; +}; +const groupsAsync = (state, error, callback$1) => { + report(error, callback$1, state.groups, state.options.suppressErrors); + return null; +}; +function report(error, callback$1, output, suppressErrors) { + if (error && !suppressErrors) callback$1(error, output); + else callback$1(null, output); +} +function build$1(options, isSynchronous) { + const { onlyCounts, group, maxFiles } = options; + if (onlyCounts) return isSynchronous ? onlyCountsSync : onlyCountsAsync; + else if (group) return isSynchronous ? groupsSync : groupsAsync; + else if (maxFiles) return isSynchronous ? limitFilesSync : limitFilesAsync; + else return isSynchronous ? defaultSync : defaultAsync; +} + +//#endregion +//#region src/api/functions/walk-directory.ts +const readdirOpts = { withFileTypes: true }; +const walkAsync = (state, crawlPath, directoryPath, currentDepth, callback$1) => { + state.queue.enqueue(); + if (currentDepth < 0) return state.queue.dequeue(null, state); + const { fs } = state; + state.visited.push(crawlPath); + state.counts.directories++; + fs.readdir(crawlPath || ".", readdirOpts, (error, entries = []) => { + callback$1(entries, directoryPath, currentDepth); + state.queue.dequeue(state.options.suppressErrors ? null : error, state); + }); +}; +const walkSync = (state, crawlPath, directoryPath, currentDepth, callback$1) => { + const { fs } = state; + if (currentDepth < 0) return; + state.visited.push(crawlPath); + state.counts.directories++; + let entries = []; + try { + entries = fs.readdirSync(crawlPath || ".", readdirOpts); + } catch (e) { + if (!state.options.suppressErrors) throw e; + } + callback$1(entries, directoryPath, currentDepth); +}; +function build(isSynchronous) { + return isSynchronous ? walkSync : walkAsync; +} + +//#endregion +//#region src/api/queue.ts +/** +* This is a custom stateless queue to track concurrent async fs calls. +* It increments a counter whenever a call is queued and decrements it +* as soon as it completes. When the counter hits 0, it calls onQueueEmpty. +*/ +var Queue = class { + count = 0; + constructor(onQueueEmpty) { + this.onQueueEmpty = onQueueEmpty; + } + enqueue() { + this.count++; + return this.count; + } + dequeue(error, output) { + if (this.onQueueEmpty && (--this.count <= 0 || error)) { + this.onQueueEmpty(error, output); + if (error) { + output.controller.abort(); + this.onQueueEmpty = void 0; + } + } + } +}; + +//#endregion +//#region src/api/counter.ts +var Counter = class { + _files = 0; + _directories = 0; + set files(num) { + this._files = num; + } + get files() { + return this._files; + } + set directories(num) { + this._directories = num; + } + get directories() { + return this._directories; + } + /** + * @deprecated use `directories` instead + */ + /* c8 ignore next 3 */ + get dirs() { + return this._directories; + } +}; + +//#endregion +//#region src/api/aborter.ts +/** +* AbortController is not supported on Node 14 so we use this until we can drop +* support for Node 14. +*/ +var Aborter = class { + aborted = false; + abort() { + this.aborted = true; + } +}; + +//#endregion +//#region src/api/walker.ts +var Walker = class { + root; + isSynchronous; + state; + joinPath; + pushDirectory; + pushFile; + getArray; + groupFiles; + resolveSymlink; + walkDirectory; + callbackInvoker; + constructor(root, options, callback$1) { + this.isSynchronous = !callback$1; + this.callbackInvoker = build$1(options, this.isSynchronous); + this.root = normalizePath(root, options); + this.state = { + root: isRootDirectory(this.root) ? this.root : this.root.slice(0, -1), + paths: [""].slice(0, 0), + groups: [], + counts: new Counter(), + options, + queue: new Queue((error, state) => this.callbackInvoker(state, error, callback$1)), + symlinks: /* @__PURE__ */ new Map(), + visited: [""].slice(0, 0), + controller: new Aborter(), + fs: options.fs || nativeFs + }; + this.joinPath = build$7(this.root, options); + this.pushDirectory = build$6(this.root, options); + this.pushFile = build$5(options); + this.getArray = build$4(options); + this.groupFiles = build$3(options); + this.resolveSymlink = build$2(options, this.isSynchronous); + this.walkDirectory = build(this.isSynchronous); + } + start() { + this.pushDirectory(this.root, this.state.paths, this.state.options.filters); + this.walkDirectory(this.state, this.root, this.root, this.state.options.maxDepth, this.walk); + return this.isSynchronous ? this.callbackInvoker(this.state, null) : null; + } + walk = (entries, directoryPath, depth) => { + const { paths, options: { filters, resolveSymlinks: resolveSymlinks$1, excludeSymlinks, exclude, maxFiles, signal, useRealPaths, pathSeparator }, controller } = this.state; + if (controller.aborted || signal && signal.aborted || maxFiles && paths.length > maxFiles) return; + const files = this.getArray(this.state.paths); + for (let i = 0; i < entries.length; ++i) { + const entry = entries[i]; + if (entry.isFile() || entry.isSymbolicLink() && !resolveSymlinks$1 && !excludeSymlinks) { + const filename = this.joinPath(entry.name, directoryPath); + this.pushFile(filename, files, this.state.counts, filters); + } else if (entry.isDirectory()) { + let path = joinDirectoryPath(entry.name, directoryPath, this.state.options.pathSeparator); + if (exclude && exclude(entry.name, path)) continue; + this.pushDirectory(path, paths, filters); + this.walkDirectory(this.state, path, path, depth - 1, this.walk); + } else if (this.resolveSymlink && entry.isSymbolicLink()) { + let path = joinPathWithBasePath(entry.name, directoryPath); + this.resolveSymlink(path, this.state, (stat, resolvedPath) => { + if (stat.isDirectory()) { + resolvedPath = normalizePath(resolvedPath, this.state.options); + if (exclude && exclude(entry.name, useRealPaths ? resolvedPath : path + pathSeparator)) return; + this.walkDirectory(this.state, resolvedPath, useRealPaths ? resolvedPath : path + pathSeparator, depth - 1, this.walk); + } else { + resolvedPath = useRealPaths ? resolvedPath : path; + const filename = basename(resolvedPath); + const directoryPath$1 = normalizePath(dirname(resolvedPath), this.state.options); + resolvedPath = this.joinPath(filename, directoryPath$1); + this.pushFile(resolvedPath, files, this.state.counts, filters); + } + }); + } + } + this.groupFiles(this.state.groups, directoryPath, files); + }; +}; + +//#endregion +//#region src/api/async.ts +function promise(root, options) { + return new Promise((resolve$1, reject) => { + callback(root, options, (err, output) => { + if (err) return reject(err); + resolve$1(output); + }); + }); +} +function callback(root, options, callback$1) { + let walker = new Walker(root, options, callback$1); + walker.start(); +} + +//#endregion +//#region src/api/sync.ts +function sync(root, options) { + const walker = new Walker(root, options); + return walker.start(); +} + +//#endregion +//#region src/builder/api-builder.ts +var APIBuilder = class { + constructor(root, options) { + this.root = root; + this.options = options; + } + withPromise() { + return promise(this.root, this.options); + } + withCallback(cb) { + callback(this.root, this.options, cb); + } + sync() { + return sync(this.root, this.options); + } +}; + +//#endregion +//#region src/builder/index.ts +let pm = null; +/* c8 ignore next 6 */ +try { + __require.resolve("picomatch"); + pm = __require("picomatch"); +} catch {} +var Builder = class { + globCache = {}; + options = { + maxDepth: Infinity, + suppressErrors: true, + pathSeparator: sep, + filters: [] + }; + globFunction; + constructor(options) { + this.options = { + ...this.options, + ...options + }; + this.globFunction = this.options.globFunction; + } + group() { + this.options.group = true; + return this; + } + withPathSeparator(separator) { + this.options.pathSeparator = separator; + return this; + } + withBasePath() { + this.options.includeBasePath = true; + return this; + } + withRelativePaths() { + this.options.relativePaths = true; + return this; + } + withDirs() { + this.options.includeDirs = true; + return this; + } + withMaxDepth(depth) { + this.options.maxDepth = depth; + return this; + } + withMaxFiles(limit) { + this.options.maxFiles = limit; + return this; + } + withFullPaths() { + this.options.resolvePaths = true; + this.options.includeBasePath = true; + return this; + } + withErrors() { + this.options.suppressErrors = false; + return this; + } + withSymlinks({ resolvePaths = true } = {}) { + this.options.resolveSymlinks = true; + this.options.useRealPaths = resolvePaths; + return this.withFullPaths(); + } + withAbortSignal(signal) { + this.options.signal = signal; + return this; + } + normalize() { + this.options.normalizePath = true; + return this; + } + filter(predicate) { + this.options.filters.push(predicate); + return this; + } + onlyDirs() { + this.options.excludeFiles = true; + this.options.includeDirs = true; + return this; + } + exclude(predicate) { + this.options.exclude = predicate; + return this; + } + onlyCounts() { + this.options.onlyCounts = true; + return this; + } + crawl(root) { + return new APIBuilder(root || ".", this.options); + } + withGlobFunction(fn) { + this.globFunction = fn; + return this; + } + /** + * @deprecated Pass options using the constructor instead: + * ```ts + * new fdir(options).crawl("/path/to/root"); + * ``` + * This method will be removed in v7.0 + */ + /* c8 ignore next 4 */ + crawlWithOptions(root, options) { + this.options = { + ...this.options, + ...options + }; + return new APIBuilder(root || ".", this.options); + } + glob(...patterns) { + if (this.globFunction) return this.globWithOptions(patterns); + return this.globWithOptions(patterns, ...[{ dot: true }]); + } + globWithOptions(patterns, ...options) { + const globFn = this.globFunction || pm; + /* c8 ignore next 5 */ + if (!globFn) throw new Error("Please specify a glob function to use glob matching."); + var isMatch = this.globCache[patterns.join("\0")]; + if (!isMatch) { + isMatch = globFn(patterns, ...options); + this.globCache[patterns.join("\0")] = isMatch; + } + this.options.filters.push((path) => isMatch(path)); + return this; + } +}; + +//#endregion +export { Builder as fdir }; \ No newline at end of file diff --git a/node_modules/fdir/package.json b/node_modules/fdir/package.json new file mode 100644 index 0000000..e229dff --- /dev/null +++ b/node_modules/fdir/package.json @@ -0,0 +1,103 @@ +{ + "name": "fdir", + "version": "6.5.0", + "description": "The fastest directory crawler & globbing alternative to glob, fast-glob, & tiny-glob. Crawls 1m files in < 1s", + "main": "./dist/index.cjs", + "types": "./dist/index.d.cts", + "type": "module", + "scripts": { + "prepublishOnly": "npm run test && npm run build", + "build": "tsdown", + "format": "prettier --write src __tests__ benchmarks", + "test": "vitest run __tests__/", + "test:coverage": "vitest run --coverage __tests__/", + "test:watch": "vitest __tests__/", + "bench": "ts-node benchmarks/benchmark.js", + "bench:glob": "ts-node benchmarks/glob-benchmark.ts", + "bench:fdir": "ts-node benchmarks/fdir-benchmark.ts", + "release": "./scripts/release.sh" + }, + "engines": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/thecodrr/fdir.git" + }, + "keywords": [ + "util", + "os", + "sys", + "fs", + "walk", + "crawler", + "directory", + "files", + "io", + "tiny-glob", + "glob", + "fast-glob", + "speed", + "javascript", + "nodejs" + ], + "author": "thecodrr ", + "license": "MIT", + "bugs": { + "url": "https://github.com/thecodrr/fdir/issues" + }, + "homepage": "https://github.com/thecodrr/fdir#readme", + "devDependencies": { + "@types/glob": "^8.1.0", + "@types/mock-fs": "^4.13.4", + "@types/node": "^20.9.4", + "@types/picomatch": "^4.0.0", + "@types/tap": "^15.0.11", + "@vitest/coverage-v8": "^0.34.6", + "all-files-in-tree": "^1.1.2", + "benny": "^3.7.1", + "csv-to-markdown-table": "^1.3.1", + "expect": "^29.7.0", + "fast-glob": "^3.3.2", + "fdir1": "npm:fdir@1.2.0", + "fdir2": "npm:fdir@2.1.0", + "fdir3": "npm:fdir@3.4.2", + "fdir4": "npm:fdir@4.1.0", + "fdir5": "npm:fdir@5.0.0", + "fs-readdir-recursive": "^1.1.0", + "get-all-files": "^4.1.0", + "glob": "^10.3.10", + "klaw-sync": "^6.0.0", + "mock-fs": "^5.2.0", + "picomatch": "^4.0.2", + "prettier": "^3.5.3", + "recur-readdir": "0.0.1", + "recursive-files": "^1.0.2", + "recursive-fs": "^2.1.0", + "recursive-readdir": "^2.2.3", + "rrdir": "^12.1.0", + "systeminformation": "^5.21.17", + "tiny-glob": "^0.2.9", + "ts-node": "^10.9.1", + "tsdown": "^0.12.5", + "typescript": "^5.3.2", + "vitest": "^0.34.6", + "walk-sync": "^3.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + }, + "module": "./dist/index.mjs", + "exports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "./package.json": "./package.json" + } +} diff --git a/node_modules/filesize/LICENSE b/node_modules/filesize/LICENSE new file mode 100644 index 0000000..ed3d813 --- /dev/null +++ b/node_modules/filesize/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2024, Jason Mulligan +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. + +* Neither the name of filesize nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE 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 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/node_modules/filesize/README.md b/node_modules/filesize/README.md new file mode 100644 index 0000000..e3ac224 --- /dev/null +++ b/node_modules/filesize/README.md @@ -0,0 +1,113 @@ +# filesize.js + +[![downloads](https://img.shields.io/npm/dt/filesize.svg)](https://www.npmjs.com/package/filesize) [![CDNJS version](https://img.shields.io/cdnjs/v/filesize.svg)](https://cdnjs.com/libraries/filesize) + +filesize.js provides a simple way to get a human-readable file size string from a number (float or integer) or string. + +```javascript +import {filesize} from "filesize"; +filesize(265318, {standard: "jedec"}); // "259.1 KB" +``` + +## Testing + +filesize has 100% code coverage with its tests. + +```console +--------------|---------|----------|---------|---------|----------------------- +File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s +--------------|---------|----------|---------|---------|----------------------- +All files | 100 | 95.52 | 100 | 100 | + filesize.cjs | 100 | 95.52 | 100 | 100 | 77-78,173,196,199,210 +--------------|---------|----------|---------|---------|----------------------- +``` + +## Optional settings + +`filesize()` accepts an optional descriptor Object as a second argument, so you can customize the output. + +### base +_*(number)*_ Number base, default is `10` + +### bits +_*(boolean)*_ Enables `bit` sizes, default is `false` + +### exponent +_*(number)*_ Specifies the symbol via exponent, e.g. `2` is `MB` for base 2, default is `-1` + +### fullform +_*(boolean)*_ Enables full form of unit of measure, default is `false` + +### fullforms +_*(array)*_ Array of full form overrides, default is `[]` + +### locale (overrides 'separator') +_*(string || boolean)*_ BCP 47 language tag to specify a locale, or `true` to use default locale, default is `""` + +### localeOptions (overrides 'separator', requires string for 'locale' option) +_*(object)*_ Dictionary of options defined by ECMA-402 ([Number.prototype.toLocaleString](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)). Requires locale option to be explicitly passed as a string, otherwise is ignored. + +### output +_*(string)*_ Output of function (`array`, `exponent`, `object`, or `string`), default is `string` + +### pad +_*(boolean)*_ Decimal place end padding, default is `false` + +### precision +_*(number)*_ Sets precision of numerical output, default is `0` + +### round +_*(number)*_ Decimal place, default is `2` + +### roundingMethod +_*(string)*_ Rounding method, can be `round`, `floor`, or `ceil`, default is `round` + +### separator +_*(string)*_ Decimal separator character, default is an empty string. + +### spacer +_*(string)*_ Character between the `result` and `symbol`, default is `" "` + +### standard +_*(string)*_ Standard unit of measure, can be `iec`, `jedec`, or `si`. Default is `si` (base 10). The `si` option is an alias of `jedec`, such that it is not valid for other configuration options. + +### symbols +_*(object)*_ Dictionary of IEC/JEDEC symbols to replace for localization, defaults to english if no match is found; SI is handled automatically with JEDEC values. + +## Examples + +```javascript +filesize(500); // "500 B" +filesize(500, {bits: true}); // "4 kbit" +filesize(265318, {base: 2}); // "259.1 KiB" +filesize(265318); // "265.32 kB" +filesize(265318, {round: 0}); // "265 kB" +filesize(265318, {output: "array"}); // [265.32, "kB"] +filesize(265318, {output: "object"}); // {value: 265.32, symbol: "kB", exponent: 1, unit: "kB"} +filesize(1, {symbols: {B: "Б"}}); // "1 Б" +filesize(1024); // "1.02 kB" +filesize(1024, {exponent: 0}); // "1024 B" +filesize(1024, {output: "exponent"}); // 1 +filesize(265318, {standard: "jedec"}); // "259.1 KB" +filesize(265318, {base: 2, fullform: true}); // "259.1 kibibytes" +filesize(12, {fullform: true, fullforms: ["байтов"]}); // "12 байтов" +filesize(265318, {separator: ","}); // "265,32 kB" +filesize(265318, {locale: "de"}); // "265,32 kB" +``` + + +## Partial Application +`partial()` takes the second parameter of `filesize()` and returns a new function with the configuration applied +upon execution. This can be used to reduce `Object` creation if you call `filesize()` without caching the `descriptor` +in lexical scope. + +```javascript +import {partial} from "filesize"; +const size = partial({standard: "jedec"}); + +size(265318); // "259.1 KB" +``` + +## License +Copyright (c) 2024 Jason Mulligan +Licensed under the BSD-3 license. diff --git a/node_modules/filesize/dist/filesize.cjs b/node_modules/filesize/dist/filesize.cjs new file mode 100644 index 0000000..dd6e6b7 --- /dev/null +++ b/node_modules/filesize/dist/filesize.cjs @@ -0,0 +1,238 @@ +/** + * filesize + * + * @copyright 2024 Jason Mulligan + * @license BSD-3-Clause + * @version 10.1.6 + */ +'use strict'; + +const ARRAY = "array"; +const BIT = "bit"; +const BITS = "bits"; +const BYTE = "byte"; +const BYTES = "bytes"; +const EMPTY = ""; +const EXPONENT = "exponent"; +const FUNCTION = "function"; +const IEC = "iec"; +const INVALID_NUMBER = "Invalid number"; +const INVALID_ROUND = "Invalid rounding method"; +const JEDEC = "jedec"; +const OBJECT = "object"; +const PERIOD = "."; +const ROUND = "round"; +const S = "s"; +const SI = "si"; +const SI_KBIT = "kbit"; +const SI_KBYTE = "kB"; +const SPACE = " "; +const STRING = "string"; +const ZERO = "0"; +const STRINGS = { + symbol: { + iec: { + bits: ["bit", "Kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"], + bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] + }, + jedec: { + bits: ["bit", "Kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"], + bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] + } + }, + fullform: { + iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], + jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] + } +}; + +function filesize (arg, { + bits = false, + pad = false, + base = -1, + round = 2, + locale = EMPTY, + localeOptions = {}, + separator = EMPTY, + spacer = SPACE, + symbols = {}, + standard = EMPTY, + output = STRING, + fullform = false, + fullforms = [], + exponent = -1, + roundingMethod = ROUND, + precision = 0 +} = {}) { + let e = exponent, + num = Number(arg), + result = [], + val = 0, + u = EMPTY; + + // Sync base & standard + if (standard === SI) { + base = 10; + standard = JEDEC; + } else if (standard === IEC || standard === JEDEC) { + base = 2; + } else if (base === 2) { + standard = IEC; + } else { + base = 10; + standard = JEDEC; + } + + const ceil = base === 10 ? 1000 : 1024, + full = fullform === true, + neg = num < 0, + roundingFunc = Math[roundingMethod]; + + if (typeof arg !== "bigint" && isNaN(arg)) { + throw new TypeError(INVALID_NUMBER); + } + + if (typeof roundingFunc !== FUNCTION) { + throw new TypeError(INVALID_ROUND); + } + + // Flipping a negative number to determine the size + if (neg) { + num = -num; + } + + // Determining the exponent + if (e === -1 || isNaN(e)) { + e = Math.floor(Math.log(num) / Math.log(ceil)); + + if (e < 0) { + e = 0; + } + } + + // Exceeding supported length, time to reduce & multiply + if (e > 8) { + if (precision > 0) { + precision += 8 - e; + } + + e = 8; + } + + if (output === EXPONENT) { + return e; + } + + // Zero is now a special case because bytes divide by 1 + if (num === 0) { + result[0] = 0; + u = result[1] = STRINGS.symbol[standard][bits ? BITS : BYTES][e]; + } else { + val = num / (base === 2 ? Math.pow(2, e * 10) : Math.pow(1000, e)); + + if (bits) { + val = val * 8; + + if (val >= ceil && e < 8) { + val = val / ceil; + e++; + } + } + + const p = Math.pow(10, e > 0 ? round : 0); + result[0] = roundingFunc(val * p) / p; + + if (result[0] === ceil && e < 8 && exponent === -1) { + result[0] = 1; + e++; + } + + u = result[1] = base === 10 && e === 1 ? bits ? SI_KBIT : SI_KBYTE : STRINGS.symbol[standard][bits ? BITS : BYTES][e]; + } + + // Decorating a 'diff' + if (neg) { + result[0] = -result[0]; + } + + // Setting optional precision + if (precision > 0) { + result[0] = result[0].toPrecision(precision); + } + + // Applying custom symbol + result[1] = symbols[result[1]] || result[1]; + + if (locale === true) { + result[0] = result[0].toLocaleString(); + } else if (locale.length > 0) { + result[0] = result[0].toLocaleString(locale, localeOptions); + } else if (separator.length > 0) { + result[0] = result[0].toString().replace(PERIOD, separator); + } + + if (pad && round > 0) { + const i = result[0].toString(), + x = separator || ((i.match(/(\D)/g) || []).pop() || PERIOD), + tmp = i.toString().split(x), + s = tmp[1] || EMPTY, + l = s.length, + n = round - l; + + result[0] = `${tmp[0]}${x}${s.padEnd(l + n, ZERO)}`; + } + + if (full) { + result[1] = fullforms[e] ? fullforms[e] : STRINGS.fullform[standard][e] + (bits ? BIT : BYTE) + (result[0] === 1 ? EMPTY : S); + } + + // Returning Array, Object, or String (default) + return output === ARRAY ? result : output === OBJECT ? { + value: result[0], + symbol: result[1], + exponent: e, + unit: u + } : result.join(spacer); +} + +// Partial application for functional programming +function partial ({ + bits = false, + pad = false, + base = -1, + round = 2, + locale = EMPTY, + localeOptions = {}, + separator = EMPTY, + spacer = SPACE, + symbols = {}, + standard = EMPTY, + output = STRING, + fullform = false, + fullforms = [], + exponent = -1, + roundingMethod = ROUND, + precision = 0 +} = {}) { + return arg => filesize(arg, { + bits, + pad, + base, + round, + locale, + localeOptions, + separator, + spacer, + symbols, + standard, + output, + fullform, + fullforms, + exponent, + roundingMethod, + precision + }); +} + +exports.filesize = filesize; +exports.partial = partial; diff --git a/node_modules/filesize/dist/filesize.esm.js b/node_modules/filesize/dist/filesize.esm.js new file mode 100644 index 0000000..15f8f1c --- /dev/null +++ b/node_modules/filesize/dist/filesize.esm.js @@ -0,0 +1,231 @@ +/** + * filesize + * + * @copyright 2024 Jason Mulligan + * @license BSD-3-Clause + * @version 10.1.6 + */ +const ARRAY = "array"; +const BIT = "bit"; +const BITS = "bits"; +const BYTE = "byte"; +const BYTES = "bytes"; +const EMPTY = ""; +const EXPONENT = "exponent"; +const FUNCTION = "function"; +const IEC = "iec"; +const INVALID_NUMBER = "Invalid number"; +const INVALID_ROUND = "Invalid rounding method"; +const JEDEC = "jedec"; +const OBJECT = "object"; +const PERIOD = "."; +const ROUND = "round"; +const S = "s"; +const SI = "si"; +const SI_KBIT = "kbit"; +const SI_KBYTE = "kB"; +const SPACE = " "; +const STRING = "string"; +const ZERO = "0"; +const STRINGS = { + symbol: { + iec: { + bits: ["bit", "Kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit"], + bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] + }, + jedec: { + bits: ["bit", "Kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit"], + bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] + } + }, + fullform: { + iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], + jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] + } +};function filesize (arg, { + bits = false, + pad = false, + base = -1, + round = 2, + locale = EMPTY, + localeOptions = {}, + separator = EMPTY, + spacer = SPACE, + symbols = {}, + standard = EMPTY, + output = STRING, + fullform = false, + fullforms = [], + exponent = -1, + roundingMethod = ROUND, + precision = 0 +} = {}) { + let e = exponent, + num = Number(arg), + result = [], + val = 0, + u = EMPTY; + + // Sync base & standard + if (standard === SI) { + base = 10; + standard = JEDEC; + } else if (standard === IEC || standard === JEDEC) { + base = 2; + } else if (base === 2) { + standard = IEC; + } else { + base = 10; + standard = JEDEC; + } + + const ceil = base === 10 ? 1000 : 1024, + full = fullform === true, + neg = num < 0, + roundingFunc = Math[roundingMethod]; + + if (typeof arg !== "bigint" && isNaN(arg)) { + throw new TypeError(INVALID_NUMBER); + } + + if (typeof roundingFunc !== FUNCTION) { + throw new TypeError(INVALID_ROUND); + } + + // Flipping a negative number to determine the size + if (neg) { + num = -num; + } + + // Determining the exponent + if (e === -1 || isNaN(e)) { + e = Math.floor(Math.log(num) / Math.log(ceil)); + + if (e < 0) { + e = 0; + } + } + + // Exceeding supported length, time to reduce & multiply + if (e > 8) { + if (precision > 0) { + precision += 8 - e; + } + + e = 8; + } + + if (output === EXPONENT) { + return e; + } + + // Zero is now a special case because bytes divide by 1 + if (num === 0) { + result[0] = 0; + u = result[1] = STRINGS.symbol[standard][bits ? BITS : BYTES][e]; + } else { + val = num / (base === 2 ? Math.pow(2, e * 10) : Math.pow(1000, e)); + + if (bits) { + val = val * 8; + + if (val >= ceil && e < 8) { + val = val / ceil; + e++; + } + } + + const p = Math.pow(10, e > 0 ? round : 0); + result[0] = roundingFunc(val * p) / p; + + if (result[0] === ceil && e < 8 && exponent === -1) { + result[0] = 1; + e++; + } + + u = result[1] = base === 10 && e === 1 ? bits ? SI_KBIT : SI_KBYTE : STRINGS.symbol[standard][bits ? BITS : BYTES][e]; + } + + // Decorating a 'diff' + if (neg) { + result[0] = -result[0]; + } + + // Setting optional precision + if (precision > 0) { + result[0] = result[0].toPrecision(precision); + } + + // Applying custom symbol + result[1] = symbols[result[1]] || result[1]; + + if (locale === true) { + result[0] = result[0].toLocaleString(); + } else if (locale.length > 0) { + result[0] = result[0].toLocaleString(locale, localeOptions); + } else if (separator.length > 0) { + result[0] = result[0].toString().replace(PERIOD, separator); + } + + if (pad && round > 0) { + const i = result[0].toString(), + x = separator || ((i.match(/(\D)/g) || []).pop() || PERIOD), + tmp = i.toString().split(x), + s = tmp[1] || EMPTY, + l = s.length, + n = round - l; + + result[0] = `${tmp[0]}${x}${s.padEnd(l + n, ZERO)}`; + } + + if (full) { + result[1] = fullforms[e] ? fullforms[e] : STRINGS.fullform[standard][e] + (bits ? BIT : BYTE) + (result[0] === 1 ? EMPTY : S); + } + + // Returning Array, Object, or String (default) + return output === ARRAY ? result : output === OBJECT ? { + value: result[0], + symbol: result[1], + exponent: e, + unit: u + } : result.join(spacer); +} + +// Partial application for functional programming +function partial ({ + bits = false, + pad = false, + base = -1, + round = 2, + locale = EMPTY, + localeOptions = {}, + separator = EMPTY, + spacer = SPACE, + symbols = {}, + standard = EMPTY, + output = STRING, + fullform = false, + fullforms = [], + exponent = -1, + roundingMethod = ROUND, + precision = 0 +} = {}) { + return arg => filesize(arg, { + bits, + pad, + base, + round, + locale, + localeOptions, + separator, + spacer, + symbols, + standard, + output, + fullform, + fullforms, + exponent, + roundingMethod, + precision + }); +}export{filesize,partial}; \ No newline at end of file diff --git a/node_modules/filesize/package.json b/node_modules/filesize/package.json new file mode 100644 index 0000000..7feb89b --- /dev/null +++ b/node_modules/filesize/package.json @@ -0,0 +1,60 @@ +{ + "name": "filesize", + "description": "JavaScript library to generate a human readable String describing the file size", + "version": "10.1.6", + "homepage": "https://filesizejs.com", + "author": "Jason Mulligan ", + "repository": { + "type": "git", + "url": "git://github.com/avoidwork/filesize.js.git" + }, + "bugs": { + "url": "https://github.com/avoidwork/filesize.js/issues" + }, + "files": [ + "dist/filesize.cjs", + "dist/filesize.esm.js", + "types/filesize.d.ts" + ], + "license": "BSD-3-Clause", + "main": "dist/filesize.cjs", + "module": "dist/filesize.esm.js", + "types": "types/filesize.d.ts", + "type": "module", + "sourceType": "module", + "engines": { + "node": ">= 10.4.0" + }, + "scripts": { + "build": "npm run rollup", + "changelog": "auto-changelog -p", + "coverage": "nyc npm run test", + "lint": "eslint *.js src/*.js test/*.js", + "fix": "eslint --fix *.js src/*.js test/*.js", + "mocha": "nyc mocha test/*.js", + "rollup": "rollup --config", + "test": "npm run lint && npm run mocha", + "test-webpack": "mkdir -p test/webpack && rm -rf test/webpack/* && git clone git@github.com:rabelais88/typescript-webpack.git test/webpack && echo \"import { filesize } from 'filesize';console.log(filesize(1234));\" >> test/webpack/src/index.ts && cd test/webpack && npm install && mkdir -p node_modules/filesize/dist && cp ../../package.json node_modules/filesize/ && cp ../../dist/* node_modules/filesize/dist/ && npm run build", + "types": "npx -p typescript tsc src/*.js --declaration --allowJs --emitDeclarationOnly --outDir types", + "prepare": "husky" + }, + "devDependencies": { + "@rollup/plugin-terser": "^0.4.4", + "auto-changelog": "^2.4.0", + "eslint": "^9.6.0", + "husky": "^9.0.11", + "mocha": "^10.6.0", + "nyc": "^17.0.0", + "rollup": "^4.18.1", + "typescript": "^5.5.3" + }, + "keywords": [ + "file", + "filesize", + "size", + "readable", + "file system", + "bytes", + "diff" + ] +} diff --git a/node_modules/filesize/types/filesize.d.ts b/node_modules/filesize/types/filesize.d.ts new file mode 100644 index 0000000..7359e37 --- /dev/null +++ b/node_modules/filesize/types/filesize.d.ts @@ -0,0 +1,56 @@ +interface FileSizeOptionsBase { + base?: 10 | 2; + bits?: boolean; + exponent?: number; + fullform?: boolean; + fullforms?: string[]; + locale?: string | boolean; + localeOptions?: Intl.DateTimeFormatOptions; + pad?: boolean; + precision?: number; + round?: number; + roundingMethod?: 'round' | 'floor' | 'ceil'; + separator?: string; + spacer?: string; + standard?: 'si' | 'iec' | 'jedec'; + symbols?: {}; +} + +interface FileSizeOptionsArray extends FileSizeOptionsBase { + output: 'array' +} + +interface FileSizeOptionsExponent extends FileSizeOptionsBase { + output: 'exponent' +} + +interface FileSizeOptionsObject extends FileSizeOptionsBase { + output: 'object' +} + +interface FileSizeOptionsString extends FileSizeOptionsBase { + output: 'string' +} + +interface FileSizeReturnObject { + value: string, + symbol: string, + exponent: number, + unit: string, +} + +type FileSizeReturnArray = [ number, string ] + +type FileSizeOptionStringOrBase = FileSizeOptionsString | FileSizeOptionsBase; +type FileSizeOptions = FileSizeOptionsArray | FileSizeOptionsExponent | FileSizeOptionsObject | FileSizeOptionStringOrBase | undefined +type FileSizeReturnType = + Options extends FileSizeOptionsArray + ? FileSizeReturnArray + : Options extends FileSizeOptionsExponent + ? number + : Options extends FileSizeOptionsObject + ? FileSizeReturnObject + : string; + +export function filesize(byteCount: number | string | bigint, options?: Options): FileSizeReturnType +export function partial(options?: Options): (byteCount: number | string | bigint) => FileSizeReturnType diff --git a/node_modules/fill-range/LICENSE b/node_modules/fill-range/LICENSE new file mode 100644 index 0000000..9af4a67 --- /dev/null +++ b/node_modules/fill-range/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-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/fill-range/README.md b/node_modules/fill-range/README.md new file mode 100644 index 0000000..8d756fe --- /dev/null +++ b/node_modules/fill-range/README.md @@ -0,0 +1,237 @@ +# fill-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/fill-range.svg?style=flat)](https://www.npmjs.com/package/fill-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![NPM total downloads](https://img.shields.io/npm/dt/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/fill-range.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/fill-range) + +> Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex` + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save fill-range +``` + +## Usage + +Expands numbers and letters, optionally using a `step` as the last argument. _(Numbers may be defined as JavaScript numbers or strings)_. + +```js +const fill = require('fill-range'); +// fill(from, to[, step, options]); + +console.log(fill('1', '10')); //=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] +console.log(fill('1', '10', { toRegex: true })); //=> [1-9]|10 +``` + +**Params** + +* `from`: **{String|Number}** the number or letter to start with +* `to`: **{String|Number}** the number or letter to end with +* `step`: **{String|Number|Object|Function}** Optionally pass a [step](#optionsstep) to use. +* `options`: **{Object|Function}**: See all available [options](#options) + +## Examples + +By default, an array of values is returned. + +**Alphabetical ranges** + +```js +console.log(fill('a', 'e')); //=> ['a', 'b', 'c', 'd', 'e'] +console.log(fill('A', 'E')); //=> [ 'A', 'B', 'C', 'D', 'E' ] +``` + +**Numerical ranges** + +Numbers can be defined as actual numbers or strings. + +```js +console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ] +console.log(fill('1', '5')); //=> [ 1, 2, 3, 4, 5 ] +``` + +**Negative ranges** + +Numbers can be defined as actual numbers or strings. + +```js +console.log(fill('-5', '-1')); //=> [ '-5', '-4', '-3', '-2', '-1' ] +console.log(fill('-5', '5')); //=> [ '-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5' ] +``` + +**Steps (increments)** + +```js +// numerical ranges with increments +console.log(fill('0', '25', 4)); //=> [ '0', '4', '8', '12', '16', '20', '24' ] +console.log(fill('0', '25', 5)); //=> [ '0', '5', '10', '15', '20', '25' ] +console.log(fill('0', '25', 6)); //=> [ '0', '6', '12', '18', '24' ] + +// alphabetical ranges with increments +console.log(fill('a', 'z', 4)); //=> [ 'a', 'e', 'i', 'm', 'q', 'u', 'y' ] +console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ] +console.log(fill('a', 'z', 6)); //=> [ 'a', 'g', 'm', 's', 'y' ] +``` + +## Options + +### options.step + +**Type**: `number` (formatted as a string or number) + +**Default**: `undefined` + +**Description**: The increment to use for the range. Can be used with letters or numbers. + +**Example(s)** + +```js +// numbers +console.log(fill('1', '10', 2)); //=> [ '1', '3', '5', '7', '9' ] +console.log(fill('1', '10', 3)); //=> [ '1', '4', '7', '10' ] +console.log(fill('1', '10', 4)); //=> [ '1', '5', '9' ] + +// letters +console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ] +console.log(fill('a', 'z', 7)); //=> [ 'a', 'h', 'o', 'v' ] +console.log(fill('a', 'z', 9)); //=> [ 'a', 'j', 's' ] +``` + +### options.strictRanges + +**Type**: `boolean` + +**Default**: `false` + +**Description**: By default, `null` is returned when an invalid range is passed. Enable this option to throw a `RangeError` on invalid ranges. + +**Example(s)** + +The following are all invalid: + +```js +fill('1.1', '2'); // decimals not supported in ranges +fill('a', '2'); // incompatible range values +fill(1, 10, 'foo'); // invalid "step" argument +``` + +### options.stringify + +**Type**: `boolean` + +**Default**: `undefined` + +**Description**: Cast all returned values to strings. By default, integers are returned as numbers. + +**Example(s)** + +```js +console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ] +console.log(fill(1, 5, { stringify: true })); //=> [ '1', '2', '3', '4', '5' ] +``` + +### options.toRegex + +**Type**: `boolean` + +**Default**: `undefined` + +**Description**: Create a regex-compatible source string, instead of expanding values to an array. + +**Example(s)** + +```js +// alphabetical range +console.log(fill('a', 'e', { toRegex: true })); //=> '[a-e]' +// alphabetical with step +console.log(fill('a', 'z', 3, { toRegex: true })); //=> 'a|d|g|j|m|p|s|v|y' +// numerical range +console.log(fill('1', '100', { toRegex: true })); //=> '[1-9]|[1-9][0-9]|100' +// numerical range with zero padding +console.log(fill('000001', '100000', { toRegex: true })); +//=> '0{5}[1-9]|0{4}[1-9][0-9]|0{3}[1-9][0-9]{2}|0{2}[1-9][0-9]{3}|0[1-9][0-9]{4}|100000' +``` + +### options.transform + +**Type**: `function` + +**Default**: `undefined` + +**Description**: Customize each value in the returned array (or [string](#optionstoRegex)). _(you can also pass this function as the last argument to `fill()`)_. + +**Example(s)** + +```js +// add zero padding +console.log(fill(1, 5, value => String(value).padStart(4, '0'))); +//=> ['0001', '0002', '0003', '0004', '0005'] +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +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 +``` + +
    + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 116 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [paulmillr](https://github.com/paulmillr) | +| 2 | [realityking](https://github.com/realityking) | +| 2 | [bluelovers](https://github.com/bluelovers) | +| 1 | [edorivai](https://github.com/edorivai) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)! + + + + + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ \ No newline at end of file diff --git a/node_modules/fill-range/index.js b/node_modules/fill-range/index.js new file mode 100644 index 0000000..ddb212e --- /dev/null +++ b/node_modules/fill-range/index.js @@ -0,0 +1,248 @@ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +const util = require('util'); +const toRegexRange = require('to-regex-range'); + +const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); + +const transform = toNumber => { + return value => toNumber === true ? Number(value) : String(value); +}; + +const isValidValue = value => { + return typeof value === 'number' || (typeof value === 'string' && value !== ''); +}; + +const isNumber = num => Number.isInteger(+num); + +const zeros = input => { + let value = `${input}`; + let index = -1; + if (value[0] === '-') value = value.slice(1); + if (value === '0') return false; + while (value[++index] === '0'); + return index > 0; +}; + +const stringify = (start, end, options) => { + if (typeof start === 'string' || typeof end === 'string') { + return true; + } + return options.stringify === true; +}; + +const pad = (input, maxLength, toNumber) => { + if (maxLength > 0) { + let dash = input[0] === '-' ? '-' : ''; + if (dash) input = input.slice(1); + input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); + } + if (toNumber === false) { + return String(input); + } + return input; +}; + +const toMaxLen = (input, maxLength) => { + let negative = input[0] === '-' ? '-' : ''; + if (negative) { + input = input.slice(1); + maxLength--; + } + while (input.length < maxLength) input = '0' + input; + return negative ? ('-' + input) : input; +}; + +const toSequence = (parts, options, maxLen) => { + parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + + let prefix = options.capture ? '' : '?:'; + let positives = ''; + let negatives = ''; + let result; + + if (parts.positives.length) { + positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|'); + } + + if (parts.negatives.length) { + negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`; + } + + if (positives && negatives) { + result = `${positives}|${negatives}`; + } else { + result = positives || negatives; + } + + if (options.wrap) { + return `(${prefix}${result})`; + } + + return result; +}; + +const toRange = (a, b, isNumbers, options) => { + if (isNumbers) { + return toRegexRange(a, b, { wrap: false, ...options }); + } + + let start = String.fromCharCode(a); + if (a === b) return start; + + let stop = String.fromCharCode(b); + return `[${start}-${stop}]`; +}; + +const toRegex = (start, end, options) => { + if (Array.isArray(start)) { + let wrap = options.wrap === true; + let prefix = options.capture ? '' : '?:'; + return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); + } + return toRegexRange(start, end, options); +}; + +const rangeError = (...args) => { + return new RangeError('Invalid range arguments: ' + util.inspect(...args)); +}; + +const invalidRange = (start, end, options) => { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; +}; + +const invalidStep = (step, options) => { + if (options.strictRanges === true) { + throw new TypeError(`Expected step "${step}" to be a number`); + } + return []; +}; + +const fillNumbers = (start, end, step = 1, options = {}) => { + let a = Number(start); + let b = Number(end); + + if (!Number.isInteger(a) || !Number.isInteger(b)) { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; + } + + // fix negative zero + if (a === 0) a = 0; + if (b === 0) b = 0; + + let descending = a > b; + let startString = String(start); + let endString = String(end); + let stepString = String(step); + step = Math.max(Math.abs(step), 1); + + let padded = zeros(startString) || zeros(endString) || zeros(stepString); + let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; + let toNumber = padded === false && stringify(start, end, options) === false; + let format = options.transform || transform(toNumber); + + if (options.toRegex && step === 1) { + return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); + } + + let parts = { negatives: [], positives: [] }; + let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); + let range = []; + let index = 0; + + while (descending ? a >= b : a <= b) { + if (options.toRegex === true && step > 1) { + push(a); + } else { + range.push(pad(format(a, index), maxLen, toNumber)); + } + a = descending ? a - step : a + step; + index++; + } + + if (options.toRegex === true) { + return step > 1 + ? toSequence(parts, options, maxLen) + : toRegex(range, null, { wrap: false, ...options }); + } + + return range; +}; + +const fillLetters = (start, end, step = 1, options = {}) => { + if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { + return invalidRange(start, end, options); + } + + let format = options.transform || (val => String.fromCharCode(val)); + let a = `${start}`.charCodeAt(0); + let b = `${end}`.charCodeAt(0); + + let descending = a > b; + let min = Math.min(a, b); + let max = Math.max(a, b); + + if (options.toRegex && step === 1) { + return toRange(min, max, false, options); + } + + let range = []; + let index = 0; + + while (descending ? a >= b : a <= b) { + range.push(format(a, index)); + a = descending ? a - step : a + step; + index++; + } + + if (options.toRegex === true) { + return toRegex(range, null, { wrap: false, options }); + } + + return range; +}; + +const fill = (start, end, step, options = {}) => { + if (end == null && isValidValue(start)) { + return [start]; + } + + if (!isValidValue(start) || !isValidValue(end)) { + return invalidRange(start, end, options); + } + + if (typeof step === 'function') { + return fill(start, end, 1, { transform: step }); + } + + if (isObject(step)) { + return fill(start, end, 0, step); + } + + let opts = { ...options }; + if (opts.capture === true) opts.wrap = true; + step = step || opts.step || 1; + + if (!isNumber(step)) { + if (step != null && !isObject(step)) return invalidStep(step, opts); + return fill(start, end, 1, step); + } + + if (isNumber(start) && isNumber(end)) { + return fillNumbers(start, end, step, opts); + } + + return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); +}; + +module.exports = fill; diff --git a/node_modules/fill-range/package.json b/node_modules/fill-range/package.json new file mode 100644 index 0000000..582357f --- /dev/null +++ b/node_modules/fill-range/package.json @@ -0,0 +1,74 @@ +{ + "name": "fill-range", + "description": "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`", + "version": "7.1.1", + "homepage": "https://github.com/jonschlinkert/fill-range", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Edo Rivai (edo.rivai.nl)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Paul Miller (paulmillr.com)", + "Rouven Weßling (www.rouvenwessling.de)", + "(https://github.com/wtgtybhertgeghgtwtg)" + ], + "repository": "jonschlinkert/fill-range", + "bugs": { + "url": "https://github.com/jonschlinkert/fill-range/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=8" + }, + "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" + }, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "devDependencies": { + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1", + "nyc": "^15.1.0" + }, + "keywords": [ + "alpha", + "alphabetical", + "array", + "bash", + "brace", + "expand", + "expansion", + "fill", + "glob", + "match", + "matches", + "matching", + "number", + "numerical", + "range", + "ranges", + "regex", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/finalhandler/HISTORY.md b/node_modules/finalhandler/HISTORY.md new file mode 100644 index 0000000..7faa4f0 --- /dev/null +++ b/node_modules/finalhandler/HISTORY.md @@ -0,0 +1,210 @@ +v1.3.1 / 2024-09-11 +================== + + * deps: encodeurl@~2.0.0 + +v1.3.0 / 2024-09-03 +================== + + * ignore status message for HTTP/2 (#53) + +v1.2.1 / 2024-09-02 +================== + + * Gracefully handle when handling an error and socket is null + +1.2.0 / 2022-03-22 +================== + + * Remove set content headers that break response + * deps: on-finished@2.4.1 + * deps: statuses@2.0.1 + - Rename `425 Unordered Collection` to standard `425 Too Early` + +1.1.2 / 2019-05-09 +================== + + * Set stricter `Content-Security-Policy` header + * deps: parseurl@~1.3.3 + * deps: statuses@~1.5.0 + +1.1.1 / 2018-03-06 +================== + + * Fix 404 output for bad / missing pathnames + * deps: encodeurl@~1.0.2 + - Fix encoding `%` as last character + * deps: statuses@~1.4.0 + +1.1.0 / 2017-09-24 +================== + + * Use `res.headersSent` when available + +1.0.6 / 2017-09-22 +================== + + * deps: debug@2.6.9 + +1.0.5 / 2017-09-15 +================== + + * deps: parseurl@~1.3.2 + - perf: reduce overhead for full URLs + - perf: unroll the "fast-path" `RegExp` + +1.0.4 / 2017-08-03 +================== + + * deps: debug@2.6.8 + +1.0.3 / 2017-05-16 +================== + + * deps: debug@2.6.7 + - deps: ms@2.0.0 + +1.0.2 / 2017-04-22 +================== + + * deps: debug@2.6.4 + - deps: ms@0.7.3 + +1.0.1 / 2017-03-21 +================== + + * Fix missing `` in HTML document + * deps: debug@2.6.3 + - Fix: `DEBUG_MAX_ARRAY_LENGTH` + +1.0.0 / 2017-02-15 +================== + + * Fix exception when `err` cannot be converted to a string + * Fully URL-encode the pathname in the 404 message + * Only include the pathname in the 404 message + * Send complete HTML document + * Set `Content-Security-Policy: default-src 'self'` header + * deps: debug@2.6.1 + - Allow colors in workers + - Deprecated `DEBUG_FD` environment variable set to `3` or higher + - Fix error when running under React Native + - Use same color for same namespace + - deps: ms@0.7.2 + +0.5.1 / 2016-11-12 +================== + + * Fix exception when `err.headers` is not an object + * deps: statuses@~1.3.1 + * perf: hoist regular expressions + * perf: remove duplicate validation path + +0.5.0 / 2016-06-15 +================== + + * Change invalid or non-numeric status code to 500 + * Overwrite status message to match set status code + * Prefer `err.statusCode` if `err.status` is invalid + * Set response headers from `err.headers` object + * Use `statuses` instead of `http` module for status messages + - Includes all defined status messages + +0.4.1 / 2015-12-02 +================== + + * deps: escape-html@~1.0.3 + - perf: enable strict mode + - perf: optimize string replacement + - perf: use faster string coercion + +0.4.0 / 2015-06-14 +================== + + * Fix a false-positive when unpiping in Node.js 0.8 + * Support `statusCode` property on `Error` objects + * Use `unpipe` module for unpiping requests + * deps: escape-html@1.0.2 + * deps: on-finished@~2.3.0 + - Add defined behavior for HTTP `CONNECT` requests + - Add defined behavior for HTTP `Upgrade` requests + - deps: ee-first@1.1.1 + * perf: enable strict mode + * perf: remove argument reassignment + +0.3.6 / 2015-05-11 +================== + + * deps: debug@~2.2.0 + - deps: ms@0.7.1 + +0.3.5 / 2015-04-22 +================== + + * deps: on-finished@~2.2.1 + - Fix `isFinished(req)` when data buffered + +0.3.4 / 2015-03-15 +================== + + * deps: debug@~2.1.3 + - Fix high intensity foreground color for bold + - deps: ms@0.7.0 + +0.3.3 / 2015-01-01 +================== + + * deps: debug@~2.1.1 + * deps: on-finished@~2.2.0 + +0.3.2 / 2014-10-22 +================== + + * deps: on-finished@~2.1.1 + - Fix handling of pipelined requests + +0.3.1 / 2014-10-16 +================== + + * deps: debug@~2.1.0 + - Implement `DEBUG_FD` env variable support + +0.3.0 / 2014-09-17 +================== + + * Terminate in progress response only on error + * Use `on-finished` to determine request status + +0.2.0 / 2014-09-03 +================== + + * Set `X-Content-Type-Options: nosniff` header + * deps: debug@~2.0.0 + +0.1.0 / 2014-07-16 +================== + + * Respond after request fully read + - prevents hung responses and socket hang ups + * deps: debug@1.0.4 + +0.0.3 / 2014-07-11 +================== + + * deps: debug@1.0.3 + - Add support for multiple wildcards in namespaces + +0.0.2 / 2014-06-19 +================== + + * Handle invalid status codes + +0.0.1 / 2014-06-05 +================== + + * deps: debug@1.0.2 + +0.0.0 / 2014-06-05 +================== + + * Extracted from connect/express diff --git a/node_modules/finalhandler/LICENSE b/node_modules/finalhandler/LICENSE new file mode 100644 index 0000000..6022106 --- /dev/null +++ b/node_modules/finalhandler/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2014-2022 Douglas Christopher Wilson + +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/finalhandler/README.md b/node_modules/finalhandler/README.md new file mode 100644 index 0000000..6244a13 --- /dev/null +++ b/node_modules/finalhandler/README.md @@ -0,0 +1,147 @@ +# finalhandler + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][github-actions-ci-image]][github-actions-ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Node.js function to invoke as the final step to respond to HTTP request. + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install finalhandler +``` + +## API + +```js +var finalhandler = require('finalhandler') +``` + +### finalhandler(req, res, [options]) + +Returns function to be invoked as the final step for the given `req` and `res`. +This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will +write out a 404 response to the `res`. If it is truthy, an error response will +be written out to the `res` or `res` will be terminated if a response has already +started. + +When an error is written, the following information is added to the response: + + * The `res.statusCode` is set from `err.status` (or `err.statusCode`). If + this value is outside the 4xx or 5xx range, it will be set to 500. + * The `res.statusMessage` is set according to the status code. + * The body will be the HTML of the status code message if `env` is + `'production'`, otherwise will be `err.stack`. + * Any headers specified in an `err.headers` object. + +The final handler will also unpipe anything from `req` when it is invoked. + +#### options.env + +By default, the environment is determined by `NODE_ENV` variable, but it can be +overridden by this option. + +#### options.onerror + +Provide a function to be called with the `err` when it exists. Can be used for +writing errors to a central location without excessive function generation. Called +as `onerror(err, req, res)`. + +## Examples + +### always 404 + +```js +var finalhandler = require('finalhandler') +var http = require('http') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res) + done() +}) + +server.listen(3000) +``` + +### perform simple action + +```js +var finalhandler = require('finalhandler') +var fs = require('fs') +var http = require('http') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res) + + fs.readFile('index.html', function (err, buf) { + if (err) return done(err) + res.setHeader('Content-Type', 'text/html') + res.end(buf) + }) +}) + +server.listen(3000) +``` + +### use with middleware-style functions + +```js +var finalhandler = require('finalhandler') +var http = require('http') +var serveStatic = require('serve-static') + +var serve = serveStatic('public') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res) + serve(req, res, done) +}) + +server.listen(3000) +``` + +### keep log of all errors + +```js +var finalhandler = require('finalhandler') +var fs = require('fs') +var http = require('http') + +var server = http.createServer(function (req, res) { + var done = finalhandler(req, res, { onerror: logerror }) + + fs.readFile('index.html', function (err, buf) { + if (err) return done(err) + res.setHeader('Content-Type', 'text/html') + res.end(buf) + }) +}) + +server.listen(3000) + +function logerror (err) { + console.error(err.stack || err.toString()) +} +``` + +## License + +[MIT](LICENSE) + +[npm-image]: https://img.shields.io/npm/v/finalhandler.svg +[npm-url]: https://npmjs.org/package/finalhandler +[node-image]: https://img.shields.io/node/v/finalhandler.svg +[node-url]: https://nodejs.org/en/download +[coveralls-image]: https://img.shields.io/coveralls/pillarjs/finalhandler.svg +[coveralls-url]: https://coveralls.io/r/pillarjs/finalhandler?branch=master +[downloads-image]: https://img.shields.io/npm/dm/finalhandler.svg +[downloads-url]: https://npmjs.org/package/finalhandler +[github-actions-ci-image]: https://github.com/pillarjs/finalhandler/actions/workflows/ci.yml/badge.svg +[github-actions-ci-url]: https://github.com/pillarjs/finalhandler/actions/workflows/ci.yml diff --git a/node_modules/finalhandler/SECURITY.md b/node_modules/finalhandler/SECURITY.md new file mode 100644 index 0000000..6e23249 --- /dev/null +++ b/node_modules/finalhandler/SECURITY.md @@ -0,0 +1,25 @@ +# Security Policies and Procedures + +## Reporting a Bug + +The `finalhandler` team and community take all security bugs seriously. Thank +you for improving the security of Express. We appreciate your efforts and +responsible disclosure and will make every effort to acknowledge your +contributions. + +Report security bugs by emailing the current owner(s) of `finalhandler`. This +information can be found in the npm registry using the command +`npm owner ls finalhandler`. +If unsure or unable to get the information from the above, open an issue +in the [project issue tracker](https://github.com/pillarjs/finalhandler/issues) +asking for the current contact information. + +To ensure the timely response to your report, please ensure that the entirety +of the report is contained within the email body and not solely behind a web +link or an attachment. + +At least one owner will acknowledge your email within 48 hours, and will send a +more detailed response within 48 hours indicating the next steps in handling +your report. After the initial reply to your report, the owners will +endeavor to keep you informed of the progress towards a fix and full +announcement, and may ask for additional information or guidance. diff --git a/node_modules/finalhandler/index.js b/node_modules/finalhandler/index.js new file mode 100644 index 0000000..ec34be9 --- /dev/null +++ b/node_modules/finalhandler/index.js @@ -0,0 +1,341 @@ +/*! + * finalhandler + * Copyright(c) 2014-2022 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var debug = require('debug')('finalhandler') +var encodeUrl = require('encodeurl') +var escapeHtml = require('escape-html') +var onFinished = require('on-finished') +var parseUrl = require('parseurl') +var statuses = require('statuses') +var unpipe = require('unpipe') + +/** + * Module variables. + * @private + */ + +var DOUBLE_SPACE_REGEXP = /\x20{2}/g +var NEWLINE_REGEXP = /\n/g + +/* istanbul ignore next */ +var defer = typeof setImmediate === 'function' + ? setImmediate + : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) } +var isFinished = onFinished.isFinished + +/** + * Create a minimal HTML document. + * + * @param {string} message + * @private + */ + +function createHtmlDocument (message) { + var body = escapeHtml(message) + .replace(NEWLINE_REGEXP, '
    ') + .replace(DOUBLE_SPACE_REGEXP, '  ') + + return '\n' + + '\n' + + '\n' + + '\n' + + 'Error\n' + + '\n' + + '\n' + + '
    ' + body + '
    \n' + + '\n' + + '\n' +} + +/** + * Module exports. + * @public + */ + +module.exports = finalhandler + +/** + * Create a function to handle the final response. + * + * @param {Request} req + * @param {Response} res + * @param {Object} [options] + * @return {Function} + * @public + */ + +function finalhandler (req, res, options) { + var opts = options || {} + + // get environment + var env = opts.env || process.env.NODE_ENV || 'development' + + // get error callback + var onerror = opts.onerror + + return function (err) { + var headers + var msg + var status + + // ignore 404 on in-flight response + if (!err && headersSent(res)) { + debug('cannot 404 after headers sent') + return + } + + // unhandled error + if (err) { + // respect status code from error + status = getErrorStatusCode(err) + + if (status === undefined) { + // fallback to status code on response + status = getResponseStatusCode(res) + } else { + // respect headers from error + headers = getErrorHeaders(err) + } + + // get error message + msg = getErrorMessage(err, status, env) + } else { + // not found + status = 404 + msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req)) + } + + debug('default %s', status) + + // schedule onerror callback + if (err && onerror) { + defer(onerror, err, req, res) + } + + // cannot actually respond + if (headersSent(res)) { + debug('cannot %d after headers sent', status) + if (req.socket) { + req.socket.destroy() + } + return + } + + // send response + send(req, res, status, headers, msg) + } +} + +/** + * Get headers from Error object. + * + * @param {Error} err + * @return {object} + * @private + */ + +function getErrorHeaders (err) { + if (!err.headers || typeof err.headers !== 'object') { + return undefined + } + + var headers = Object.create(null) + var keys = Object.keys(err.headers) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + headers[key] = err.headers[key] + } + + return headers +} + +/** + * Get message from Error object, fallback to status message. + * + * @param {Error} err + * @param {number} status + * @param {string} env + * @return {string} + * @private + */ + +function getErrorMessage (err, status, env) { + var msg + + if (env !== 'production') { + // use err.stack, which typically includes err.message + msg = err.stack + + // fallback to err.toString() when possible + if (!msg && typeof err.toString === 'function') { + msg = err.toString() + } + } + + return msg || statuses.message[status] +} + +/** + * Get status code from Error object. + * + * @param {Error} err + * @return {number} + * @private + */ + +function getErrorStatusCode (err) { + // check err.status + if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) { + return err.status + } + + // check err.statusCode + if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) { + return err.statusCode + } + + return undefined +} + +/** + * Get resource name for the request. + * + * This is typically just the original pathname of the request + * but will fallback to "resource" is that cannot be determined. + * + * @param {IncomingMessage} req + * @return {string} + * @private + */ + +function getResourceName (req) { + try { + return parseUrl.original(req).pathname + } catch (e) { + return 'resource' + } +} + +/** + * Get status code from response. + * + * @param {OutgoingMessage} res + * @return {number} + * @private + */ + +function getResponseStatusCode (res) { + var status = res.statusCode + + // default status code to 500 if outside valid range + if (typeof status !== 'number' || status < 400 || status > 599) { + status = 500 + } + + return status +} + +/** + * Determine if the response headers have been sent. + * + * @param {object} res + * @returns {boolean} + * @private + */ + +function headersSent (res) { + return typeof res.headersSent !== 'boolean' + ? Boolean(res._header) + : res.headersSent +} + +/** + * Send response. + * + * @param {IncomingMessage} req + * @param {OutgoingMessage} res + * @param {number} status + * @param {object} headers + * @param {string} message + * @private + */ + +function send (req, res, status, headers, message) { + function write () { + // response body + var body = createHtmlDocument(message) + + // response status + res.statusCode = status + + if (req.httpVersionMajor < 2) { + res.statusMessage = statuses.message[status] + } + + // remove any content headers + res.removeHeader('Content-Encoding') + res.removeHeader('Content-Language') + res.removeHeader('Content-Range') + + // response headers + setHeaders(res, headers) + + // security headers + res.setHeader('Content-Security-Policy', "default-src 'none'") + res.setHeader('X-Content-Type-Options', 'nosniff') + + // standard headers + res.setHeader('Content-Type', 'text/html; charset=utf-8') + res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) + + if (req.method === 'HEAD') { + res.end() + return + } + + res.end(body, 'utf8') + } + + if (isFinished(req)) { + write() + return + } + + // unpipe everything from the request + unpipe(req) + + // flush the request + onFinished(req, write) + req.resume() +} + +/** + * Set response headers from an object. + * + * @param {OutgoingMessage} res + * @param {object} headers + * @private + */ + +function setHeaders (res, headers) { + if (!headers) { + return + } + + var keys = Object.keys(headers) + for (var i = 0; i < keys.length; i++) { + var key = keys[i] + res.setHeader(key, headers[key]) + } +} diff --git a/node_modules/finalhandler/node_modules/debug/.coveralls.yml b/node_modules/finalhandler/node_modules/debug/.coveralls.yml new file mode 100644 index 0000000..20a7068 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/.coveralls.yml @@ -0,0 +1 @@ +repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/node_modules/finalhandler/node_modules/debug/.eslintrc b/node_modules/finalhandler/node_modules/debug/.eslintrc new file mode 100644 index 0000000..8a37ae2 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/.eslintrc @@ -0,0 +1,11 @@ +{ + "env": { + "browser": true, + "node": true + }, + "rules": { + "no-console": 0, + "no-empty": [1, { "allowEmptyCatch": true }] + }, + "extends": "eslint:recommended" +} diff --git a/node_modules/finalhandler/node_modules/debug/.npmignore b/node_modules/finalhandler/node_modules/debug/.npmignore new file mode 100644 index 0000000..5f60eec --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/.npmignore @@ -0,0 +1,9 @@ +support +test +examples +example +*.sock +dist +yarn.lock +coverage +bower.json diff --git a/node_modules/finalhandler/node_modules/debug/.travis.yml b/node_modules/finalhandler/node_modules/debug/.travis.yml new file mode 100644 index 0000000..6c6090c --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/.travis.yml @@ -0,0 +1,14 @@ + +language: node_js +node_js: + - "6" + - "5" + - "4" + +install: + - make node_modules + +script: + - make lint + - make test + - make coveralls diff --git a/node_modules/finalhandler/node_modules/debug/CHANGELOG.md b/node_modules/finalhandler/node_modules/debug/CHANGELOG.md new file mode 100644 index 0000000..eadaa18 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/CHANGELOG.md @@ -0,0 +1,362 @@ + +2.6.9 / 2017-09-22 +================== + + * remove ReDoS regexp in %o formatter (#504) + +2.6.8 / 2017-05-18 +================== + + * Fix: Check for undefined on browser globals (#462, @marbemac) + +2.6.7 / 2017-05-16 +================== + + * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) + * Fix: Inline extend function in node implementation (#452, @dougwilson) + * Docs: Fix typo (#455, @msasad) + +2.6.5 / 2017-04-27 +================== + + * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) + * Misc: clean up browser reference checks (#447, @thebigredgeek) + * Misc: add npm-debug.log to .gitignore (@thebigredgeek) + + +2.6.4 / 2017-04-20 +================== + + * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) + * Chore: ignore bower.json in npm installations. (#437, @joaovieira) + * Misc: update "ms" to v0.7.3 (@tootallnate) + +2.6.3 / 2017-03-13 +================== + + * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) + * Docs: Changelog fix (@thebigredgeek) + +2.6.2 / 2017-03-10 +================== + + * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) + * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) + * Docs: Add Slackin invite badge (@tootallnate) + +2.6.1 / 2017-02-10 +================== + + * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error + * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) + * Fix: IE8 "Expected identifier" error (#414, @vgoma) + * Fix: Namespaces would not disable once enabled (#409, @musikov) + +2.6.0 / 2016-12-28 +================== + + * Fix: added better null pointer checks for browser useColors (@thebigredgeek) + * Improvement: removed explicit `window.debug` export (#404, @tootallnate) + * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) + +2.5.2 / 2016-12-25 +================== + + * Fix: reference error on window within webworkers (#393, @KlausTrainer) + * Docs: fixed README typo (#391, @lurch) + * Docs: added notice about v3 api discussion (@thebigredgeek) + +2.5.1 / 2016-12-20 +================== + + * Fix: babel-core compatibility + +2.5.0 / 2016-12-20 +================== + + * Fix: wrong reference in bower file (@thebigredgeek) + * Fix: webworker compatibility (@thebigredgeek) + * Fix: output formatting issue (#388, @kribblo) + * Fix: babel-loader compatibility (#383, @escwald) + * Misc: removed built asset from repo and publications (@thebigredgeek) + * Misc: moved source files to /src (#378, @yamikuronue) + * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) + * Test: coveralls integration (#378, @yamikuronue) + * Docs: simplified language in the opening paragraph (#373, @yamikuronue) + +2.4.5 / 2016-12-17 +================== + + * Fix: `navigator` undefined in Rhino (#376, @jochenberger) + * Fix: custom log function (#379, @hsiliev) + * Improvement: bit of cleanup + linting fixes (@thebigredgeek) + * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) + * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) + +2.4.4 / 2016-12-14 +================== + + * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) + +2.4.3 / 2016-12-14 +================== + + * Fix: navigation.userAgent error for react native (#364, @escwald) + +2.4.2 / 2016-12-14 +================== + + * Fix: browser colors (#367, @tootallnate) + * Misc: travis ci integration (@thebigredgeek) + * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) + +2.4.1 / 2016-12-13 +================== + + * Fix: typo that broke the package (#356) + +2.4.0 / 2016-12-13 +================== + + * Fix: bower.json references unbuilt src entry point (#342, @justmatt) + * Fix: revert "handle regex special characters" (@tootallnate) + * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) + * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) + * Improvement: allow colors in workers (#335, @botverse) + * Improvement: use same color for same namespace. (#338, @lchenay) + +2.3.3 / 2016-11-09 +================== + + * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) + * Fix: Returning `localStorage` saved values (#331, Levi Thomason) + * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) + +2.3.2 / 2016-11-09 +================== + + * Fix: be super-safe in index.js as well (@TooTallNate) + * Fix: should check whether process exists (Tom Newby) + +2.3.1 / 2016-11-09 +================== + + * Fix: Added electron compatibility (#324, @paulcbetts) + * Improvement: Added performance optimizations (@tootallnate) + * Readme: Corrected PowerShell environment variable example (#252, @gimre) + * Misc: Removed yarn lock file from source control (#321, @fengmk2) + +2.3.0 / 2016-11-07 +================== + + * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) + * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) + * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) + * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) + * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) + * Package: Update "ms" to 0.7.2 (#315, @DevSide) + * Package: removed superfluous version property from bower.json (#207 @kkirsche) + * Readme: fix USE_COLORS to DEBUG_COLORS + * Readme: Doc fixes for format string sugar (#269, @mlucool) + * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) + * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) + * Readme: better docs for browser support (#224, @matthewmueller) + * Tooling: Added yarn integration for development (#317, @thebigredgeek) + * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) + * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) + * Misc: Updated contributors (@thebigredgeek) + +2.2.0 / 2015-05-09 +================== + + * package: update "ms" to v0.7.1 (#202, @dougwilson) + * README: add logging to file example (#193, @DanielOchoa) + * README: fixed a typo (#191, @amir-s) + * browser: expose `storage` (#190, @stephenmathieson) + * Makefile: add a `distclean` target (#189, @stephenmathieson) + +2.1.3 / 2015-03-13 +================== + + * Updated stdout/stderr example (#186) + * Updated example/stdout.js to match debug current behaviour + * Renamed example/stderr.js to stdout.js + * Update Readme.md (#184) + * replace high intensity foreground color for bold (#182, #183) + +2.1.2 / 2015-03-01 +================== + + * dist: recompile + * update "ms" to v0.7.0 + * package: update "browserify" to v9.0.3 + * component: fix "ms.js" repo location + * changed bower package name + * updated documentation about using debug in a browser + * fix: security error on safari (#167, #168, @yields) + +2.1.1 / 2014-12-29 +================== + + * browser: use `typeof` to check for `console` existence + * browser: check for `console.log` truthiness (fix IE 8/9) + * browser: add support for Chrome apps + * Readme: added Windows usage remarks + * Add `bower.json` to properly support bower install + +2.1.0 / 2014-10-15 +================== + + * node: implement `DEBUG_FD` env variable support + * package: update "browserify" to v6.1.0 + * package: add "license" field to package.json (#135, @panuhorsmalahti) + +2.0.0 / 2014-09-01 +================== + + * package: update "browserify" to v5.11.0 + * node: use stderr rather than stdout for logging (#29, @stephenmathieson) + +1.0.4 / 2014-07-15 +================== + + * dist: recompile + * example: remove `console.info()` log usage + * example: add "Content-Type" UTF-8 header to browser example + * browser: place %c marker after the space character + * browser: reset the "content" color via `color: inherit` + * browser: add colors support for Firefox >= v31 + * debug: prefer an instance `log()` function over the global one (#119) + * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) + +1.0.3 / 2014-07-09 +================== + + * Add support for multiple wildcards in namespaces (#122, @seegno) + * browser: fix lint + +1.0.2 / 2014-06-10 +================== + + * browser: update color palette (#113, @gscottolson) + * common: make console logging function configurable (#108, @timoxley) + * node: fix %o colors on old node <= 0.8.x + * Makefile: find node path using shell/which (#109, @timoxley) + +1.0.1 / 2014-06-06 +================== + + * browser: use `removeItem()` to clear localStorage + * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) + * package: add "contributors" section + * node: fix comment typo + * README: list authors + +1.0.0 / 2014-06-04 +================== + + * make ms diff be global, not be scope + * debug: ignore empty strings in enable() + * node: make DEBUG_COLORS able to disable coloring + * *: export the `colors` array + * npmignore: don't publish the `dist` dir + * Makefile: refactor to use browserify + * package: add "browserify" as a dev dependency + * Readme: add Web Inspector Colors section + * node: reset terminal color for the debug content + * node: map "%o" to `util.inspect()` + * browser: map "%j" to `JSON.stringify()` + * debug: add custom "formatters" + * debug: use "ms" module for humanizing the diff + * Readme: add "bash" syntax highlighting + * browser: add Firebug color support + * browser: add colors for WebKit browsers + * node: apply log to `console` + * rewrite: abstract common logic for Node & browsers + * add .jshintrc file + +0.8.1 / 2014-04-14 +================== + + * package: re-add the "component" section + +0.8.0 / 2014-03-30 +================== + + * add `enable()` method for nodejs. Closes #27 + * change from stderr to stdout + * remove unnecessary index.js file + +0.7.4 / 2013-11-13 +================== + + * remove "browserify" key from package.json (fixes something in browserify) + +0.7.3 / 2013-10-30 +================== + + * fix: catch localStorage security error when cookies are blocked (Chrome) + * add debug(err) support. Closes #46 + * add .browser prop to package.json. Closes #42 + +0.7.2 / 2013-02-06 +================== + + * fix package.json + * fix: Mobile Safari (private mode) is broken with debug + * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript + +0.7.1 / 2013-02-05 +================== + + * add repository URL to package.json + * add DEBUG_COLORED to force colored output + * add browserify support + * fix component. Closes #24 + +0.7.0 / 2012-05-04 +================== + + * Added .component to package.json + * Added debug.component.js build + +0.6.0 / 2012-03-16 +================== + + * Added support for "-" prefix in DEBUG [Vinay Pulim] + * Added `.enabled` flag to the node version [TooTallNate] + +0.5.0 / 2012-02-02 +================== + + * Added: humanize diffs. Closes #8 + * Added `debug.disable()` to the CS variant + * Removed padding. Closes #10 + * Fixed: persist client-side variant again. Closes #9 + +0.4.0 / 2012-02-01 +================== + + * Added browser variant support for older browsers [TooTallNate] + * Added `debug.enable('project:*')` to browser variant [TooTallNate] + * Added padding to diff (moved it to the right) + +0.3.0 / 2012-01-26 +================== + + * Added millisecond diff when isatty, otherwise UTC string + +0.2.0 / 2012-01-22 +================== + + * Added wildcard support + +0.1.0 / 2011-12-02 +================== + + * Added: remove colors unless stderr isatty [TooTallNate] + +0.0.1 / 2010-01-03 +================== + + * Initial release diff --git a/node_modules/finalhandler/node_modules/debug/LICENSE b/node_modules/finalhandler/node_modules/debug/LICENSE new file mode 100644 index 0000000..658c933 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/LICENSE @@ -0,0 +1,19 @@ +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +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/finalhandler/node_modules/debug/Makefile b/node_modules/finalhandler/node_modules/debug/Makefile new file mode 100644 index 0000000..584da8b --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/Makefile @@ -0,0 +1,50 @@ +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) + +# BIN directory +BIN := $(THIS_DIR)/node_modules/.bin + +# Path +PATH := node_modules/.bin:$(PATH) +SHELL := /bin/bash + +# applications +NODE ?= $(shell which node) +YARN ?= $(shell which yarn) +PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) +BROWSERIFY ?= $(NODE) $(BIN)/browserify + +.FORCE: + +install: node_modules + +node_modules: package.json + @NODE_ENV= $(PKG) install + @touch node_modules + +lint: .FORCE + eslint browser.js debug.js index.js node.js + +test-node: .FORCE + istanbul cover node_modules/mocha/bin/_mocha -- test/**.js + +test-browser: .FORCE + mkdir -p dist + + @$(BROWSERIFY) \ + --standalone debug \ + . > dist/debug.js + + karma start --single-run + rimraf dist + +test: .FORCE + concurrently \ + "make test-node" \ + "make test-browser" + +coveralls: + cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + +.PHONY: all install clean distclean diff --git a/node_modules/finalhandler/node_modules/debug/README.md b/node_modules/finalhandler/node_modules/debug/README.md new file mode 100644 index 0000000..f67be6b --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/README.md @@ -0,0 +1,312 @@ +# debug +[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny node.js debugging utility modelled after node core's debugging technique. + +**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example _worker.js_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) + +#### Windows note + + On Windows the environment variable is set using the `set` command. + + ```cmd + set DEBUG=*,-not_this + ``` + + Note that PowerShell uses different syntax to set environment variables. + + ```cmd + $env:DEBUG = "*,-not_this" + ``` + +Then, run the program to be debugged as usual. + +## Millisecond diff + + When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) + +## Conventions + + If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". + +## Wildcards + + The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + + You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". + +## Environment Variables + + When running through Node.js, you can set a few environment variables that will + change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + + __Note:__ The environment variables beginning with `DEBUG_` end up being + converted into an Options object that gets used with `%o`/`%O` formatters. + See the Node.js documentation for + [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) + for the complete list. + +## Formatters + + + Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + +### Custom formatters + + You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + +## Browser support + You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), + or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), + if you don't want to build it yourself. + + Debug's enable state is currently persisted by `localStorage`. + Consider the situation shown below where you have `worker:a` and `worker:b`, + and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +#### Web Inspector Colors + + Colors are also enabled on "Web Inspectors" that understand the `%c` formatting + option. These are WebKit web inspectors, Firefox ([since version + 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) + and the Firebug plugin for Firefox (any version). + + Colored output looks something like: + + ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example _stdout.js_: + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> + +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/finalhandler/node_modules/debug/component.json b/node_modules/finalhandler/node_modules/debug/component.json new file mode 100644 index 0000000..9de2641 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/component.json @@ -0,0 +1,19 @@ +{ + "name": "debug", + "repo": "visionmedia/debug", + "description": "small debugging utility", + "version": "2.6.9", + "keywords": [ + "debug", + "log", + "debugger" + ], + "main": "src/browser.js", + "scripts": [ + "src/browser.js", + "src/debug.js" + ], + "dependencies": { + "rauchg/ms.js": "0.7.1" + } +} diff --git a/node_modules/finalhandler/node_modules/debug/karma.conf.js b/node_modules/finalhandler/node_modules/debug/karma.conf.js new file mode 100644 index 0000000..103a82d --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/karma.conf.js @@ -0,0 +1,70 @@ +// Karma configuration +// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha', 'chai', 'sinon'], + + + // list of files / patterns to load in the browser + files: [ + 'dist/debug.js', + 'test/*spec.js' + ], + + + // list of files to exclude + exclude: [ + 'src/node.js' + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }) +} diff --git a/node_modules/finalhandler/node_modules/debug/node.js b/node_modules/finalhandler/node_modules/debug/node.js new file mode 100644 index 0000000..7fc36fe --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/node.js @@ -0,0 +1 @@ +module.exports = require('./src/node'); diff --git a/node_modules/finalhandler/node_modules/debug/package.json b/node_modules/finalhandler/node_modules/debug/package.json new file mode 100644 index 0000000..dc787ba --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/package.json @@ -0,0 +1,49 @@ +{ + "name": "debug", + "version": "2.6.9", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "description": "small debugging utility", + "keywords": [ + "debug", + "log", + "debugger" + ], + "author": "TJ Holowaychuk ", + "contributors": [ + "Nathan Rajlich (http://n8.io)", + "Andrew Rhyne " + ], + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + }, + "devDependencies": { + "browserify": "9.0.3", + "chai": "^3.5.0", + "concurrently": "^3.1.0", + "coveralls": "^2.11.15", + "eslint": "^3.12.1", + "istanbul": "^0.4.5", + "karma": "^1.3.0", + "karma-chai": "^0.1.0", + "karma-mocha": "^1.3.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-sinon": "^1.0.5", + "mocha": "^3.2.0", + "mocha-lcov-reporter": "^1.2.0", + "rimraf": "^2.5.4", + "sinon": "^1.17.6", + "sinon-chai": "^2.8.0" + }, + "main": "./src/index.js", + "browser": "./src/browser.js", + "component": { + "scripts": { + "debug/index.js": "browser.js", + "debug/debug.js": "debug.js" + } + } +} diff --git a/node_modules/finalhandler/node_modules/debug/src/browser.js b/node_modules/finalhandler/node_modules/debug/src/browser.js new file mode 100644 index 0000000..7106924 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/src/browser.js @@ -0,0 +1,185 @@ +/** + * This is the web browser implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = 'undefined' != typeof chrome + && 'undefined' != typeof chrome.storage + ? chrome.storage.local + : localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + 'lightseagreen', + 'forestgreen', + 'goldenrod', + 'dodgerblue', + 'darkorchid', + 'crimson' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} diff --git a/node_modules/finalhandler/node_modules/debug/src/debug.js b/node_modules/finalhandler/node_modules/debug/src/debug.js new file mode 100644 index 0000000..6a5e3fc --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/src/debug.js @@ -0,0 +1,202 @@ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require('ms'); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/node_modules/finalhandler/node_modules/debug/src/index.js b/node_modules/finalhandler/node_modules/debug/src/index.js new file mode 100644 index 0000000..e12cf4d --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer process, which is node, but we should + * treat as a browser. + */ + +if (typeof process !== 'undefined' && process.type === 'renderer') { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/node_modules/finalhandler/node_modules/debug/src/inspector-log.js b/node_modules/finalhandler/node_modules/debug/src/inspector-log.js new file mode 100644 index 0000000..60ea6c0 --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/src/inspector-log.js @@ -0,0 +1,15 @@ +module.exports = inspectorLog; + +// black hole +const nullStream = new (require('stream').Writable)(); +nullStream._write = () => {}; + +/** + * Outputs a `console.log()` to the Node.js Inspector console *only*. + */ +function inspectorLog() { + const stdout = console._stdout; + console._stdout = nullStream; + console.log.apply(console, arguments); + console._stdout = stdout; +} diff --git a/node_modules/finalhandler/node_modules/debug/src/node.js b/node_modules/finalhandler/node_modules/debug/src/node.js new file mode 100644 index 0000000..b15109c --- /dev/null +++ b/node_modules/finalhandler/node_modules/debug/src/node.js @@ -0,0 +1,248 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); +var util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = require('./debug'); +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(function (key) { + return /^debug_/i.test(key); +}).reduce(function (obj, key) { + // camel-case + var prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); + + // coerce string value into JS value + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) val = false; + else if (val === 'null') val = null; + else val = Number(val); + + obj[prop] = val; + return obj; +}, {}); + +/** + * The file descriptor to write the `debug()` calls to. + * Set the `DEBUG_FD` env variable to override with another value. i.e.: + * + * $ DEBUG_FD=3 node script.js 3>debug.log + */ + +var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + +if (1 !== fd && 2 !== fd) { + util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() +} + +var stream = 1 === fd ? process.stdout : + 2 === fd ? process.stderr : + createWritableStdioStream(fd); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts + ? Boolean(exports.inspectOpts.colors) + : tty.isatty(fd); +} + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +exports.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n').map(function(str) { + return str.trim() + }).join(' '); +}; + +/** + * Map %o to `util.inspect()`, allowing multiple lines if needed. + */ + +exports.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + var name = this.namespace; + var useColors = this.useColors; + + if (useColors) { + var c = this.color; + var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); + } else { + args[0] = new Date().toUTCString() + + ' ' + name + ' ' + args[0]; + } +} + +/** + * Invokes `util.format()` with the specified arguments and writes to `stream`. + */ + +function log() { + return stream.write(util.format.apply(util, arguments) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + if (null == namespaces) { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Copied from `node/src/node.js`. + * + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. + */ + +function createWritableStdioStream (fd) { + var stream; + var tty_wrap = process.binding('tty_wrap'); + + // Note stream._type is used for test-module-load-list.js + + switch (tty_wrap.guessHandleType(fd)) { + case 'TTY': + stream = new tty.WriteStream(fd); + stream._type = 'tty'; + + // Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + case 'FILE': + var fs = require('fs'); + stream = new fs.SyncWriteStream(fd, { autoClose: false }); + stream._type = 'fs'; + break; + + case 'PIPE': + case 'TCP': + var net = require('net'); + stream = new net.Socket({ + fd: fd, + readable: false, + writable: true + }); + + // FIXME Should probably have an option in net.Socket to create a + // stream from an existing fd which is writable only. But for now + // we'll just add this hack and set the `readable` member to false. + // Test: ./node test/fixtures/echo.js < /etc/passwd + stream.readable = false; + stream.read = null; + stream._type = 'pipe'; + + // FIXME Hack to have stream not keep the event loop alive. + // See https://github.com/joyent/node/issues/1726 + if (stream._handle && stream._handle.unref) { + stream._handle.unref(); + } + break; + + default: + // Probably an error on in uv_guess_handle() + throw new Error('Implement me. Unknown stream file type!'); + } + + // For supporting legacy API we put the FD here. + stream.fd = fd; + + stream._isStdio = true; + + return stream; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init (debug) { + debug.inspectOpts = {}; + + var keys = Object.keys(exports.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +/** + * Enable namespaces listed in `process.env.DEBUG` initially. + */ + +exports.enable(load()); diff --git a/node_modules/finalhandler/node_modules/ms/index.js b/node_modules/finalhandler/node_modules/ms/index.js new file mode 100644 index 0000000..6a522b1 --- /dev/null +++ b/node_modules/finalhandler/node_modules/ms/index.js @@ -0,0 +1,152 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} diff --git a/node_modules/finalhandler/node_modules/ms/license.md b/node_modules/finalhandler/node_modules/ms/license.md new file mode 100644 index 0000000..69b6125 --- /dev/null +++ b/node_modules/finalhandler/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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/finalhandler/node_modules/ms/package.json b/node_modules/finalhandler/node_modules/ms/package.json new file mode 100644 index 0000000..6a31c81 --- /dev/null +++ b/node_modules/finalhandler/node_modules/ms/package.json @@ -0,0 +1,37 @@ +{ + "name": "ms", + "version": "2.0.0", + "description": "Tiny milisecond conversion utility", + "repository": "zeit/ms", + "main": "./index", + "files": [ + "index.js" + ], + "scripts": { + "precommit": "lint-staged", + "lint": "eslint lib/* bin/*", + "test": "mocha tests.js" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "license": "MIT", + "devDependencies": { + "eslint": "3.19.0", + "expect.js": "0.3.1", + "husky": "0.13.3", + "lint-staged": "3.4.1", + "mocha": "3.4.1" + } +} diff --git a/node_modules/finalhandler/node_modules/ms/readme.md b/node_modules/finalhandler/node_modules/ms/readme.md new file mode 100644 index 0000000..84a9974 --- /dev/null +++ b/node_modules/finalhandler/node_modules/ms/readme.md @@ -0,0 +1,51 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +``` + +### Convert from milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(ms('10 hours')) // "10h" +``` + +### Time format written-out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [node](https://nodejs.org) and in the browser. +- If a number is supplied to `ms`, a string with a unit is returned. +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`). +- If you pass a string with a number and a valid unit, the number of equivalent ms is returned. + +## Caught a bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, node will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node_modules/finalhandler/package.json b/node_modules/finalhandler/package.json new file mode 100644 index 0000000..2363eb4 --- /dev/null +++ b/node_modules/finalhandler/package.json @@ -0,0 +1,47 @@ +{ + "name": "finalhandler", + "description": "Node.js final http responder", + "version": "1.3.1", + "author": "Douglas Christopher Wilson ", + "license": "MIT", + "repository": "pillarjs/finalhandler", + "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" + }, + "devDependencies": { + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "10.0.0", + "nyc": "15.1.0", + "readable-stream": "2.3.6", + "safe-buffer": "5.2.1", + "supertest": "6.2.4" + }, + "files": [ + "LICENSE", + "HISTORY.md", + "SECURITY.md", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks test/", + "test-ci": "nyc --reporter=lcovonly --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "test-inspect": "mocha --reporter spec --inspect --inspect-brk test/" + } +} diff --git a/node_modules/flatted/LICENSE b/node_modules/flatted/LICENSE new file mode 100644 index 0000000..506dc47 --- /dev/null +++ b/node_modules/flatted/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +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/flatted/README.md b/node_modules/flatted/README.md new file mode 100644 index 0000000..429c152 --- /dev/null +++ b/node_modules/flatted/README.md @@ -0,0 +1,111 @@ +# flatted + +[![Downloads](https://img.shields.io/npm/dm/flatted.svg)](https://www.npmjs.com/package/flatted) [![Coverage Status](https://coveralls.io/repos/github/WebReflection/flatted/badge.svg?branch=main)](https://coveralls.io/github/WebReflection/flatted?branch=main) [![License: ISC](https://img.shields.io/badge/License-ISC-yellow.svg)](https://opensource.org/licenses/ISC) ![WebReflection status](https://offline.report/status/webreflection.svg) + +![snow flake](./flatted.jpg) + +**Social Media Photo by [Matt Seymour](https://unsplash.com/@mattseymour) on [Unsplash](https://unsplash.com/)** + +A super light (0.5K) and fast circular JSON parser, directly from the creator of [CircularJSON](https://github.com/WebReflection/circular-json/#circularjson). + +Available also for **[PHP](./php/flatted.php)**. + +Available also for **[Python](./python/flatted.py)**. + +Available also for **[Go](./golang/README.md)**. + +- - - + +## ℹ️ JSON only values + +If you need anything more complex than values JSON understands, there is a standard approach to recursion and more data-types than what JSON allows, and it's part of the [Structured Clone polyfill](https://github.com/ungap/structured-clone/#readme). + +- - - + +```js +npm i flatted +``` + +Usable via [CDN](https://unpkg.com/flatted) or as regular module. + +```js +// ESM +import {parse, stringify, toJSON, fromJSON} from 'flatted'; + +// CJS +const {parse, stringify, toJSON, fromJSON} = require('flatted'); + +const a = [{}]; +a[0].a = a; +a.push(a); + +stringify(a); // [["1","0"],{"a":"0"}] +``` + +## toJSON and fromJSON + +If you'd like to implicitly survive JSON serialization, these two helpers helps: + +```js +import {toJSON, fromJSON} from 'flatted'; + +class RecursiveMap extends Map { + static fromJSON(any) { + return new this(fromJSON(any)); + } + toJSON() { + return toJSON([...this.entries()]); + } +} + +const recursive = new RecursiveMap; +const same = {}; +same.same = same; +recursive.set('same', same); + +const asString = JSON.stringify(recursive); +const asMap = RecursiveMap.fromJSON(JSON.parse(asString)); +asMap.get('same') === asMap.get('same').same; +// true +``` + + +## Flatted VS JSON + +As it is for every other specialized format capable of serializing and deserializing circular data, you should never `JSON.parse(Flatted.stringify(data))`, and you should never `Flatted.parse(JSON.stringify(data))`. + +The only way this could work is to `Flatted.parse(Flatted.stringify(data))`, as it is also for _CircularJSON_ or any other, otherwise there's no granted data integrity. + +Also please note this project serializes and deserializes only data compatible with JSON, so that sockets, or anything else with internal classes different from those allowed by JSON standard, won't be serialized and unserialized as expected. + + +### New in V1: Exact same JSON API + + * Added a [reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Syntax) parameter to `.parse(string, reviver)` and revive your own objects. + * Added a [replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Syntax) and a `space` parameter to `.stringify(object, replacer, space)` for feature parity with JSON signature. + + +### Compatibility +All ECMAScript engines compatible with `Map`, `Set`, `Object.keys`, and `Array.prototype.reduce` will work, even if polyfilled. + + +### How does it work ? +While stringifying, all Objects, including Arrays, and strings, are flattened out and replaced as unique index. `*` + +Once parsed, all indexes will be replaced through the flattened collection. + +`*` represented as string to avoid conflicts with numbers + +```js +// logic example +var a = [{one: 1}, {two: '2'}]; +a[0].a = a; +// a is the main object, will be at index '0' +// {one: 1} is the second object, index '1' +// {two: '2'} the third, in '2', and it has a string +// which will be found at index '3' + +Flatted.stringify(a); +// [["1","2"],{"one":1,"a":"0"},{"two":"3"},"2"] +// a[one,two] {one: 1, a} {two: '2'} '2' +``` diff --git a/node_modules/flatted/cjs/index.js b/node_modules/flatted/cjs/index.js new file mode 100644 index 0000000..a4833a5 --- /dev/null +++ b/node_modules/flatted/cjs/index.js @@ -0,0 +1,132 @@ +'use strict'; +/// + +// (c) 2020-present Andrea Giammarchi + +const {parse: $parse, stringify: $stringify} = JSON; +const {keys} = Object; + +const Primitive = String; // it could be Number +const primitive = 'string'; // it could be 'number' + +const ignore = {}; +const object = 'object'; + +const noop = (_, value) => value; + +const primitives = value => ( + value instanceof Primitive ? Primitive(value) : value +); + +const Primitives = (_, value) => ( + typeof value === primitive ? new Primitive(value) : value +); + +const resolver = (input, lazy, parsed, $) => output => { + for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) { + const k = ke[y]; + const value = output[k]; + if (value instanceof Primitive) { + const tmp = input[+value]; + if (typeof tmp === object && !parsed.has(tmp)) { + parsed.add(tmp); + output[k] = ignore; + lazy.push({ o: output, k, r: tmp }); + } + else + output[k] = $.call(output, k, tmp); + } + else if (output[k] !== ignore) + output[k] = $.call(output, k, value); + } + return output; +}; + +const set = (known, input, value) => { + const index = Primitive(input.push(value) - 1); + known.set(value, index); + return index; +}; + +/** + * Converts a specialized flatted string into a JS value. + * @param {string} text + * @param {(this: any, key: string, value: any) => any} [reviver] + * @returns {any} + */ +const parse = (text, reviver) => { + const input = $parse(text, Primitives).map(primitives); + const $ = reviver || noop; + + let value = input[0]; + + if (typeof value === object && value) { + const lazy = []; + const revive = resolver(input, lazy, new Set, $); + value = revive(value); + + let i = 0; + while (i < lazy.length) { + // it could be a lazy.shift() but that's costly + const {o, k, r} = lazy[i++]; + o[k] = $.call(o, k, revive(r)); + } + } + + return $.call({'': value}, '', value); +}; +exports.parse = parse; + +/** + * Converts a JS value into a specialized flatted string. + * @param {any} value + * @param {((this: any, key: string, value: any) => any) | (string | number)[] | null | undefined} [replacer] + * @param {string | number | undefined} [space] + * @returns {string} + */ +const stringify = (value, replacer, space) => { + const $ = replacer && typeof replacer === object ? + (k, v) => (k === '' || -1 < replacer.indexOf(k) ? v : void 0) : + (replacer || noop); + const known = new Map; + const input = []; + const output = []; + let i = +set(known, input, $.call({'': value}, '', value)); + let firstRun = !i; + while (i < input.length) { + firstRun = true; + output[i] = $stringify(input[i++], replace, space); + } + return '[' + output.join(',') + ']'; + function replace(key, value) { + if (firstRun) { + firstRun = !firstRun; + return value; + } + const after = $.call(this, key, value); + switch (typeof after) { + case object: + if (after === null) return after; + case primitive: + return known.get(after) || set(known, input, after); + } + return after; + } +}; +exports.stringify = stringify; + +/** + * Converts a generic value into a JSON serializable object without losing recursion. + * @param {any} value + * @returns {any} + */ +const toJSON = value => $parse(stringify(value)); +exports.toJSON = toJSON; + +/** + * Converts a previously serialized object with recursion into a recursive one. + * @param {any} value + * @returns {any} + */ +const fromJSON = value => parse($stringify(value)); +exports.fromJSON = fromJSON; diff --git a/node_modules/flatted/cjs/package.json b/node_modules/flatted/cjs/package.json new file mode 100644 index 0000000..0292b99 --- /dev/null +++ b/node_modules/flatted/cjs/package.json @@ -0,0 +1 @@ +{"type":"commonjs"} \ No newline at end of file diff --git a/node_modules/flatted/es.js b/node_modules/flatted/es.js new file mode 100644 index 0000000..3e4d187 --- /dev/null +++ b/node_modules/flatted/es.js @@ -0,0 +1 @@ +self.Flatted=function(t){"use strict";const{parse:e,stringify:n}=JSON,{keys:r}=Object,o=String,s="string",c={},l="object",f=(t,e)=>e,i=t=>t instanceof o?o(t):t,a=(t,e)=>typeof e===s?new o(e):e,u=(t,e,n)=>{const r=o(e.push(n)-1);return t.set(n,r),r},p=(t,n)=>{const s=e(t,a).map(i),u=n||f;let p=s[0];if(typeof p===l&&p){const t=[],e=((t,e,n,s)=>f=>{for(let i=r(f),{length:a}=i,u=0;u{const o=e&&typeof e===l?(t,n)=>""===t||-1p(n(t)),t.parse=p,t.stringify=g,t.toJSON=t=>e(g(t)),t}({}); diff --git a/node_modules/flatted/esm.js b/node_modules/flatted/esm.js new file mode 100644 index 0000000..2563a41 --- /dev/null +++ b/node_modules/flatted/esm.js @@ -0,0 +1 @@ +const{parse:t,stringify:e}=JSON,{keys:n}=Object,o=String,r="string",s={},c="object",l=(t,e)=>e,f=t=>t instanceof o?o(t):t,i=(t,e)=>typeof e===r?new o(e):e,a=(t,e,n)=>{const r=o(e.push(n)-1);return t.set(n,r),r},u=(e,r)=>{const a=t(e,i).map(f),u=r||l;let p=a[0];if(typeof p===c&&p){const t=[],e=((t,e,r,l)=>f=>{for(let i=n(f),{length:a}=i,u=0;u{const s=n&&typeof n===c?(t,e)=>""===t||-1t(p(e)),g=t=>u(e(t));export{g as fromJSON,u as parse,p as stringify,h as toJSON}; diff --git a/node_modules/flatted/esm/index.js b/node_modules/flatted/esm/index.js new file mode 100644 index 0000000..eb2da2d --- /dev/null +++ b/node_modules/flatted/esm/index.js @@ -0,0 +1,127 @@ +/// + +// (c) 2020-present Andrea Giammarchi + +const {parse: $parse, stringify: $stringify} = JSON; +const {keys} = Object; + +const Primitive = String; // it could be Number +const primitive = 'string'; // it could be 'number' + +const ignore = {}; +const object = 'object'; + +const noop = (_, value) => value; + +const primitives = value => ( + value instanceof Primitive ? Primitive(value) : value +); + +const Primitives = (_, value) => ( + typeof value === primitive ? new Primitive(value) : value +); + +const resolver = (input, lazy, parsed, $) => output => { + for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) { + const k = ke[y]; + const value = output[k]; + if (value instanceof Primitive) { + const tmp = input[+value]; + if (typeof tmp === object && !parsed.has(tmp)) { + parsed.add(tmp); + output[k] = ignore; + lazy.push({ o: output, k, r: tmp }); + } + else + output[k] = $.call(output, k, tmp); + } + else if (output[k] !== ignore) + output[k] = $.call(output, k, value); + } + return output; +}; + +const set = (known, input, value) => { + const index = Primitive(input.push(value) - 1); + known.set(value, index); + return index; +}; + +/** + * Converts a specialized flatted string into a JS value. + * @param {string} text + * @param {(this: any, key: string, value: any) => any} [reviver] + * @returns {any} + */ +export const parse = (text, reviver) => { + const input = $parse(text, Primitives).map(primitives); + const $ = reviver || noop; + + let value = input[0]; + + if (typeof value === object && value) { + const lazy = []; + const revive = resolver(input, lazy, new Set, $); + value = revive(value); + + let i = 0; + while (i < lazy.length) { + // it could be a lazy.shift() but that's costly + const {o, k, r} = lazy[i++]; + o[k] = $.call(o, k, revive(r)); + } + } + + return $.call({'': value}, '', value); +}; + +/** + * Converts a JS value into a specialized flatted string. + * @param {any} value + * @param {((this: any, key: string, value: any) => any) | (string | number)[] | null | undefined} [replacer] + * @param {string | number | undefined} [space] + * @returns {string} + */ +export const stringify = (value, replacer, space) => { + const $ = replacer && typeof replacer === object ? + (k, v) => (k === '' || -1 < replacer.indexOf(k) ? v : void 0) : + (replacer || noop); + const known = new Map; + const input = []; + const output = []; + let i = +set(known, input, $.call({'': value}, '', value)); + let firstRun = !i; + while (i < input.length) { + firstRun = true; + output[i] = $stringify(input[i++], replace, space); + } + return '[' + output.join(',') + ']'; + function replace(key, value) { + if (firstRun) { + firstRun = !firstRun; + return value; + } + const after = $.call(this, key, value); + switch (typeof after) { + case object: + if (after === null) return after; + case primitive: + return known.get(after) || set(known, input, after); + } + return after; + } +}; + +/** + * Converts a generic value into a JSON serializable object without losing recursion. + * @param {any} value + * @returns {any} + */ +export const toJSON = value => $parse(stringify(value)); + +/** + * Converts a previously serialized object with recursion into a recursive one. + * @param {any} value + * @returns {any} + */ +export const fromJSON = value => parse($stringify(value)); diff --git a/node_modules/flatted/golang/README.md b/node_modules/flatted/golang/README.md new file mode 100644 index 0000000..1db041b --- /dev/null +++ b/node_modules/flatted/golang/README.md @@ -0,0 +1,60 @@ +# flatted (Go) + +A super light and fast circular JSON parser. + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/WebReflection/flatted/golang/pkg/flatted" +) + +type Group struct { + Name string `json:"name"` +} + +type User struct { + Name string `json:"name"` + Friend *User `json:"friend"` + Group *Group `json:"group"` +} + +func main() { + group := &Group{Name: "Developers"} + alice := &User{Name: "Alice", Group: group} + bob := &User{Name: "Bob", Group: group} + + alice.Friend = bob + bob.Friend = alice // Circular reference + + // Stringify Alice + s, _ := flatted.Stringify(alice) + fmt.Println(s) + // Output: [{"name":"Alice","friend":"1","group":"2"},{"name":"Bob","friend":"0","group":"2"},{"name":"Developers"}] + + // Flattening in action: + // Index "0" is Alice, Index "1" is Bob, Index "2" is the shared Group. + + // Parse back into a generic map structure + res, _ := flatted.Parse(s) + aliceMap := res.(map[string]any) + fmt.Println(aliceMap["name"]) // Alice +} +``` + +## CLI + +Build the binary using the provided Makefile: + +```bash +make build +``` + +Then use it to parse flatted JSON from stdin: + +```bash +echo '[{"a":"1"},"b"]' | ./flatted +``` diff --git a/node_modules/flatted/golang/pkg/flatted/flatted.go b/node_modules/flatted/golang/pkg/flatted/flatted.go new file mode 100644 index 0000000..8e3922c --- /dev/null +++ b/node_modules/flatted/golang/pkg/flatted/flatted.go @@ -0,0 +1,277 @@ +package flatted + +import ( + "encoding/json" + "reflect" + "sort" + "strconv" + "strings" +) + +// flattedIndex is a internal type used to distinguish between +// actual strings and flatted indices during the reconstruction phase. +type flattedIndex string + +// Stringify converts a Go value into a specialized flatted JSON string. +func Stringify(value any, replacer any, space any) (string, error) { + knownKeys := []any{} + knownValues := []string{} + input := []any{} + + index := func(v any) string { + input = append(input, v) + idx := strconv.Itoa(len(input) - 1) + knownKeys = append(knownKeys, v) + knownValues = append(knownValues, idx) + return idx + } + + relate := func(v any) any { + if v == nil { + return nil + } + rv := reflect.ValueOf(v) + kind := rv.Kind() + if kind == reflect.String || kind == reflect.Slice || kind == reflect.Map || kind == reflect.Ptr { + for i, k := range knownKeys { + if kind == reflect.String { + if k == v { + return knownValues[i] + } + } else { + rk := reflect.ValueOf(k) + if rk.Kind() == kind && rk.Pointer() == rv.Pointer() { + return knownValues[i] + } + } + } + return index(v) + } + return v + } + + transform := func(v any) any { + rv := reflect.ValueOf(v) + if !rv.IsValid() { + return nil + } + if _, ok := v.(json.Marshaler); ok { + return v + } + // Dereference pointers to process the underlying Slice, Map, or Array + for rv.Kind() == reflect.Ptr && !rv.IsNil() { + rv = rv.Elem() + } + switch rv.Kind() { + case reflect.Slice, reflect.Array: + res := make([]any, rv.Len()) + for i := 0; i < rv.Len(); i++ { + res[i] = relate(rv.Index(i).Interface()) + } + return res + case reflect.Map: + res := make(map[string]any) + keys := rv.MapKeys() + sort.Slice(keys, func(i, j int) bool { + return keys[i].String() < keys[j].String() + }) + + whitelist, isWhitelist := replacer.([]string) + for _, key := range keys { + kStr := key.String() + if isWhitelist { + found := false + for _, w := range whitelist { + if w == kStr { + found = true + break + } + } + if !found { + continue + } + } + res[kStr] = relate(rv.MapIndex(key).Interface()) + } + return res + case reflect.Struct: + res := make(map[string]any) + t := rv.Type() + for i := 0; i < rv.NumField(); i++ { + field := t.Field(i) + if field.PkgPath != "" { + continue + } + name := field.Name + if tag := field.Tag.Get("json"); tag != "" { + name = strings.Split(tag, ",")[0] + } + res[name] = relate(rv.Field(i).Interface()) + } + return res + default: + return v + } + } + + index(value) + output := []any{} + for i := 0; i < len(input); i++ { + output = append(output, transform(input[i])) + } + + var b []byte + var err error + indent := "" + if s, ok := space.(string); ok { + indent = s + } else if i, ok := space.(int); ok { + indent = strings.Repeat(" ", i) + } + + if indent != "" { + b, err = json.MarshalIndent(output, "", indent) + } else { + b, err = json.Marshal(output) + } + + if err != nil { + return "", err + } + return string(b), nil +} + +// Parse converts a specialized flatted string into a Go value. +func Parse(text string, reviver func(key string, value any) any) (any, error) { + var jsonInput []any + if err := json.Unmarshal([]byte(text), &jsonInput); err != nil { + return nil, err + } + + var wrap func(any) any + wrap = func(v any) any { + if s, ok := v.(string); ok { + return flattedIndex(s) + } + if arr, ok := v.([]any); ok { + for i, item := range arr { + arr[i] = wrap(item) + } + return arr + } + if m, ok := v.(map[string]any); ok { + for k, item := range m { + m[k] = wrap(item) + } + return m + } + return v + } + + wrapped := make([]any, len(jsonInput)) + for i, v := range jsonInput { + wrapped[i] = wrap(v) + } + + input := make([]any, len(wrapped)) + for i, v := range wrapped { + if fi, ok := v.(flattedIndex); ok { + input[i] = string(fi) + } else { + input[i] = v + } + } + + if len(input) == 0 { + return nil, nil + } + + value := input[0] + rv := reflect.ValueOf(value) + if rv.IsValid() && (rv.Kind() == reflect.Slice || rv.Kind() == reflect.Map) { + set := make(map[uintptr]bool) + set[rv.Pointer()] = true + res := loop(value, input, set) + if reviver != nil { + return revive("", res, reviver), nil + } + return res, nil + } + + if reviver != nil { + return reviver("", value), nil + } + return value, nil +} + +func revive(key string, value any, reviver func(k string, v any) any) any { + if arr, ok := value.([]any); ok { + for i, v := range arr { + arr[i] = revive(strconv.Itoa(i), v, reviver) + } + } else if m, ok := value.(map[string]any); ok { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + m[k] = revive(k, m[k], reviver) + } + } + return reviver(key, value) +} + +func loop(value any, input []any, set map[uintptr]bool) any { + if arr, ok := value.([]any); ok { + for i, v := range arr { + if fi, ok := v.(flattedIndex); ok { + idx, _ := strconv.Atoi(string(fi)) + arr[i] = ref(input[idx], input, set) + } + } + return arr + } + if m, ok := value.(map[string]any); ok { + for k, v := range m { + if fi, ok := v.(flattedIndex); ok { + idx, _ := strconv.Atoi(string(fi)) + m[k] = ref(input[idx], input, set) + } + } + return m + } + return value +} + +func ref(value any, input []any, set map[uintptr]bool) any { + rv := reflect.ValueOf(value) + if rv.IsValid() && (rv.Kind() == reflect.Slice || rv.Kind() == reflect.Map) { + ptr := rv.Pointer() + if !set[ptr] { + set[ptr] = true + return loop(value, input, set) + } + } + return value +} + +// ToJSON converts a generic value into a JSON serializable object without losing recursion. +func ToJSON(value any) (any, error) { + s, err := Stringify(value, nil, nil) + if err != nil { + return nil, err + } + var res any + err = json.Unmarshal([]byte(s), &res) + return res, err +} + +// FromJSON converts a previously serialized object with recursion into a recursive one. +func FromJSON(value any) (any, error) { + b, err := json.Marshal(value) + if err != nil { + return nil, err + } + return Parse(string(b), nil) +} diff --git a/node_modules/flatted/index.js b/node_modules/flatted/index.js new file mode 100644 index 0000000..9386548 --- /dev/null +++ b/node_modules/flatted/index.js @@ -0,0 +1,155 @@ +self.Flatted = (function (exports) { + 'use strict'; + + function _typeof(o) { + "@babel/helpers - typeof"; + + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, _typeof(o); + } + + /// + + // (c) 2020-present Andrea Giammarchi + + var $parse = JSON.parse, + $stringify = JSON.stringify; + var keys = Object.keys; + var Primitive = String; // it could be Number + var primitive = 'string'; // it could be 'number' + + var ignore = {}; + var object = 'object'; + var noop = function noop(_, value) { + return value; + }; + var primitives = function primitives(value) { + return value instanceof Primitive ? Primitive(value) : value; + }; + var Primitives = function Primitives(_, value) { + return _typeof(value) === primitive ? new Primitive(value) : value; + }; + var resolver = function resolver(input, lazy, parsed, $) { + return function (output) { + for (var ke = keys(output), length = ke.length, y = 0; y < length; y++) { + var k = ke[y]; + var value = output[k]; + if (value instanceof Primitive) { + var tmp = input[+value]; + if (_typeof(tmp) === object && !parsed.has(tmp)) { + parsed.add(tmp); + output[k] = ignore; + lazy.push({ + o: output, + k: k, + r: tmp + }); + } else output[k] = $.call(output, k, tmp); + } else if (output[k] !== ignore) output[k] = $.call(output, k, value); + } + return output; + }; + }; + var set = function set(known, input, value) { + var index = Primitive(input.push(value) - 1); + known.set(value, index); + return index; + }; + + /** + * Converts a specialized flatted string into a JS value. + * @param {string} text + * @param {(this: any, key: string, value: any) => any} [reviver] + * @returns {any} + */ + var parse = function parse(text, reviver) { + var input = $parse(text, Primitives).map(primitives); + var $ = reviver || noop; + var value = input[0]; + if (_typeof(value) === object && value) { + var lazy = []; + var revive = resolver(input, lazy, new Set(), $); + value = revive(value); + var i = 0; + while (i < lazy.length) { + // it could be a lazy.shift() but that's costly + var _lazy$i = lazy[i++], + o = _lazy$i.o, + k = _lazy$i.k, + r = _lazy$i.r; + o[k] = $.call(o, k, revive(r)); + } + } + return $.call({ + '': value + }, '', value); + }; + + /** + * Converts a JS value into a specialized flatted string. + * @param {any} value + * @param {((this: any, key: string, value: any) => any) | (string | number)[] | null | undefined} [replacer] + * @param {string | number | undefined} [space] + * @returns {string} + */ + var stringify = function stringify(value, replacer, space) { + var $ = replacer && _typeof(replacer) === object ? function (k, v) { + return k === '' || -1 < replacer.indexOf(k) ? v : void 0; + } : replacer || noop; + var known = new Map(); + var input = []; + var output = []; + var i = +set(known, input, $.call({ + '': value + }, '', value)); + var firstRun = !i; + while (i < input.length) { + firstRun = true; + output[i] = $stringify(input[i++], replace, space); + } + return '[' + output.join(',') + ']'; + function replace(key, value) { + if (firstRun) { + firstRun = !firstRun; + return value; + } + var after = $.call(this, key, value); + switch (_typeof(after)) { + case object: + if (after === null) return after; + case primitive: + return known.get(after) || set(known, input, after); + } + return after; + } + }; + + /** + * Converts a generic value into a JSON serializable object without losing recursion. + * @param {any} value + * @returns {any} + */ + var toJSON = function toJSON(value) { + return $parse(stringify(value)); + }; + + /** + * Converts a previously serialized object with recursion into a recursive one. + * @param {any} value + * @returns {any} + */ + var fromJSON = function fromJSON(value) { + return parse($stringify(value)); + }; + + exports.fromJSON = fromJSON; + exports.parse = parse; + exports.stringify = stringify; + exports.toJSON = toJSON; + + return exports; + +})({}); diff --git a/node_modules/flatted/min.js b/node_modules/flatted/min.js new file mode 100644 index 0000000..d3a97cb --- /dev/null +++ b/node_modules/flatted/min.js @@ -0,0 +1 @@ +self.Flatted=function(n){"use strict";function t(n){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},t(n)}var r=JSON.parse,e=JSON.stringify,o=Object.keys,u=String,f="string",i={},c="object",a=function(n,t){return t},l=function(n){return n instanceof u?u(n):n},s=function(n,r){return t(r)===f?new u(r):r},y=function(n,t,r){var e=u(t.push(r)-1);return n.set(r,e),e},p=function(n,e){var f=r(n,s).map(l),y=e||a,p=f[0];if(t(p)===c&&p){var v=[],S=function(n,r,e,f){return function(a){for(var l=o(a),s=l.length,y=0;y ./coverage/lcov.info" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/WebReflection/flatted.git" + }, + "files": [ + "LICENSE", + "README.md", + "cjs/", + "es.js", + "esm.js", + "esm/", + "index.js", + "min.js", + "php/flatted.php", + "python/flatted.py", + "golang/pkg/flatted/flatted.go", + "types/" + ], + "keywords": [ + "circular", + "JSON", + "fast", + "parser", + "minimal" + ], + "author": "Andrea Giammarchi", + "license": "ISC", + "bugs": { + "url": "https://github.com/WebReflection/flatted/issues" + }, + "homepage": "https://github.com/WebReflection/flatted#readme", + "devDependencies": { + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.0", + "@rollup/plugin-babel": "^7.0.0", + "@rollup/plugin-terser": "^1.0.0", + "@ungap/structured-clone": "^1.3.0", + "ascjs": "^6.0.3", + "c8": "^11.0.0", + "circular-json": "^0.5.9", + "circular-json-es6": "^2.0.2", + "flatted-view": "^0.1.1", + "jsan": "^3.1.14", + "rollup": "^4.59.0", + "terser": "^5.46.0", + "typescript": "^5.9.3" + }, + "module": "./esm/index.js", + "type": "module", + "exports": { + ".": { + "types": "./types/index.d.ts", + "import": "./esm/index.js", + "default": "./cjs/index.js" + }, + "./esm": "./esm.js", + "./package.json": "./package.json" + }, + "types": "./types/index.d.ts" +} diff --git a/node_modules/flatted/php/flatted.php b/node_modules/flatted/php/flatted.php new file mode 100644 index 0000000..22659f6 --- /dev/null +++ b/node_modules/flatted/php/flatted.php @@ -0,0 +1,156 @@ +value = $value; + } +} + +class Flatted { + + // public utilities + public static function parse($json, $assoc = false, $depth = 512, $options = 0) { + $input = array_map( + 'Flatted::asString', + array_map( + 'Flatted::wrap', + json_decode($json, $assoc, $depth, $options) + ) + ); + $value = &$input[0]; + $set = array(); + $set[] = &$value; + if (is_array($value)) + return Flatted::loop(false, array_keys($value), $input, $set, $value); + if (is_object($value)) + return Flatted::loop(true, Flatted::keys($value), $input, $set, $value); + return $value; + } + + public static function stringify($value, $options = 0, $depth = 512) { + $known = new stdClass; + $known->key = array(); + $known->value = array(); + $input = array(); + $output = array(); + $i = intval(Flatted::index($known, $input, $value)); + while ($i < count($input)) { + $output[$i] = Flatted::transform($known, $input, $input[$i]); + $i++; + } + return json_encode($output, $options, $depth); + } + + // private helpers + private static function asString($value) { + return $value instanceof FlattedString ? $value->value : $value; + } + + private static function index(&$known, &$input, &$value) { + $input[] = &$value; + $index = strval(count($input) - 1); + $known->key[] = &$value; + $known->value[] = &$index; + return $index; + } + + private static function keys(&$value) { + $obj = new ReflectionObject($value); + $props = $obj->getProperties(); + $keys = array(); + foreach ($props as $prop) + $keys[] = $prop->getName(); + return $keys; + } + + private static function loop($obj, $keys, &$input, &$set, &$output) { + foreach ($keys as $key) { + $value = $obj ? $output->$key : $output[$key]; + if ($value instanceof FlattedString) + Flatted::ref($obj, $key, $input[$value->value], $input, $set, $output); + } + return $output; + } + + private static function relate(&$known, &$input, &$value) { + if (is_string($value) || is_array($value) || is_object($value)) { + $key = array_search($value, $known->key, true); + if ($key !== false) + return $known->value[$key]; + return Flatted::index($known, $input, $value); + } + return $value; + } + + private static function ref($obj, &$key, &$value, &$input, &$set, &$output) { + if (is_array($value) && !in_array($value, $set, true)) { + $set[] = $value; + $value = Flatted::loop(false, array_keys($value), $input, $set, $value); + } + elseif (is_object($value) && !in_array($value, $set, true)) { + $set[] = $value; + $value = Flatted::loop(true, Flatted::keys($value), $input, $set, $value); + } + if ($obj) { + $output->$key = &$value; + } + else { + $output[$key] = &$value; + } + } + + private static function transform(&$known, &$input, &$value) { + if (is_array($value)) { + return array_map( + function ($value) use(&$known, &$input) { + return Flatted::relate($known, $input, $value); + }, + $value + ); + } + if (is_object($value)) { + $object = new stdClass; + $keys = Flatted::keys($value); + foreach ($keys as $key) + $object->$key = Flatted::relate($known, $input, $value->$key); + return $object; + } + return $value; + } + + private static function wrap($value) { + if (is_string($value)) { + return new FlattedString($value); + } + if (is_array($value)) { + return array_map('Flatted::wrap', $value); + } + if (is_object($value)) { + $keys = Flatted::keys($value); + foreach ($keys as $key) { + $value->$key = self::wrap($value->$key); + } + } + return $value; + } +} +?> \ No newline at end of file diff --git a/node_modules/flatted/python/flatted.py b/node_modules/flatted/python/flatted.py new file mode 100644 index 0000000..261fd4a --- /dev/null +++ b/node_modules/flatted/python/flatted.py @@ -0,0 +1,144 @@ +# ISC License +# +# Copyright (c) 2018-2025, Andrea Giammarchi, @WebReflection +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +# 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. + +import json as _json + +class _Known: + def __init__(self): + self.key = [] + self.value = [] + +class _String: + def __init__(self, value): + self.value = value + +def _array_keys(value): + for i in range(len(value)): + yield i + +def _object_keys(value): + for key in value: + yield key + +def _is_array(value): + return isinstance(value, (list, tuple)) + +def _is_object(value): + return isinstance(value, dict) + +def _is_string(value): + return isinstance(value, str) + +def _index(known, input, value): + input.append(value) + index = str(len(input) - 1) + known.key.append(value) + known.value.append(index) + return index + +def _relate(known, input, value): + if _is_string(value) or _is_array(value) or _is_object(value): + try: + return known.value[known.key.index(value)] + except: + return _index(known, input, value) + + return value + +def _resolver(input, lazy, parsed): + def resolver(output): + keys = _array_keys(output) if _is_array(output) else _object_keys(output) if _is_object(output) else [] + for key in keys: + value = output[key] + if isinstance(value, _String): + tmp = input[int(value.value)] + output[key] = tmp + if (_is_array(tmp) or _is_object(tmp)) and tmp not in parsed: + parsed.append(tmp) + lazy.append([output, key]) + + return output + + return resolver + +def _transform(known, input, value): + if _is_array(value): + output = [] + for val in value: + output.append(_relate(known, input, val)) + return output + + if _is_object(value): + obj = {} + for key in value: + obj[key] = _relate(known, input, value[key]) + return obj + + return value + +def _wrap(value): + if _is_string(value): + return _String(value) + + if _is_array(value): + i = 0 + for val in value: + value[i] = _wrap(val) + i += 1 + + elif _is_object(value): + for key in value: + value[key] = _wrap(value[key]) + + return value + +def parse(value, *args, **kwargs): + json = _json.loads(value, *args, **kwargs) + wrapped = [] + for value in json: + wrapped.append(_wrap(value)) + + input = [] + for value in wrapped: + if isinstance(value, _String): + input.append(value.value) + else: + input.append(value) + + value = input[0] + lazy = [] + revive = _resolver(input, lazy, [value]) + + value = revive(value) + + i = 0 + while i < len(lazy): + o, k = lazy[i] + i += 1 + o[k] = revive(o[k]) + + return value + + +def stringify(value, *args, **kwargs): + known = _Known() + input = [] + output = [] + i = int(_index(known, input, value)) + while i < len(input): + output.append(_transform(known, input, input[i])) + i += 1 + return _json.dumps(output, *args, **kwargs) diff --git a/node_modules/flatted/types/index.d.ts b/node_modules/flatted/types/index.d.ts new file mode 100644 index 0000000..75dac33 --- /dev/null +++ b/node_modules/flatted/types/index.d.ts @@ -0,0 +1,4 @@ +export function parse(text: string, reviver?: (this: any, key: string, value: any) => any): any; +export function stringify(value: any, replacer?: (string | number)[] | ((this: any, key: string, value: any) => any), space?: string | number | undefined): string; +export function toJSON(value: any): any; +export function fromJSON(value: any): any; diff --git a/node_modules/fresh/HISTORY.md b/node_modules/fresh/HISTORY.md new file mode 100644 index 0000000..fd3888a --- /dev/null +++ b/node_modules/fresh/HISTORY.md @@ -0,0 +1,80 @@ +2.0.0 - 2024-09-04 +========== + * Drop support for Node.js <18 + +1.0.0 - 2024-09-04 +========== + + * Drop support for Node.js below 0.8 + * Fix: Ignore `If-Modified-Since` in the presence of `If-None-Match`, according to [spec](https://www.rfc-editor.org/rfc/rfc9110.html#section-13.1.3-5). Fixes [#35](https://github.com/jshttp/fresh/issues/35) + +0.5.2 / 2017-09-13 +================== + + * Fix regression matching multiple ETags in `If-None-Match` + * perf: improve `If-None-Match` token parsing + +0.5.1 / 2017-09-11 +================== + + * Fix handling of modified headers with invalid dates + * perf: improve ETag match loop + +0.5.0 / 2017-02-21 +================== + + * Fix incorrect result when `If-None-Match` has both `*` and ETags + * Fix weak `ETag` matching to match spec + * perf: delay reading header values until needed + * perf: skip checking modified time if ETag check failed + * perf: skip parsing `If-None-Match` when no `ETag` header + * perf: use `Date.parse` instead of `new Date` + +0.4.0 / 2017-02-05 +================== + + * Fix false detection of `no-cache` request directive + * perf: enable strict mode + * perf: hoist regular expressions + * perf: remove duplicate conditional + * perf: remove unnecessary boolean coercions + +0.3.0 / 2015-05-12 +================== + + * Add weak `ETag` matching support + +0.2.4 / 2014-09-07 +================== + + * Support Node.js 0.6 + +0.2.3 / 2014-09-07 +================== + + * Move repository to jshttp + +0.2.2 / 2014-02-19 +================== + + * Revert "Fix for blank page on Safari reload" + +0.2.1 / 2014-01-29 +================== + + * Fix for blank page on Safari reload + +0.2.0 / 2013-08-11 +================== + + * Return stale for `Cache-Control: no-cache` + +0.1.0 / 2012-06-15 +================== + + * Add `If-None-Match: *` support + +0.0.1 / 2012-06-10 +================== + + * Initial release diff --git a/node_modules/fresh/LICENSE b/node_modules/fresh/LICENSE new file mode 100644 index 0000000..1434ade --- /dev/null +++ b/node_modules/fresh/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson + +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/fresh/README.md b/node_modules/fresh/README.md new file mode 100644 index 0000000..fd79c5b --- /dev/null +++ b/node_modules/fresh/README.md @@ -0,0 +1,117 @@ +# fresh + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +HTTP response freshness testing + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +``` +$ npm install fresh +``` + +## API + +```js +var fresh = require('fresh') +``` + +### fresh(reqHeaders, resHeaders) + +Check freshness of the response using request and response headers. + +When the response is still "fresh" in the client's cache `true` is +returned, otherwise `false` is returned to indicate that the client +cache is now stale and the full response should be sent. + +When a client sends the `Cache-Control: no-cache` request header to +indicate an end-to-end reload request, this module will return `false` +to make handling these requests transparent. + +## Known Issues + +This module is designed to only follow the HTTP specifications, not +to work-around all kinda of client bugs (especially since this module +typically does not receive enough information to understand what the +client actually is). + +There is a known issue that in certain versions of Safari, Safari +will incorrectly make a request that allows this module to validate +freshness of the resource even when Safari does not have a +representation of the resource in the cache. The module +[jumanji](https://www.npmjs.com/package/jumanji) can be used in +an Express application to work-around this issue and also provides +links to further reading on this Safari bug. + +## Example + +### API usage + + + +```js +var reqHeaders = { 'if-none-match': '"foo"' } +var resHeaders = { etag: '"bar"' } +fresh(reqHeaders, resHeaders) +// => false + +var reqHeaders = { 'if-none-match': '"foo"' } +var resHeaders = { etag: '"foo"' } +fresh(reqHeaders, resHeaders) +// => true +``` + +### Using with Node.js http server + +```js +var fresh = require('fresh') +var http = require('http') + +var server = http.createServer(function (req, res) { + // perform server logic + // ... including adding ETag / Last-Modified response headers + + if (isFresh(req, res)) { + // client has a fresh copy of resource + res.statusCode = 304 + res.end() + return + } + + // send the resource + res.statusCode = 200 + res.end('hello, world!') +}) + +function isFresh (req, res) { + return fresh(req.headers, { + etag: res.getHeader('ETag'), + 'last-modified': res.getHeader('Last-Modified') + }) +} + +server.listen(3000) +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://img.shields.io/github/workflow/status/jshttp/fresh/ci/master?label=ci +[ci-url]: https://github.com/jshttp/fresh/actions/workflows/ci.yml +[npm-image]: https://img.shields.io/npm/v/fresh.svg +[npm-url]: https://npmjs.org/package/fresh +[node-version-image]: https://img.shields.io/node/v/fresh.svg +[node-version-url]: https://nodejs.org/en/ +[coveralls-image]: https://img.shields.io/coveralls/jshttp/fresh/master.svg +[coveralls-url]: https://coveralls.io/r/jshttp/fresh?branch=master +[downloads-image]: https://img.shields.io/npm/dm/fresh.svg +[downloads-url]: https://npmjs.org/package/fresh diff --git a/node_modules/fresh/index.js b/node_modules/fresh/index.js new file mode 100644 index 0000000..fc3dea7 --- /dev/null +++ b/node_modules/fresh/index.js @@ -0,0 +1,136 @@ +/*! + * fresh + * Copyright(c) 2012 TJ Holowaychuk + * Copyright(c) 2016-2017 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * RegExp to check for no-cache token in Cache-Control. + * @private + */ + +var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/ + +/** + * Module exports. + * @public + */ + +module.exports = fresh + +/** + * Check freshness of the response using request and response headers. + * + * @param {Object} reqHeaders + * @param {Object} resHeaders + * @return {Boolean} + * @public + */ + +function fresh (reqHeaders, resHeaders) { + // fields + var modifiedSince = reqHeaders['if-modified-since'] + var noneMatch = reqHeaders['if-none-match'] + + // unconditional request + if (!modifiedSince && !noneMatch) { + return false + } + + // Always return stale when Cache-Control: no-cache + // to support end-to-end reload requests + // https://tools.ietf.org/html/rfc2616#section-14.9.4 + var cacheControl = reqHeaders['cache-control'] + if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) { + return false + } + + // if-none-match takes precedent over if-modified-since + if (noneMatch) { + if (noneMatch === '*') { + return true + } + var etag = resHeaders.etag + + if (!etag) { + return false + } + + var matches = parseTokenList(noneMatch) + for (var i = 0; i < matches.length; i++) { + var match = matches[i] + if (match === etag || match === 'W/' + etag || 'W/' + match === etag) { + return true + } + } + + return false + } + + // if-modified-since + if (modifiedSince) { + var lastModified = resHeaders['last-modified'] + var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince)) + + if (modifiedStale) { + return false + } + } + + return true +} + +/** + * Parse an HTTP Date into a number. + * + * @param {string} date + * @private + */ + +function parseHttpDate (date) { + var timestamp = date && Date.parse(date) + + // istanbul ignore next: guard against date.js Date.parse patching + return typeof timestamp === 'number' + ? timestamp + : NaN +} + +/** + * Parse a HTTP token list. + * + * @param {string} str + * @private + */ + +function parseTokenList (str) { + var end = 0 + var list = [] + var start = 0 + + // gather tokens + for (var i = 0, len = str.length; i < len; i++) { + switch (str.charCodeAt(i)) { + case 0x20: /* */ + if (start === end) { + start = end = i + 1 + } + break + case 0x2c: /* , */ + list.push(str.substring(start, end)) + start = end = i + 1 + break + default: + end = i + 1 + break + } + } + + // final token + list.push(str.substring(start, end)) + + return list +} diff --git a/node_modules/fresh/package.json b/node_modules/fresh/package.json new file mode 100644 index 0000000..5d7e215 --- /dev/null +++ b/node_modules/fresh/package.json @@ -0,0 +1,46 @@ +{ + "name": "fresh", + "description": "HTTP response freshness testing", + "version": "2.0.0", + "author": "TJ Holowaychuk (http://tjholowaychuk.com)", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "license": "MIT", + "keywords": [ + "fresh", + "http", + "conditional", + "cache" + ], + "repository": "jshttp/fresh", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "8.12.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.25.4", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "6.0.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.2.0", + "nyc": "15.1.0" + }, + "files": [ + "HISTORY.md", + "LICENSE", + "index.js" + ], + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/node_modules/glob-parent/CHANGELOG.md b/node_modules/glob-parent/CHANGELOG.md new file mode 100644 index 0000000..fb9de96 --- /dev/null +++ b/node_modules/glob-parent/CHANGELOG.md @@ -0,0 +1,110 @@ +### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06) + + +### Bug Fixes + +* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366)) + +### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27) + + +### Bug Fixes + +* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb)) + +## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27) + + +### Features + +* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3)) + +## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27) + + +### ⚠ BREAKING CHANGES + +* Drop support for node <6 & bump dependencies + +### Miscellaneous Chores + +* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a)) + +## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27) + + +### ⚠ BREAKING CHANGES + +* question marks are valid path characters on Windows so avoid flagging as a glob when alone +* Update is-glob dependency + +### Features + +* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e)) +* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841)) +* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281)) + +## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27) + + +### Features + +* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b)) +* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd)) +* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be)) +* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388)) +* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76)) + + +### Bug Fixes + +* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf)) + +### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27) + + +### Features + +* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc)) + + +### Bug Fixes + +* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030)) + +## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27) + + +### ⚠ BREAKING CHANGES + +* update is-glob dependency + +### Features + +* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd)) + +## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27) + + +### Features + +* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2)) + +## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27) + +## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27) + + +### Reverts + +* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0)) + +## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27) + + +### Features + +* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233)) + +## 1.0.0 (2021-01-27) + diff --git a/node_modules/glob-parent/LICENSE b/node_modules/glob-parent/LICENSE new file mode 100644 index 0000000..63222d7 --- /dev/null +++ b/node_modules/glob-parent/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2015, 2019 Elan Shanker + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, 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/glob-parent/README.md b/node_modules/glob-parent/README.md new file mode 100644 index 0000000..36a2793 --- /dev/null +++ b/node_modules/glob-parent/README.md @@ -0,0 +1,137 @@ +

    + + + +

    + +# glob-parent + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Extract the non-magic parent path from a glob string. + +## Usage + +```js +var globParent = require('glob-parent'); + +globParent('path/to/*.js'); // 'path/to' +globParent('/root/path/to/*.js'); // '/root/path/to' +globParent('/*.js'); // '/' +globParent('*.js'); // '.' +globParent('**/*.js'); // '.' +globParent('path/{to,from}'); // 'path' +globParent('path/!(to|from)'); // 'path' +globParent('path/?(to|from)'); // 'path' +globParent('path/+(to|from)'); // 'path' +globParent('path/*(to|from)'); // 'path' +globParent('path/@(to|from)'); // 'path' +globParent('path/**/*'); // 'path' + +// if provided a non-glob path, returns the nearest dir +globParent('path/foo/bar.js'); // 'path/foo' +globParent('path/foo/'); // 'path/foo' +globParent('path/foo'); // 'path' (see issue #3 for details) +``` + +## API + +### `globParent(maybeGlobString, [options])` + +Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below. + +#### options + +```js +{ + // Disables the automatic conversion of slashes for Windows + flipBackslashes: true +} +``` + +## Escaping + +The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters: + +- `?` (question mark) unless used as a path segment alone +- `*` (asterisk) +- `|` (pipe) +- `(` (opening parenthesis) +- `)` (closing parenthesis) +- `{` (opening curly brace) +- `}` (closing curly brace) +- `[` (opening bracket) +- `]` (closing bracket) + +**Example** + +```js +globParent('foo/[bar]/') // 'foo' +globParent('foo/\\[bar]/') // 'foo/[bar]' +``` + +## Limitations + +### Braces & Brackets +This library attempts a quick and imperfect method of determining which path +parts have glob magic without fully parsing/lexing the pattern. There are some +advanced use cases that can trip it up, such as nested braces where the outer +pair is escaped and the inner one contains a path separator. If you find +yourself in the unlikely circumstance of being affected by this or need to +ensure higher-fidelity glob handling in your library, it is recommended that you +pre-process your input with [expand-braces] and/or [expand-brackets]. + +### Windows +Backslashes are not valid path separators for globs. If a path with backslashes +is provided anyway, for simple cases, glob-parent will replace the path +separator for you and return the non-glob parent path (now with +forward-slashes, which are still valid as Windows path separators). + +This cannot be used in conjunction with escape characters. + +```js +// BAD +globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)' + +// GOOD +globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)' +``` + +If you are using escape characters for a pattern without path parts (i.e. +relative to `cwd`), prefix with `./` to avoid confusing glob-parent. + +```js +// BAD +globParent('foo \\[bar]') // 'foo ' +globParent('foo \\[bar]*') // 'foo ' + +// GOOD +globParent('./foo \\[bar]') // 'foo [bar]' +globParent('./foo \\[bar]*') // '.' +``` + +## License + +ISC + +[expand-braces]: https://github.com/jonschlinkert/expand-braces +[expand-brackets]: https://github.com/jonschlinkert/expand-brackets + +[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg +[npm-url]: https://www.npmjs.com/package/glob-parent +[npm-image]: https://img.shields.io/npm/v/glob-parent.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/glob-parent +[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent +[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/glob-parent/index.js b/node_modules/glob-parent/index.js new file mode 100644 index 0000000..09e257e --- /dev/null +++ b/node_modules/glob-parent/index.js @@ -0,0 +1,42 @@ +'use strict'; + +var isGlob = require('is-glob'); +var pathPosixDirname = require('path').posix.dirname; +var isWin32 = require('os').platform() === 'win32'; + +var slash = '/'; +var backslash = /\\/g; +var enclosure = /[\{\[].*[\}\]]$/; +var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; +var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; + +/** + * @param {string} str + * @param {Object} opts + * @param {boolean} [opts.flipBackslashes=true] + * @returns {string} + */ +module.exports = function globParent(str, opts) { + var options = Object.assign({ flipBackslashes: true }, opts); + + // flip windows path separators + if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); + } + + // special case for strings ending in enclosure containing path separator + if (enclosure.test(str)) { + str += slash; + } + + // preserves full path in case of trailing path separator + str += 'a'; + + // remove path parts that are globby + do { + str = pathPosixDirname(str); + } while (isGlob(str) || globby.test(str)); + + // remove escape chars and return result + return str.replace(escaped, '$1'); +}; diff --git a/node_modules/glob-parent/package.json b/node_modules/glob-parent/package.json new file mode 100644 index 0000000..125c971 --- /dev/null +++ b/node_modules/glob-parent/package.json @@ -0,0 +1,48 @@ +{ + "name": "glob-parent", + "version": "5.1.2", + "description": "Extract the non-magic parent path from a glob string.", + "author": "Gulp Team (https://gulpjs.com/)", + "contributors": [ + "Elan Shanker (https://github.com/es128)", + "Blaine Bublitz " + ], + "repository": "gulpjs/glob-parent", + "license": "ISC", + "engines": { + "node": ">= 6" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only", + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "dependencies": { + "is-glob": "^4.0.1" + }, + "devDependencies": { + "coveralls": "^3.0.11", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mocha": "^6.0.2", + "nyc": "^13.3.0" + }, + "keywords": [ + "glob", + "parent", + "strip", + "path", + "dirname", + "directory", + "base", + "wildcard" + ] +} diff --git a/node_modules/gray-matter/CHANGELOG.md b/node_modules/gray-matter/CHANGELOG.md new file mode 100644 index 0000000..eebdf42 --- /dev/null +++ b/node_modules/gray-matter/CHANGELOG.md @@ -0,0 +1,24 @@ +# Release history + +## 4.0.0 - 2018-04-01 + +### Breaking changes + +- Now requires node v4 or higher. + + +## 3.0.0 - 2017-06-30 + +### Breaking changes + +- `toml`, `coffee` and `cson` are no longer supported by default. Please see [`options.engines`](README.md#optionsengines) and the [examples](./examples) to learn how to add engines. + +### Added + +- Support for [excerpts](README.md#optionsexcerpt). +- The returned object now has non-enumerable `matter` and `stringify` properties. + +### Changed + +- Refactored engines (parsers), so that it's easier to add parsers and stringifiers. +- `options.parsers` was renamed to [`options.engines`](README.md#optionsengines) diff --git a/node_modules/gray-matter/LICENSE b/node_modules/gray-matter/LICENSE new file mode 100644 index 0000000..d32ab44 --- /dev/null +++ b/node_modules/gray-matter/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018, 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/gray-matter/README.md b/node_modules/gray-matter/README.md new file mode 100644 index 0000000..d5d1e0a --- /dev/null +++ b/node_modules/gray-matter/README.md @@ -0,0 +1,565 @@ +# gray-matter [![NPM version](https://img.shields.io/npm/v/gray-matter.svg?style=flat)](https://www.npmjs.com/package/gray-matter) [![NPM monthly downloads](https://img.shields.io/npm/dm/gray-matter.svg?style=flat)](https://npmjs.org/package/gray-matter) [![NPM total downloads](https://img.shields.io/npm/dt/gray-matter.svg?style=flat)](https://npmjs.org/package/gray-matter) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/gray-matter.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/gray-matter) + +> Parse front-matter from a string or file. Fast, reliable and easy to use. Parses YAML front matter by default, but also has support for YAML, JSON, TOML or Coffee Front-Matter, with options to set custom delimiters. Used by metalsmith, assemble, verb and many other projects. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save gray-matter +``` + +## Heads up! + +Please see the [changelog](CHANGELOG.md) to learn about breaking changes that were made in v3.0. + +## What does this do? + +
    +Run this example + +Add the HTML in the following example to `example.html`, then add the following code to `example.js` and run `$ node example` (without the `$`): + +```js +const fs = require('fs'); +const matter = require('gray-matter'); +const str = fs.readFileSync('example.html', 'utf8'); +console.log(matter(str)); +``` + +
    + +Converts a string with front-matter, like this: + +```handlebars +--- +title: Hello +slug: home +--- +

    Hello world!

    +``` + +Into an object like this: + +```js +{ + content: '

    Hello world!

    ', + data: { + title: 'Hello', + slug: 'home' + } +} +``` + +## Why use gray-matter? + +* **simple**: main function takes a string and returns an object +* **accurate**: better at catching and handling edge cases than front-matter parsers that rely on regex for parsing +* **fast**: faster than other front-matter parsers that use regex for parsing +* **flexible**: By default, gray-matter is capable of parsing [YAML](https://github.com/nodeca/js-yaml), [JSON](http://en.wikipedia.org/wiki/Json) and JavaScript front-matter. But other [engines](#optionsengines) may be added. +* **extensible**: Use [custom delimiters](#optionsdelimiters), or add support for [any language](#optionsengines), like [TOML](http://github.com/mojombo/toml), [CoffeeScript](http://coffeescript.org), or [CSON](https://github.com/bevry/cson) +* **battle-tested**: used by [assemble](https://github.com/assemble/assemble), [metalsmith](https://github.com/segmentio/metalsmith), [phenomic](https://github.com/phenomic/phenomic), [verb](https://github.com/assemble/verb), [generate](https://github.com/generate/generate), [update](https://github.com/update/update) and many others. + +
    +Rationale + +**Why did we create gray-matter in the first place?** + +We created gray-matter after trying out other libraries that failed to meet our standards and requirements. + +Some libraries met most of the requirements, but _none met all of them_. + +**Here are the most important**: + +* Be usable, if not simple +* Use a dependable and well-supported library for parsing YAML +* Support other languages besides YAML +* Support stringifying back to YAML or another language +* Don't fail when no content exists +* Don't fail when no front matter exists +* Don't use regex for parsing. This is a relatively simple parsing operation, and regex is the slowest and most error-prone way to do it. +* Have no problem reading YAML files directly +* Have no problem with complex content, including **non-front-matter** fenced code blocks that contain examples of YAML front matter. Other parsers fail on this. +* Support stringifying back to front-matter. This is useful for linting, updating properties, etc. +* Allow custom delimiters, when it's necessary for avoiding delimiter collision. +* Should return an object with at least these three properties: + - `data`: the parsed YAML front matter, as a JSON object + - `content`: the contents as a string, without the front matter + - `orig`: the "original" content (for debugging) + +
    + +## Usage + +Using Node's `require()` system: + +```js +const matter = require('gray-matter'); +``` + +Or with [typescript](https://www.typescriptlang.org) + +```js +import matter = require('gray-matter'); +// OR +import * as matter from 'gray-matter'; +``` + +Pass a string and [options](#options) to gray-matter: + +```js +console.log(matter('---\ntitle: Front Matter\n---\nThis is content.')); +``` + +Returns: + +```js +{ + content: '\nThis is content.', + data: { + title: 'Front Matter' + } +} +``` + +More about the returned object in the following section. + +*** + +## Returned object + +gray-matter returns a `file` object with the following properties. + +**Enumerable** + +* `file.data` **{Object}**: the object created by parsing front-matter +* `file.content` **{String}**: the input string, with `matter` stripped +* `file.excerpt` **{String}**: an excerpt, if [defined on the options](#optionsexcerpt) +* `file.empty` **{String}**: when the front-matter is "empty" (either all whitespace, nothing at all, or just comments and no data), the original string is set on this property. See [#65](https://github.com/jonschlinkert/gray-matter/issues/65) for details regarding use case. +* `file.isEmpty` **{Boolean}**: true if front-matter is empty. + +**Non-enumerable** + +In addition, the following non-enumberable properties are added to the object to help with debugging. + +* `file.orig` **{Buffer}**: the original input string (or buffer) +* `file.language` **{String}**: the front-matter language that was parsed. `yaml` is the default +* `file.matter` **{String}**: the _raw_, un-parsed front-matter string +* `file.stringify` **{Function}**: [stringify](#stringify) the file by converting `file.data` to a string in the given language, wrapping it in delimiters and prepending it to `file.content`. + +## Run the examples + +If you'd like to test-drive the examples, first clone gray-matter into `my-project` (or wherever you want): + +```sh +$ git clone https://github.com/jonschlinkert/gray-matter my-project +``` + +CD into `my-project` and install dependencies: + +```sh +$ cd my-project && npm install +``` + +Then run any of the [examples](./examples) to see how gray-matter works: + +```sh +$ node examples/ +``` + +**Links to examples** + +* [coffee](examples/coffee.js) +* [excerpt-separator](examples/excerpt-separator.js) +* [excerpt-stringify](examples/excerpt-stringify.js) +* [excerpt](examples/excerpt.js) +* [javascript](examples/javascript.js) +* [json-stringify](examples/json-stringify.js) +* [json](examples/json.js) +* [restore-empty](examples/restore-empty.js) +* [sections-excerpt](examples/sections-excerpt.js) +* [sections](examples/sections.js) +* [toml](examples/toml.js) +* [yaml-stringify](examples/yaml-stringify.js) +* [yaml](examples/yaml.js) + +## API + +### [matter](index.js#L29) + +Takes a string or object with `content` property, extracts and parses front-matter from the string, then returns an object with `data`, `content` and other [useful properties](#returned-object). + +**Params** + +* `input` **{Object|String}**: String, or object with `content` string +* `options` **{Object}** +* `returns` **{Object}** + +**Example** + +```js +const matter = require('gray-matter'); +console.log(matter('---\ntitle: Home\n---\nOther stuff')); +//=> { data: { title: 'Home'}, content: 'Other stuff' } +``` + +### [.stringify](index.js#L160) + +Stringify an object to YAML or the specified language, and append it to the given string. By default, only YAML and JSON can be stringified. See the [engines](#engines) section to learn how to stringify other languages. + +**Params** + +* `file` **{String|Object}**: The content string to append to stringified front-matter, or a file object with `file.content` string. +* `data` **{Object}**: Front matter to stringify. +* `options` **{Object}**: [Options](#options) to pass to gray-matter and [js-yaml](https://github.com/nodeca/js-yaml). +* `returns` **{String}**: Returns a string created by wrapping stringified yaml with delimiters, and appending that to the given string. + +**Example** + +```js +console.log(matter.stringify('foo bar baz', {title: 'Home'})); +// results in: +// --- +// title: Home +// --- +// foo bar baz +``` + +### [.read](index.js#L178) + +Synchronously read a file from the file system and parse front matter. Returns the same object as the [main function](#matter). + +**Params** + +* `filepath` **{String}**: file path of the file to read. +* `options` **{Object}**: [Options](#options) to pass to gray-matter. +* `returns` **{Object}**: Returns [an object](#returned-object) with `data` and `content` + +**Example** + +```js +const file = matter.read('./content/blog-post.md'); +``` + +### [.test](index.js#L193) + +Returns true if the given `string` has front matter. + +**Params** + +* `string` **{String}** +* `options` **{Object}** +* `returns` **{Boolean}**: True if front matter exists. + +## Options + +### options.excerpt + +**Type**: `Boolean|Function` + +**Default**: `undefined` + +Extract an excerpt that directly follows front-matter, or is the first thing in the string if no front-matter exists. + +If set to `excerpt: true`, it will look for the frontmatter delimiter, `---` by default and grab everything leading up to it. + +**Example** + +```js +const str = '---\nfoo: bar\n---\nThis is an excerpt.\n---\nThis is content'; +const file = matter(str, { excerpt: true }); +``` + +Results in: + +```js +{ + content: 'This is an excerpt.\n---\nThis is content', + data: { foo: 'bar' }, + excerpt: 'This is an excerpt.\n' +} +``` + +You can also set `excerpt` to a function. This function uses the 'file' and 'options' that were initially passed to gray-matter as parameters, so you can control how the excerpt is extracted from the content. + +**Example** + +```js +// returns the first 4 lines of the contents +function firstFourLines(file, options) { + file.excerpt = file.content.split('\n').slice(0, 4).join(' '); +} + +const file = matter([ + '---', + 'foo: bar', + '---', + 'Only this', + 'will be', + 'in the', + 'excerpt', + 'but not this...' +].join('\n'), {excerpt: firstFourLines}); +``` + +Results in: + +```js +{ + content: 'Only this\nwill be\nin the\nexcerpt\nbut not this...', + data: { foo: 'bar' }, + excerpt: 'Only this will be in the excerpt' +} +``` + +### options.excerpt_separator + +**Type**: `String` + +**Default**: `undefined` + +Define a custom separator to use for excerpts. + +```js +console.log(matter(string, {excerpt_separator: ''})); +``` + +**Example** + +The following HTML string: + +```html +--- +title: Blog +--- +My awesome blog. + +

    Hello world

    +``` + +Results in: + +```js +{ + data: { title: 'Blog'}, + excerpt: 'My awesome blog.', + content: 'My awesome blog.\n\n

    Hello world

    ' +} +``` + +### options.engines + +Define custom engines for parsing and/or stringifying front-matter. + +**Type**: `Object` Object of engines + +**Default**: `JSON`, `YAML` and `JavaScript` are already handled by default. + +**Engine format** + +Engines may either be an object with `parse` and (optionally) `stringify` methods, or a function that will be used for parsing only. + +**Examples** + +```js +const toml = require('toml'); + +/** + * defined as a function + */ + +const file = matter(str, { + engines: { + toml: toml.parse.bind(toml), + } +}); + +/** + * Or as an object + */ + +const file = matter(str, { + engines: { + toml: { + parse: toml.parse.bind(toml), + + // example of throwing an error to let users know stringifying is + // not supported (a TOML stringifier might exist, this is just an example) + stringify: function() { + throw new Error('cannot stringify to TOML'); + } + } + } +}); + +console.log(file); +``` + +### options.language + +**Type**: `String` + +**Default**: `yaml` + +Define the engine to use for parsing front-matter. + +```js +console.log(matter(string, {language: 'toml'})); +``` + +**Example** + +The following HTML string: + +```html +--- +title = "TOML" +description = "Front matter" +categories = "front matter toml" +--- +This is content +``` + +Results in: + +```js +{ content: 'This is content', + excerpt: '', + data: + { title: 'TOML', + description: 'Front matter', + categories: 'front matter toml' } } +``` + +**Dynamic language detection** + +Instead of defining the language on the options, gray-matter will automatically detect the language defined after the first delimiter and select the correct engine to use for parsing. + +```html +---toml +title = "TOML" +description = "Front matter" +categories = "front matter toml" +--- +This is content +``` + +### options.delimiters + +**Type**: `String` + +**Default**: `---` + +Open and close delimiters can be passed in as an array of strings. + +**Example:** + +```js +// format delims as a string +matter.read('file.md', {delims: '~~~'}); +// or an array (open/close) +matter.read('file.md', {delims: ['~~~', '~~~']}); +``` + +would parse: + +```html +~~~ +title: Home +~~~ +This is the {{title}} page. +``` + +## Deprecated options + +### options.lang + +Decrecated, please use [options.language](#optionslanguage) instead. + +### options.delims + +Decrecated, please use [options.delimiters](#optionsdelimiters) instead. + +### options.parsers + +Decrecated, please use [options.engines](#optionsengines) instead. + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +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 +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit") +* [metalsmith](https://www.npmjs.com/package/metalsmith): An extremely simple, pluggable static site generator. | [homepage](https://github.com/segmentio/metalsmith#readme "An extremely simple, pluggable static site generator.") +* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.") +* [gray-matter-loader](https://github.com/atlassian/gray-matter-loader): A webpack loader for gray-matter. [homepage](https://github.com/atlassian/gray-matter-loader#gray-matter-loader) + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 174 | [jonschlinkert](https://github.com/jonschlinkert) | +| 7 | [RobLoach](https://github.com/RobLoach) | +| 5 | [heymind](https://github.com/heymind) | +| 4 | [doowb](https://github.com/doowb) | +| 3 | [aljopro](https://github.com/aljopro) | +| 2 | [reccanti](https://github.com/reccanti) | +| 2 | [onokumus](https://github.com/onokumus) | +| 2 | [moozzyk](https://github.com/moozzyk) | +| 1 | [Ajedi32](https://github.com/Ajedi32) | +| 1 | [caesar](https://github.com/caesar) | +| 1 | [ianstormtaylor](https://github.com/ianstormtaylor) | +| 1 | [qm3ster](https://github.com/qm3ster) | +| 1 | [zachwhaley](https://github.com/zachwhaley) | + +### Author + +**Jon Schlinkert** + +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 01, 2018._ \ No newline at end of file diff --git a/node_modules/gray-matter/gray-matter.d.ts b/node_modules/gray-matter/gray-matter.d.ts new file mode 100644 index 0000000..dec9c09 --- /dev/null +++ b/node_modules/gray-matter/gray-matter.d.ts @@ -0,0 +1,114 @@ +/** + * Takes a string or object with `content` property, extracts + * and parses front-matter from the string, then returns an object + * with `data`, `content` and other [useful properties](#returned-object). + * + * ```js + * var matter = require('gray-matter'); + * console.log(matter('---\ntitle: Home\n---\nOther stuff')); + * //=> { data: { title: 'Home'}, content: 'Other stuff' } + * ``` + * @param {Object|String} `input` String, or object with `content` string + * @param {Object} `options` + * @return {Object} + * @api public + */ +declare function matter< + I extends matter.Input, + O extends matter.GrayMatterOption +>(input: I | { content: I }, options?: O): matter.GrayMatterFile + +declare namespace matter { + type Input = string | Buffer + interface GrayMatterOption< + I extends Input, + O extends GrayMatterOption + > { + parser?: () => void + eval?: boolean + excerpt?: boolean | ((input: I, options: O) => string) + excerpt_separator?: string + engines?: { + [index: string]: + | ((input: string) => object) + | { parse: (input: string) => object; stringify?: (data: object) => string } + } + language?: string + delimiters?: string | [string, string] + } + interface GrayMatterFile { + data: { [key: string]: any } + content: string + excerpt?: string + orig: Buffer | I + language: string + matter: string + stringify(lang: string): string + } + + /** + * Stringify an object to YAML or the specified language, and + * append it to the given string. By default, only YAML and JSON + * can be stringified. See the [engines](#engines) section to learn + * how to stringify other languages. + * + * ```js + * console.log(matter.stringify('foo bar baz', {title: 'Home'})); + * // results in: + * // --- + * // title: Home + * // --- + * // foo bar baz + * ``` + * @param {String|Object} `file` The content string to append to stringified front-matter, or a file object with `file.content` string. + * @param {Object} `data` Front matter to stringify. + * @param {Object} `options` [Options](#options) to pass to gray-matter and [js-yaml]. + * @return {String} Returns a string created by wrapping stringified yaml with delimiters, and appending that to the given string. + */ + export function stringify>( + file: string | { content: string }, + data: object, + options?: GrayMatterOption + ): string + + /** + * Synchronously read a file from the file system and parse + * front matter. Returns the same object as the [main function](#matter). + * + * ```js + * var file = matter.read('./content/blog-post.md'); + * ``` + * @param {String} `filepath` file path of the file to read. + * @param {Object} `options` [Options](#options) to pass to gray-matter. + * @return {Object} Returns [an object](#returned-object) with `data` and `content` + */ + export function read>( + fp: string, + options?: GrayMatterOption + ): matter.GrayMatterFile + + /** + * Returns true if the given `string` has front matter. + * @param {String} `string` + * @param {Object} `options` + * @return {Boolean} True if front matter exists. + */ + export function test>( + str: string, + options?: GrayMatterOption + ): boolean + + /** + * Detect the language to use, if one is defined after the + * first front-matter delimiter. + * @param {String} `string` + * @param {Object} `options` + * @return {Object} Object with `raw` (actual language string), and `name`, the language with whitespace trimmed + */ + export function language>( + str: string, + options?: GrayMatterOption + ): { name: string; raw: string } +} + +export = matter diff --git a/node_modules/gray-matter/index.js b/node_modules/gray-matter/index.js new file mode 100644 index 0000000..7d49331 --- /dev/null +++ b/node_modules/gray-matter/index.js @@ -0,0 +1,228 @@ +'use strict'; + +const fs = require('fs'); +const sections = require('section-matter'); +const defaults = require('./lib/defaults'); +const stringify = require('./lib/stringify'); +const excerpt = require('./lib/excerpt'); +const engines = require('./lib/engines'); +const toFile = require('./lib/to-file'); +const parse = require('./lib/parse'); +const utils = require('./lib/utils'); + +/** + * Takes a string or object with `content` property, extracts + * and parses front-matter from the string, then returns an object + * with `data`, `content` and other [useful properties](#returned-object). + * + * ```js + * const matter = require('gray-matter'); + * console.log(matter('---\ntitle: Home\n---\nOther stuff')); + * //=> { data: { title: 'Home'}, content: 'Other stuff' } + * ``` + * @param {Object|String} `input` String, or object with `content` string + * @param {Object} `options` + * @return {Object} + * @api public + */ + +function matter(input, options) { + if (input === '') { + return { data: {}, content: input, excerpt: '', orig: input }; + } + + let file = toFile(input); + const cached = matter.cache[file.content]; + + if (!options) { + if (cached) { + file = Object.assign({}, cached); + file.orig = cached.orig; + return file; + } + + // only cache if there are no options passed. if we cache when options + // are passed, we would need to also cache options values, which would + // negate any performance benefits of caching + matter.cache[file.content] = file; + } + + return parseMatter(file, options); +} + +/** + * Parse front matter + */ + +function parseMatter(file, options) { + const opts = defaults(options); + const open = opts.delimiters[0]; + const close = '\n' + opts.delimiters[1]; + let str = file.content; + + if (opts.language) { + file.language = opts.language; + } + + // get the length of the opening delimiter + const openLen = open.length; + if (!utils.startsWith(str, open, openLen)) { + excerpt(file, opts); + return file; + } + + // if the next character after the opening delimiter is + // a character from the delimiter, then it's not a front- + // matter delimiter + if (str.charAt(openLen) === open.slice(-1)) { + return file; + } + + // strip the opening delimiter + str = str.slice(openLen); + const len = str.length; + + // use the language defined after first delimiter, if it exists + const language = matter.language(str, opts); + if (language.name) { + file.language = language.name; + str = str.slice(language.raw.length); + } + + // get the index of the closing delimiter + let closeIndex = str.indexOf(close); + if (closeIndex === -1) { + closeIndex = len; + } + + // get the raw front-matter block + file.matter = str.slice(0, closeIndex); + + const block = file.matter.replace(/^\s*#[^\n]+/gm, '').trim(); + if (block === '') { + file.isEmpty = true; + file.empty = file.content; + file.data = {}; + } else { + + // create file.data by parsing the raw file.matter block + file.data = parse(file.language, file.matter, opts); + } + + // update file.content + if (closeIndex === len) { + file.content = ''; + } else { + file.content = str.slice(closeIndex + close.length); + if (file.content[0] === '\r') { + file.content = file.content.slice(1); + } + if (file.content[0] === '\n') { + file.content = file.content.slice(1); + } + } + + excerpt(file, opts); + + if (opts.sections === true || typeof opts.section === 'function') { + sections(file, opts.section); + } + return file; +} + +/** + * Expose engines + */ + +matter.engines = engines; + +/** + * Stringify an object to YAML or the specified language, and + * append it to the given string. By default, only YAML and JSON + * can be stringified. See the [engines](#engines) section to learn + * how to stringify other languages. + * + * ```js + * console.log(matter.stringify('foo bar baz', {title: 'Home'})); + * // results in: + * // --- + * // title: Home + * // --- + * // foo bar baz + * ``` + * @param {String|Object} `file` The content string to append to stringified front-matter, or a file object with `file.content` string. + * @param {Object} `data` Front matter to stringify. + * @param {Object} `options` [Options](#options) to pass to gray-matter and [js-yaml]. + * @return {String} Returns a string created by wrapping stringified yaml with delimiters, and appending that to the given string. + * @api public + */ + +matter.stringify = function(file, data, options) { + if (typeof file === 'string') file = matter(file, options); + return stringify(file, data, options); +}; + +/** + * Synchronously read a file from the file system and parse + * front matter. Returns the same object as the [main function](#matter). + * + * ```js + * const file = matter.read('./content/blog-post.md'); + * ``` + * @param {String} `filepath` file path of the file to read. + * @param {Object} `options` [Options](#options) to pass to gray-matter. + * @return {Object} Returns [an object](#returned-object) with `data` and `content` + * @api public + */ + +matter.read = function(filepath, options) { + const str = fs.readFileSync(filepath, 'utf8'); + const file = matter(str, options); + file.path = filepath; + return file; +}; + +/** + * Returns true if the given `string` has front matter. + * @param {String} `string` + * @param {Object} `options` + * @return {Boolean} True if front matter exists. + * @api public + */ + +matter.test = function(str, options) { + return utils.startsWith(str, defaults(options).delimiters[0]); +}; + +/** + * Detect the language to use, if one is defined after the + * first front-matter delimiter. + * @param {String} `string` + * @param {Object} `options` + * @return {Object} Object with `raw` (actual language string), and `name`, the language with whitespace trimmed + */ + +matter.language = function(str, options) { + const opts = defaults(options); + const open = opts.delimiters[0]; + + if (matter.test(str)) { + str = str.slice(open.length); + } + + const language = str.slice(0, str.search(/\r?\n/)); + return { + raw: language, + name: language ? language.trim() : '' + }; +}; + +/** + * Expose `matter` + */ + +matter.cache = {}; +matter.clearCache = function() { + matter.cache = {}; +}; +module.exports = matter; diff --git a/node_modules/gray-matter/lib/defaults.js b/node_modules/gray-matter/lib/defaults.js new file mode 100644 index 0000000..81d9e41 --- /dev/null +++ b/node_modules/gray-matter/lib/defaults.js @@ -0,0 +1,18 @@ +'use strict'; + +const engines = require('./engines'); +const utils = require('./utils'); + +module.exports = function(options) { + const opts = Object.assign({}, options); + + // ensure that delimiters are an array + opts.delimiters = utils.arrayify(opts.delims || opts.delimiters || '---'); + if (opts.delimiters.length === 1) { + opts.delimiters.push(opts.delimiters[0]); + } + + opts.language = (opts.language || opts.lang || 'yaml').toLowerCase(); + opts.engines = Object.assign({}, engines, opts.parsers, opts.engines); + return opts; +}; diff --git a/node_modules/gray-matter/lib/engine.js b/node_modules/gray-matter/lib/engine.js new file mode 100644 index 0000000..d8f6c41 --- /dev/null +++ b/node_modules/gray-matter/lib/engine.js @@ -0,0 +1,30 @@ +'use strict'; + +module.exports = function(name, options) { + let engine = options.engines[name] || options.engines[aliase(name)]; + if (typeof engine === 'undefined') { + throw new Error('gray-matter engine "' + name + '" is not registered'); + } + if (typeof engine === 'function') { + engine = { parse: engine }; + } + return engine; +}; + +function aliase(name) { + switch (name.toLowerCase()) { + case 'js': + case 'javascript': + return 'javascript'; + case 'coffee': + case 'coffeescript': + case 'cson': + return 'coffee'; + case 'yaml': + case 'yml': + return 'yaml'; + default: { + return name; + } + } +} diff --git a/node_modules/gray-matter/lib/engines.js b/node_modules/gray-matter/lib/engines.js new file mode 100644 index 0000000..38f993d --- /dev/null +++ b/node_modules/gray-matter/lib/engines.js @@ -0,0 +1,54 @@ +'use strict'; + +const yaml = require('js-yaml'); + +/** + * Default engines + */ + +const engines = exports = module.exports; + +/** + * YAML + */ + +engines.yaml = { + parse: yaml.safeLoad.bind(yaml), + stringify: yaml.safeDump.bind(yaml) +}; + +/** + * JSON + */ + +engines.json = { + parse: JSON.parse.bind(JSON), + stringify: function(obj, options) { + const opts = Object.assign({replacer: null, space: 2}, options); + return JSON.stringify(obj, opts.replacer, opts.space); + } +}; + +/** + * JavaScript + */ + +engines.javascript = { + parse: function parse(str, options, wrap) { + /* eslint no-eval: 0 */ + try { + if (wrap !== false) { + str = '(function() {\nreturn ' + str.trim() + ';\n}());'; + } + return eval(str) || {}; + } catch (err) { + if (wrap !== false && /(unexpected|identifier)/i.test(err.message)) { + return parse(str, options, false); + } + throw new SyntaxError(err); + } + }, + stringify: function() { + throw new Error('stringifying JavaScript is not supported'); + } +}; diff --git a/node_modules/gray-matter/lib/excerpt.js b/node_modules/gray-matter/lib/excerpt.js new file mode 100644 index 0000000..14d9904 --- /dev/null +++ b/node_modules/gray-matter/lib/excerpt.js @@ -0,0 +1,32 @@ +'use strict'; + +const defaults = require('./defaults'); + +module.exports = function(file, options) { + const opts = defaults(options); + + if (file.data == null) { + file.data = {}; + } + + if (typeof opts.excerpt === 'function') { + return opts.excerpt(file, opts); + } + + const sep = file.data.excerpt_separator || opts.excerpt_separator; + if (sep == null && (opts.excerpt === false || opts.excerpt == null)) { + return file; + } + + const delimiter = typeof opts.excerpt === 'string' + ? opts.excerpt + : (sep || opts.delimiters[0]); + + // if enabled, get the excerpt defined after front-matter + const idx = file.content.indexOf(delimiter); + if (idx !== -1) { + file.excerpt = file.content.slice(0, idx); + } + + return file; +}; diff --git a/node_modules/gray-matter/lib/parse.js b/node_modules/gray-matter/lib/parse.js new file mode 100644 index 0000000..e10ea9b --- /dev/null +++ b/node_modules/gray-matter/lib/parse.js @@ -0,0 +1,13 @@ +'use strict'; + +const getEngine = require('./engine'); +const defaults = require('./defaults'); + +module.exports = function(language, str, options) { + const opts = defaults(options); + const engine = getEngine(language, opts); + if (typeof engine.parse !== 'function') { + throw new TypeError('expected "' + language + '.parse" to be a function'); + } + return engine.parse(str, opts); +}; diff --git a/node_modules/gray-matter/lib/stringify.js b/node_modules/gray-matter/lib/stringify.js new file mode 100644 index 0000000..b4c70a4 --- /dev/null +++ b/node_modules/gray-matter/lib/stringify.js @@ -0,0 +1,56 @@ +'use strict'; + +const typeOf = require('kind-of'); +const getEngine = require('./engine'); +const defaults = require('./defaults'); + +module.exports = function(file, data, options) { + if (data == null && options == null) { + switch (typeOf(file)) { + case 'object': + data = file.data; + options = {}; + break; + case 'string': + return file; + default: { + throw new TypeError('expected file to be a string or object'); + } + } + } + + const str = file.content; + const opts = defaults(options); + if (data == null) { + if (!opts.data) return file; + data = opts.data; + } + + const language = file.language || opts.language; + const engine = getEngine(language, opts); + if (typeof engine.stringify !== 'function') { + throw new TypeError('expected "' + language + '.stringify" to be a function'); + } + + data = Object.assign({}, file.data, data); + const open = opts.delimiters[0]; + const close = opts.delimiters[1]; + const matter = engine.stringify(data, options).trim(); + let buf = ''; + + if (matter !== '{}') { + buf = newline(open) + newline(matter) + newline(close); + } + + if (typeof file.excerpt === 'string' && file.excerpt !== '') { + if (str.indexOf(file.excerpt.trim()) === -1) { + buf += newline(file.excerpt) + newline(close); + } + } + + return buf + newline(str); +}; + +function newline(str) { + return str.slice(-1) !== '\n' ? str + '\n' : str; +} diff --git a/node_modules/gray-matter/lib/to-file.js b/node_modules/gray-matter/lib/to-file.js new file mode 100644 index 0000000..799bb5d --- /dev/null +++ b/node_modules/gray-matter/lib/to-file.js @@ -0,0 +1,43 @@ +'use strict'; + +const typeOf = require('kind-of'); +const stringify = require('./stringify'); +const utils = require('./utils'); + +/** + * Normalize the given value to ensure an object is returned + * with the expected properties. + */ + +module.exports = function(file) { + if (typeOf(file) !== 'object') { + file = { content: file }; + } + + if (typeOf(file.data) !== 'object') { + file.data = {}; + } + + // if file was passed as an object, ensure that + // "file.content" is set + if (file.contents && file.content == null) { + file.content = file.contents; + } + + // set non-enumerable properties on the file object + utils.define(file, 'orig', utils.toBuffer(file.content)); + utils.define(file, 'language', file.language || ''); + utils.define(file, 'matter', file.matter || ''); + utils.define(file, 'stringify', function(data, options) { + if (options && options.language) { + file.language = options.language; + } + return stringify(file, data, options); + }); + + // strip BOM and ensure that "file.content" is a string + file.content = utils.toString(file.content); + file.isEmpty = false; + file.excerpt = ''; + return file; +}; diff --git a/node_modules/gray-matter/lib/utils.js b/node_modules/gray-matter/lib/utils.js new file mode 100644 index 0000000..96e7ce0 --- /dev/null +++ b/node_modules/gray-matter/lib/utils.js @@ -0,0 +1,66 @@ +'use strict'; + +const stripBom = require('strip-bom-string'); +const typeOf = require('kind-of'); + +exports.define = function(obj, key, val) { + Reflect.defineProperty(obj, key, { + enumerable: false, + configurable: true, + writable: true, + value: val + }); +}; + +/** + * Returns true if `val` is a buffer + */ + +exports.isBuffer = function(val) { + return typeOf(val) === 'buffer'; +}; + +/** + * Returns true if `val` is an object + */ + +exports.isObject = function(val) { + return typeOf(val) === 'object'; +}; + +/** + * Cast `input` to a buffer + */ + +exports.toBuffer = function(input) { + return typeof input === 'string' ? Buffer.from(input) : input; +}; + +/** + * Cast `val` to a string. + */ + +exports.toString = function(input) { + if (exports.isBuffer(input)) return stripBom(String(input)); + if (typeof input !== 'string') { + throw new TypeError('expected input to be a string or buffer'); + } + return stripBom(input); +}; + +/** + * Cast `val` to an array. + */ + +exports.arrayify = function(val) { + return val ? (Array.isArray(val) ? val : [val]) : []; +}; + +/** + * Returns true if `str` starts with `substr`. + */ + +exports.startsWith = function(str, substr, len) { + if (typeof len !== 'number') len = substr.length; + return str.slice(0, len) === substr; +}; diff --git a/node_modules/gray-matter/node_modules/.bin/js-yaml b/node_modules/gray-matter/node_modules/.bin/js-yaml new file mode 120000 index 0000000..9dbd010 --- /dev/null +++ b/node_modules/gray-matter/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/gray-matter/node_modules/argparse/CHANGELOG.md b/node_modules/gray-matter/node_modules/argparse/CHANGELOG.md new file mode 100644 index 0000000..a43c628 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/CHANGELOG.md @@ -0,0 +1,185 @@ +1.0.10 / 2018-02-15 +------------------ + +- Use .concat instead of + for arrays, #122. + + +1.0.9 / 2016-09-29 +------------------ + +- Rerelease after 1.0.8 - deps cleanup. + + +1.0.8 / 2016-09-29 +------------------ + +- Maintenance (deps bump, fix node 6.5+ tests, coverage report). + + +1.0.7 / 2016-03-17 +------------------ + +- Teach `addArgument` to accept string arg names. #97, @tomxtobin. + + +1.0.6 / 2016-02-06 +------------------ + +- Maintenance: moved to eslint & updated CS. + + +1.0.5 / 2016-02-05 +------------------ + +- Removed lodash dependency to significantly reduce install size. + Thanks to @mourner. + + +1.0.4 / 2016-01-17 +------------------ + +- Maintenance: lodash update to 4.0.0. + + +1.0.3 / 2015-10-27 +------------------ + +- Fix parse `=` in args: `--examplepath="C:\myfolder\env=x64"`. #84, @CatWithApple. + + +1.0.2 / 2015-03-22 +------------------ + +- Relaxed lodash version dependency. + + +1.0.1 / 2015-02-20 +------------------ + +- Changed dependencies to be compatible with ancient nodejs. + + +1.0.0 / 2015-02-19 +------------------ + +- 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 +------------------- + +- Maintenance release. Updated dependencies and docs. + + +0.1.15 / 2013-05-13 +------------------- + +- Fixed #55, @trebor89 + + +0.1.14 / 2013-05-12 +------------------- + +- Fixed #62, @maxtaco + + +0.1.13 / 2013-04-08 +------------------- + +- Added `.npmignore` to reduce package size + + +0.1.12 / 2013-02-10 +------------------- + +- Fixed conflictHandler (#46), @hpaulj + + +0.1.11 / 2013-02-07 +------------------- + +- Multiple bugfixes, @hpaulj +- Added 70+ tests (ported from python), @hpaulj +- Added conflictHandler, @applepicke +- Added fromfilePrefixChar, @hpaulj + + +0.1.10 / 2012-12-30 +------------------- + +- Added [mutual exclusion](http://docs.python.org/dev/library/argparse.html#mutual-exclusion) + support, thanks to @hpaulj +- Fixed options check for `storeConst` & `appendConst` actions, thanks to @hpaulj + + +0.1.9 / 2012-12-27 +------------------ + +- 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 +- Imrove negative argument parsing, thanks to @hpaulj + + +0.1.8 / 2012-12-01 +------------------ + +- Fixed parser parents (issue #19), thanks to @hpaulj +- Fixed negative argument parse (issue #20), thanks to @hpaulj + + +0.1.7 / 2012-10-14 +------------------ + +- Fixed 'choices' argument parse (issue #16) +- Fixed stderr output (issue #15) + + +0.1.6 / 2012-09-09 +------------------ + +- Fixed check for conflict of options (thanks to @tomxtobin) + + +0.1.5 / 2012-09-03 +------------------ + +- Fix parser #setDefaults method (thanks to @tomxtobin) + + +0.1.4 / 2012-07-30 +------------------ + +- 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 formatter api name: Formatter -> HelpFormatter + + +0.1.2 / 2012-05-29 +------------------ + +- Added basic tests +- Removed excess whitespace in help +- Fixed error reporting, when parcer with subcommands + called with empty arguments + + +0.1.1 / 2012-05-23 +------------------ + +- Fixed line wrapping in help formatter +- Added better error reporting on invalid arguments + + +0.1.0 / 2012-05-16 +------------------ + +- First release. diff --git a/node_modules/gray-matter/node_modules/argparse/LICENSE b/node_modules/gray-matter/node_modules/argparse/LICENSE new file mode 100644 index 0000000..1afdae5 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/LICENSE @@ -0,0 +1,21 @@ +(The MIT License) + +Copyright (C) 2012 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/gray-matter/node_modules/argparse/README.md b/node_modules/gray-matter/node_modules/argparse/README.md new file mode 100644 index 0000000..7fa6c40 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/README.md @@ -0,0 +1,257 @@ +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. Javascript port of python's +[argparse](http://docs.python.org/dev/library/argparse.html) module +(original version 3.2). That's a full port, except some very rare options, +recorded in issue tracker. + +**NB. Difference with original.** + +- Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/). +- Use `defaultValue` instead of `default`. +- Use `argparse.Const.REMAINDER` instead of `argparse.REMAINDER`, and + similarly for constant values `OPTIONAL`, `ZERO_OR_MORE`, and `ONE_OR_MORE` + (aliases for `nargs` values `'?'`, `'*'`, `'+'`, respectively), and + `SUPPRESS`. + + +Example +======= + +test.js file: + +```javascript +#!/usr/bin/env node +'use strict'; + +var ArgumentParser = require('../lib/argparse').ArgumentParser; +var parser = new ArgumentParser({ + version: '0.0.1', + addHelp:true, + description: 'Argparse example' +}); +parser.addArgument( + [ '-f', '--foo' ], + { + help: 'foo bar' + } +); +parser.addArgument( + [ '-b', '--bar' ], + { + help: 'bar foo' + } +); +parser.addArgument( + '--baz', + { + help: 'baz bar' + } +); +var args = parser.parseArgs(); +console.dir(args); +``` + +Display help: + +``` +$ ./test.js -h +usage: example.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' } +``` + +More [examples](https://github.com/nodeca/argparse/tree/master/examples). + + +ArgumentParser objects +====================== + +``` +new ArgumentParser({parameters hash}); +``` + +Creates a new ArgumentParser object. + +**Supported params:** + +- ```description``` - Text to display before the argument help. +- ```epilog``` - Text to display after the argument help. +- ```addHelp``` - Add a -h/–help option to the parser. (default: true) +- ```argumentDefault``` - Set the global default value for arguments. (default: null) +- ```parents``` - A list of ArgumentParser objects whose arguments should also be included. +- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘) +- ```formatterClass``` - A class for customizing the help output. +- ```prog``` - The name of the program (default: `path.basename(process.argv[1])`) +- ```usage``` - The string describing the program usage (default: generated) +- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals. + +**Not supported yet** + +- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read. + + +Details in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects) + + +addArgument() method +==================== + +``` +ArgumentParser.addArgument(name or flag or [name] or [flags...], {options}) +``` + +Defines how a single command-line argument should be parsed. + +- ```name or flag or [name] or [flags...]``` - Either a positional name + (e.g., `'foo'`), a single option (e.g., `'-f'` or `'--foo'`), an array + of a single positional name (e.g., `['foo']`), or an array of options + (e.g., `['-f', '--foo']`). + +Options: + +- ```action``` - The basic type of action to be taken when this argument is encountered at the command line. +- ```nargs```- The number of command-line arguments that should be consumed. +- ```constant``` - A constant value required by some action and nargs selections. +- ```defaultValue``` - The value produced if the argument is absent from the command line. +- ```type``` - The type to which the command-line argument should be converted. +- ```choices``` - A container of the allowable values for the argument. +- ```required``` - Whether or not the command-line option may be omitted (optionals only). +- ```help``` - A brief description of what the argument does. +- ```metavar``` - A name for the argument in usage messages. +- ```dest``` - The name of the attribute to be added to the object returned by parseArgs(). + +Details in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method) + + +Action (some details) +================ + +ArgumentParser objects associate command-line arguments with actions. +These actions can do just about anything with the command-line arguments associated +with them, though most actions simply add an attribute to the object returned by +parseArgs(). The action keyword argument specifies how the command-line arguments +should be handled. The supported actions are: + +- ```store``` - Just stores the argument’s value. This is the default action. +- ```storeConst``` - Stores value, specified by the const keyword argument. + (Note that the const keyword argument defaults to the rather unhelpful None.) + The 'storeConst' action is most commonly used with optional arguments, that + specify some sort of flag. +- ```storeTrue``` and ```storeFalse``` - Stores values True and False + respectively. These are special cases of 'storeConst'. +- ```append``` - Stores a list, and appends each argument value to the list. + This is useful to allow an option to be specified multiple times. +- ```appendConst``` - Stores a list, and appends value, specified by the + const keyword argument to the list. (Note, that the const keyword argument defaults + is None.) The 'appendConst' action is typically used when multiple arguments need + to store constants to the same list. +- ```count``` - Counts the number of times a keyword argument occurs. For example, + used for increasing verbosity levels. +- ```help``` - Prints a complete help message for all the options in the current + parser and then exits. By default a help action is automatically added to the parser. + See ArgumentParser for details of how the output is created. +- ```version``` - Prints version information and exit. Expects a `version=` + keyword argument in the addArgument() call. + +Details in [original action guide](http://docs.python.org/dev/library/argparse.html#action) + + +Sub-commands +============ + +ArgumentParser.addSubparsers() + +Many programs split their functionality into a number of sub-commands, for +example, the svn program can invoke sub-commands like `svn checkout`, `svn update`, +and `svn commit`. Splitting up functionality this way can be a particularly good +idea when a program performs several different functions which require different +kinds of command-line arguments. `ArgumentParser` supports creation of such +sub-commands with `addSubparsers()` method. The `addSubparsers()` method is +normally called with no arguments and returns an special action object. +This object has a single method `addParser()`, which takes a command name and +any `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object +that can be modified as usual. + +Example: + +sub_commands.js +```javascript +#!/usr/bin/env node +'use strict'; + +var ArgumentParser = require('../lib/argparse').ArgumentParser; +var parser = new ArgumentParser({ + version: '0.0.1', + addHelp:true, + description: 'Argparse examples: sub-commands', +}); + +var subparsers = parser.addSubparsers({ + title:'subcommands', + dest:"subcommand_name" +}); + +var bar = subparsers.addParser('c1', {addHelp:true}); +bar.addArgument( + [ '-f', '--foo' ], + { + action: 'store', + help: 'foo3 bar3' + } +); +var bar = subparsers.addParser( + 'c2', + {aliases:['co'], addHelp:true} +); +bar.addArgument( + [ '-b', '--bar' ], + { + action: 'store', + type: 'int', + help: 'foo3 bar3' + } +); + +var args = parser.parseArgs(); +console.dir(args); + +``` + +Details in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands) + + +Contributors +============ + +- [Eugene Shkuropat](https://github.com/shkuropat) +- [Paul Jacobson](https://github.com/hpaulj) + +[others](https://github.com/nodeca/argparse/graphs/contributors) + +License +======= + +Copyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin). +Released under the MIT license. See +[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details. + + diff --git a/node_modules/gray-matter/node_modules/argparse/index.js b/node_modules/gray-matter/node_modules/argparse/index.js new file mode 100644 index 0000000..3bbc143 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/index.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/argparse'); diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action.js b/node_modules/gray-matter/node_modules/argparse/lib/action.js new file mode 100644 index 0000000..1483c79 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action.js @@ -0,0 +1,146 @@ +/** + * class Action + * + * Base class for all actions + * Do not call in your code, use this class only for inherits your own action + * + * Information about how to convert command line strings to Javascript 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. + * + * ##### Allowed keywords: + * + * - `store` + * - `storeConstant` + * - `storeTrue` + * - `storeFalse` + * - `append` + * - `appendConstant` + * - `count` + * - `help` + * - `version` + * + * Information about action options see [[Action.new]] + * + * See also [original guide](http://docs.python.org/dev/library/argparse.html#action) + * + **/ + +'use strict'; + + +// Constants +var c = require('./const'); + + +/** + * new Action(options) + * + * Base class for all actions. Used only for inherits + * + * + * ##### Options: + * + * - `optionStrings` A list of command-line option strings for the action. + * - `dest` 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. + * - `constant` Default value for an action with no value. + * - `defaultValue` The value to be produced if the option is not specified. + * - `type` Cast to 'string'|'int'|'float'|'complex'|function (string). If + * None, 'string'. + * - `choices` The choices available. + * - `required` True if the action must always be specified at the command + * line. + * - `help` The help 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. + * + * ##### nargs supported values: + * + * - `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. + **/ +var Action = module.exports = function Action(options) { + options = options || {}; + this.optionStrings = options.optionStrings || []; + this.dest = options.dest; + this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null; + this.constant = typeof options.constant !== 'undefined' ? options.constant : null; + this.defaultValue = options.defaultValue; + this.type = typeof options.type !== 'undefined' ? options.type : null; + this.choices = typeof options.choices !== 'undefined' ? options.choices : null; + this.required = typeof options.required !== 'undefined' ? options.required : false; + this.help = typeof options.help !== 'undefined' ? options.help : null; + this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null; + + if (!(this.optionStrings instanceof Array)) { + throw new Error('optionStrings should be an array'); + } + if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') { + throw new Error('required should be a boolean'); + } +}; + +/** + * Action#getName -> String + * + * Tells action name + **/ +Action.prototype.getName = function () { + if (this.optionStrings.length > 0) { + return this.optionStrings.join('/'); + } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) { + return this.metavar; + } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) { + return this.dest; + } + return null; +}; + +/** + * Action#isOptional -> Boolean + * + * Return true if optional + **/ +Action.prototype.isOptional = function () { + return !this.isPositional(); +}; + +/** + * Action#isPositional -> Boolean + * + * Return true if positional + **/ +Action.prototype.isPositional = function () { + return (this.optionStrings.length === 0); +}; + +/** + * Action#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Should be implemented in inherited classes + * + * ##### Example + * + * ActionCount.prototype.call = function (parser, namespace, values, optionString) { + * namespace.set(this.dest, (namespace[this.dest] || 0) + 1); + * }; + * + **/ +Action.prototype.call = function () { + throw new Error('.call() not defined');// Not Implemented error +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/append.js b/node_modules/gray-matter/node_modules/argparse/lib/action/append.js new file mode 100644 index 0000000..b5da0de --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/append.js @@ -0,0 +1,53 @@ +/*:nodoc:* + * class ActionAppend + * + * This action stores a list, and appends each argument value to the list. + * This is useful to allow an option to be specified multiple times. + * This class inherided from [[Action]] + * + **/ + +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +/*:nodoc:* + * new ActionAppend(options) + * - options (object): options hash see [[Action.new]] + * + * Note: options.nargs should be optional for constants + * and more then zero for other + **/ +var ActionAppend = module.exports = function ActionAppend(options) { + options = options || {}; + if (this.nargs <= 0) { + throw new Error('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 (!!this.constant && this.nargs !== c.OPTIONAL) { + throw new Error('nargs must be OPTIONAL to supply const'); + } + Action.call(this, options); +}; +util.inherits(ActionAppend, Action); + +/*:nodoc:* + * ActionAppend#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionAppend.prototype.call = function (parser, namespace, values) { + var items = (namespace[this.dest] || []).slice(); + items.push(values); + namespace.set(this.dest, items); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/append/constant.js b/node_modules/gray-matter/node_modules/argparse/lib/action/append/constant.js new file mode 100644 index 0000000..313f5d2 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/append/constant.js @@ -0,0 +1,47 @@ +/*:nodoc:* + * class ActionAppendConstant + * + * This stores a list, and appends the value specified by + * the const keyword argument to the list. + * (Note that the const keyword argument defaults to null.) + * The 'appendConst' action is typically useful when multiple + * arguments need to store constants to the same list. + * + * This class inherited from [[Action]] + **/ + +'use strict'; + +var util = require('util'); + +var Action = require('../../action'); + +/*:nodoc:* + * new ActionAppendConstant(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionAppendConstant = module.exports = function ActionAppendConstant(options) { + options = options || {}; + options.nargs = 0; + if (typeof options.constant === 'undefined') { + throw new Error('constant option is required for appendAction'); + } + Action.call(this, options); +}; +util.inherits(ActionAppendConstant, Action); + +/*:nodoc:* + * ActionAppendConstant#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionAppendConstant.prototype.call = function (parser, namespace) { + var items = [].concat(namespace[this.dest] || []); + items.push(this.constant); + namespace.set(this.dest, items); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/count.js b/node_modules/gray-matter/node_modules/argparse/lib/action/count.js new file mode 100644 index 0000000..d6a5899 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/count.js @@ -0,0 +1,40 @@ +/*:nodoc:* + * class ActionCount + * + * This counts the number of times a keyword argument occurs. + * For example, this is useful for increasing verbosity levels + * + * This class inherided from [[Action]] + * + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +/*:nodoc:* + * new ActionCount(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionCount = module.exports = function ActionCount(options) { + options = options || {}; + options.nargs = 0; + + Action.call(this, options); +}; +util.inherits(ActionCount, Action); + +/*:nodoc:* + * ActionCount#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionCount.prototype.call = function (parser, namespace) { + namespace.set(this.dest, (namespace[this.dest] || 0) + 1); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/help.js b/node_modules/gray-matter/node_modules/argparse/lib/action/help.js new file mode 100644 index 0000000..b40e05a --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/help.js @@ -0,0 +1,47 @@ +/*:nodoc:* + * class ActionHelp + * + * Support action for printing help + * This class inherided from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +/*:nodoc:* + * new ActionHelp(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionHelp = module.exports = function ActionHelp(options) { + options = options || {}; + if (options.defaultValue !== null) { + options.defaultValue = options.defaultValue; + } else { + options.defaultValue = c.SUPPRESS; + } + options.dest = (options.dest !== null ? options.dest : c.SUPPRESS); + options.nargs = 0; + Action.call(this, options); + +}; +util.inherits(ActionHelp, Action); + +/*:nodoc:* + * ActionHelp#call(parser, namespace, values, optionString) + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Print help and exit + **/ +ActionHelp.prototype.call = function (parser) { + parser.printHelp(); + parser.exit(); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/store.js b/node_modules/gray-matter/node_modules/argparse/lib/action/store.js new file mode 100644 index 0000000..283b860 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/store.js @@ -0,0 +1,50 @@ +/*:nodoc:* + * class ActionStore + * + * This action just stores the argument’s value. This is the default action. + * + * This class inherited from [[Action]] + * + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// Constants +var c = require('../const'); + + +/*:nodoc:* + * new ActionStore(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionStore = module.exports = function ActionStore(options) { + options = options || {}; + if (this.nargs <= 0) { + throw new Error('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 (typeof this.constant !== 'undefined' && this.nargs !== c.OPTIONAL) { + throw new Error('nargs must be OPTIONAL to supply const'); + } + Action.call(this, options); +}; +util.inherits(ActionStore, Action); + +/*:nodoc:* + * ActionStore#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionStore.prototype.call = function (parser, namespace, values) { + namespace.set(this.dest, values); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/store/constant.js b/node_modules/gray-matter/node_modules/argparse/lib/action/store/constant.js new file mode 100644 index 0000000..23caa89 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/store/constant.js @@ -0,0 +1,43 @@ +/*:nodoc:* + * class ActionStoreConstant + * + * This action stores the value specified by the const keyword argument. + * (Note that the const keyword argument defaults to the rather unhelpful null.) + * The 'store_const' action is most commonly used with optional + * arguments that specify some sort of flag. + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../../action'); + +/*:nodoc:* + * new ActionStoreConstant(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionStoreConstant = module.exports = function ActionStoreConstant(options) { + options = options || {}; + options.nargs = 0; + if (typeof options.constant === 'undefined') { + throw new Error('constant option is required for storeAction'); + } + Action.call(this, options); +}; +util.inherits(ActionStoreConstant, Action); + +/*:nodoc:* + * ActionStoreConstant#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Save result in namespace object + **/ +ActionStoreConstant.prototype.call = function (parser, namespace) { + namespace.set(this.dest, this.constant); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/store/false.js b/node_modules/gray-matter/node_modules/argparse/lib/action/store/false.js new file mode 100644 index 0000000..9924f46 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/store/false.js @@ -0,0 +1,27 @@ +/*:nodoc:* + * class ActionStoreFalse + * + * This action store the values False respectively. + * This is special cases of 'storeConst' + * + * This class inherited from [[Action]] + **/ + +'use strict'; + +var util = require('util'); + +var ActionStoreConstant = require('./constant'); + +/*:nodoc:* + * new ActionStoreFalse(options) + * - options (object): hash of options see [[Action.new]] + * + **/ +var ActionStoreFalse = module.exports = function ActionStoreFalse(options) { + options = options || {}; + options.constant = false; + options.defaultValue = options.defaultValue !== null ? options.defaultValue : true; + ActionStoreConstant.call(this, options); +}; +util.inherits(ActionStoreFalse, ActionStoreConstant); diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/store/true.js b/node_modules/gray-matter/node_modules/argparse/lib/action/store/true.js new file mode 100644 index 0000000..9e22f7d --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/store/true.js @@ -0,0 +1,26 @@ +/*:nodoc:* + * class ActionStoreTrue + * + * This action store the values True respectively. + * This isspecial cases of 'storeConst' + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var ActionStoreConstant = require('./constant'); + +/*:nodoc:* + * new ActionStoreTrue(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionStoreTrue = module.exports = function ActionStoreTrue(options) { + options = options || {}; + options.constant = true; + options.defaultValue = options.defaultValue !== null ? options.defaultValue : false; + ActionStoreConstant.call(this, options); +}; +util.inherits(ActionStoreTrue, ActionStoreConstant); diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/subparsers.js b/node_modules/gray-matter/node_modules/argparse/lib/action/subparsers.js new file mode 100644 index 0000000..99dfedd --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/subparsers.js @@ -0,0 +1,149 @@ +/** internal + * class ActionSubparsers + * + * Support the creation of such sub-commands with the addSubparsers() + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); +var format = require('util').format; + + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +// Errors +var argumentErrorHelper = require('../argument/error'); + + +/*:nodoc:* + * new ChoicesPseudoAction(name, help) + * + * Create pseudo action for correct help text + * + **/ +function ChoicesPseudoAction(name, help) { + var options = { + optionStrings: [], + dest: name, + help: help + }; + + Action.call(this, options); +} + +util.inherits(ChoicesPseudoAction, Action); + +/** + * new ActionSubparsers(options) + * - options (object): options hash see [[Action.new]] + * + **/ +function ActionSubparsers(options) { + options = options || {}; + options.dest = options.dest || c.SUPPRESS; + options.nargs = c.PARSER; + + this.debug = (options.debug === true); + + this._progPrefix = options.prog; + this._parserClass = options.parserClass; + this._nameParserMap = {}; + this._choicesActions = []; + + options.choices = this._nameParserMap; + Action.call(this, options); +} + +util.inherits(ActionSubparsers, Action); + +/*:nodoc:* + * ActionSubparsers#addParser(name, options) -> ArgumentParser + * - name (string): sub-command name + * - options (object): see [[ArgumentParser.new]] + * + * Note: + * addParser supports an additional aliases option, + * which allows multiple strings to refer to the same subparser. + * This example, like svn, aliases co as a shorthand for checkout + * + **/ +ActionSubparsers.prototype.addParser = function (name, options) { + var parser; + + var self = this; + + options = options || {}; + + options.debug = (this.debug === true); + + // set program from the existing prefix + if (!options.prog) { + options.prog = this._progPrefix + ' ' + name; + } + + var aliases = options.aliases || []; + + // create a pseudo-action to hold the choice help + if (!!options.help || typeof options.help === 'string') { + var help = options.help; + delete options.help; + + var choiceAction = new ChoicesPseudoAction(name, help); + this._choicesActions.push(choiceAction); + } + + // create the parser and add it to the map + parser = new this._parserClass(options); + this._nameParserMap[name] = parser; + + // make parser available under aliases also + aliases.forEach(function (alias) { + self._nameParserMap[alias] = parser; + }); + + return parser; +}; + +ActionSubparsers.prototype._getSubactions = function () { + return this._choicesActions; +}; + +/*:nodoc:* + * ActionSubparsers#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Parse input aguments + **/ +ActionSubparsers.prototype.call = function (parser, namespace, values) { + var parserName = values[0]; + var argStrings = values.slice(1); + + // set the parser name if requested + if (this.dest !== c.SUPPRESS) { + namespace[this.dest] = parserName; + } + + // select the parser + if (this._nameParserMap[parserName]) { + parser = this._nameParserMap[parserName]; + } else { + throw argumentErrorHelper(format( + 'Unknown parser "%s" (choices: [%s]).', + parserName, + Object.keys(this._nameParserMap).join(', ') + )); + } + + // parse all the remaining options into the namespace + parser.parseArgs(argStrings, namespace); +}; + +module.exports = ActionSubparsers; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action/version.js b/node_modules/gray-matter/node_modules/argparse/lib/action/version.js new file mode 100644 index 0000000..8053328 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action/version.js @@ -0,0 +1,47 @@ +/*:nodoc:* + * class ActionVersion + * + * Support action for printing program version + * This class inherited from [[Action]] + **/ +'use strict'; + +var util = require('util'); + +var Action = require('../action'); + +// +// Constants +// +var c = require('../const'); + +/*:nodoc:* + * new ActionVersion(options) + * - options (object): options hash see [[Action.new]] + * + **/ +var ActionVersion = module.exports = function ActionVersion(options) { + options = options || {}; + options.defaultValue = (options.defaultValue ? options.defaultValue : c.SUPPRESS); + options.dest = (options.dest || c.SUPPRESS); + options.nargs = 0; + this.version = options.version; + Action.call(this, options); +}; +util.inherits(ActionVersion, Action); + +/*:nodoc:* + * ActionVersion#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Print version and exit + **/ +ActionVersion.prototype.call = function (parser) { + var version = this.version || parser.version; + var formatter = parser._getFormatter(); + formatter.addText(version); + parser.exit(0, formatter.formatHelp()); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/action_container.js b/node_modules/gray-matter/node_modules/argparse/lib/action_container.js new file mode 100644 index 0000000..6f1237b --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/action_container.js @@ -0,0 +1,482 @@ +/** internal + * class ActionContainer + * + * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]] + **/ + +'use strict'; + +var format = require('util').format; + +// Constants +var c = require('./const'); + +var $$ = require('./utils'); + +//Actions +var ActionHelp = require('./action/help'); +var ActionAppend = require('./action/append'); +var ActionAppendConstant = require('./action/append/constant'); +var ActionCount = require('./action/count'); +var ActionStore = require('./action/store'); +var ActionStoreConstant = require('./action/store/constant'); +var ActionStoreTrue = require('./action/store/true'); +var ActionStoreFalse = require('./action/store/false'); +var ActionVersion = require('./action/version'); +var ActionSubparsers = require('./action/subparsers'); + +// Errors +var argumentErrorHelper = require('./argument/error'); + +/** + * new ActionContainer(options) + * + * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]] + * + * ##### Options: + * + * - `description` -- A description of what the program does + * - `prefixChars` -- Characters that prefix optional arguments + * - `argumentDefault` -- The default value for all arguments + * - `conflictHandler` -- The conflict handler to use for duplicate arguments + **/ +var ActionContainer = module.exports = function ActionContainer(options) { + options = options || {}; + + this.description = options.description; + this.argumentDefault = options.argumentDefault; + this.prefixChars = options.prefixChars || ''; + this.conflictHandler = options.conflictHandler; + + // set up registries + this._registries = {}; + + // register actions + this.register('action', null, ActionStore); + this.register('action', 'store', ActionStore); + this.register('action', 'storeConst', ActionStoreConstant); + this.register('action', 'storeTrue', ActionStoreTrue); + this.register('action', 'storeFalse', ActionStoreFalse); + this.register('action', 'append', ActionAppend); + this.register('action', 'appendConst', ActionAppendConstant); + this.register('action', 'count', ActionCount); + this.register('action', 'help', ActionHelp); + this.register('action', 'version', ActionVersion); + this.register('action', 'parsers', ActionSubparsers); + + // raise an exception if the conflict handler is invalid + this._getHandler(); + + // action storage + this._actions = []; + this._optionStringActions = {}; + + // groups + this._actionGroups = []; + this._mutuallyExclusiveGroups = []; + + // defaults storage + this._defaults = {}; + + // determines whether an "option" looks like a negative number + // -1, -1.5 -5e+4 + this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$'); + + // whether or not there are any optionals that look like negative + // numbers -- uses a list so it can be shared and edited + this._hasNegativeNumberOptionals = []; +}; + +// Groups must be required, then ActionContainer already defined +var ArgumentGroup = require('./argument/group'); +var MutuallyExclusiveGroup = require('./argument/exclusive'); + +// +// Registration methods +// + +/** + * ActionContainer#register(registryName, value, object) -> Void + * - registryName (String) : object type action|type + * - value (string) : keyword + * - object (Object|Function) : handler + * + * Register handlers + **/ +ActionContainer.prototype.register = function (registryName, value, object) { + this._registries[registryName] = this._registries[registryName] || {}; + this._registries[registryName][value] = object; +}; + +ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) { + if (arguments.length < 3) { + defaultValue = null; + } + return this._registries[registryName][value] || defaultValue; +}; + +// +// Namespace default accessor methods +// + +/** + * ActionContainer#setDefaults(options) -> Void + * - options (object):hash of options see [[Action.new]] + * + * Set defaults + **/ +ActionContainer.prototype.setDefaults = function (options) { + options = options || {}; + for (var property in options) { + if ($$.has(options, property)) { + this._defaults[property] = options[property]; + } + } + + // if these defaults match any existing arguments, replace the previous + // default on the object with the new one + this._actions.forEach(function (action) { + if ($$.has(options, action.dest)) { + action.defaultValue = options[action.dest]; + } + }); +}; + +/** + * ActionContainer#getDefault(dest) -> Mixed + * - dest (string): action destination + * + * Return action default value + **/ +ActionContainer.prototype.getDefault = function (dest) { + var result = $$.has(this._defaults, dest) ? this._defaults[dest] : null; + + this._actions.forEach(function (action) { + if (action.dest === dest && $$.has(action, 'defaultValue')) { + result = action.defaultValue; + } + }); + + return result; +}; +// +// Adding argument actions +// + +/** + * ActionContainer#addArgument(args, options) -> Object + * - args (String|Array): argument key, or array of argument keys + * - options (Object): action objects see [[Action.new]] + * + * #### Examples + * - addArgument([ '-f', '--foo' ], { action: 'store', defaultValue: 1, ... }) + * - addArgument([ 'bar' ], { action: 'store', nargs: 1, ... }) + * - addArgument('--baz', { action: 'store', nargs: 1, ... }) + **/ +ActionContainer.prototype.addArgument = function (args, options) { + args = args; + options = options || {}; + + if (typeof args === 'string') { + args = [ args ]; + } + if (!Array.isArray(args)) { + throw new TypeError('addArgument first argument should be a string or an array'); + } + if (typeof options !== 'object' || Array.isArray(options)) { + throw new TypeError('addArgument second argument should be a hash'); + } + + // if no positional args are supplied or only one is supplied and + // it doesn't look like an option string, parse a positional argument + if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) { + if (args && !!options.dest) { + throw new Error('dest supplied twice for positional argument'); + } + options = this._getPositional(args, options); + + // otherwise, we're adding an optional argument + } else { + options = this._getOptional(args, options); + } + + // if no default was supplied, use the parser-level default + if (typeof options.defaultValue === 'undefined') { + var dest = options.dest; + if ($$.has(this._defaults, dest)) { + options.defaultValue = this._defaults[dest]; + } else if (typeof this.argumentDefault !== 'undefined') { + options.defaultValue = this.argumentDefault; + } + } + + // create the action object, and add it to the parser + var ActionClass = this._popActionClass(options); + if (typeof ActionClass !== 'function') { + throw new Error(format('Unknown action "%s".', ActionClass)); + } + var action = new ActionClass(options); + + // throw an error if the action type is not callable + var typeFunction = this._registryGet('type', action.type, action.type); + if (typeof typeFunction !== 'function') { + throw new Error(format('"%s" is not callable', typeFunction)); + } + + return this._addAction(action); +}; + +/** + * ActionContainer#addArgumentGroup(options) -> ArgumentGroup + * - options (Object): hash of options see [[ArgumentGroup.new]] + * + * Create new arguments groups + **/ +ActionContainer.prototype.addArgumentGroup = function (options) { + var group = new ArgumentGroup(this, options); + this._actionGroups.push(group); + return group; +}; + +/** + * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup + * - options (Object): {required: false} + * + * Create new mutual exclusive groups + **/ +ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) { + var group = new MutuallyExclusiveGroup(this, options); + this._mutuallyExclusiveGroups.push(group); + return group; +}; + +ActionContainer.prototype._addAction = function (action) { + var self = this; + + // resolve any conflicts + this._checkConflict(action); + + // add to actions list + this._actions.push(action); + action.container = this; + + // index the action by any option strings it has + action.optionStrings.forEach(function (optionString) { + self._optionStringActions[optionString] = action; + }); + + // set the flag if any option strings look like negative numbers + action.optionStrings.forEach(function (optionString) { + if (optionString.match(self._regexpNegativeNumber)) { + if (!self._hasNegativeNumberOptionals.some(Boolean)) { + self._hasNegativeNumberOptionals.push(true); + } + } + }); + + // return the created action + return action; +}; + +ActionContainer.prototype._removeAction = function (action) { + var actionIndex = this._actions.indexOf(action); + if (actionIndex >= 0) { + this._actions.splice(actionIndex, 1); + } +}; + +ActionContainer.prototype._addContainerActions = function (container) { + // collect groups by titles + var titleGroupMap = {}; + this._actionGroups.forEach(function (group) { + if (titleGroupMap[group.title]) { + throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title)); + } + titleGroupMap[group.title] = group; + }); + + // map each action to its group + var groupMap = {}; + function actionHash(action) { + // unique (hopefully?) string suitable as dictionary key + return action.getName(); + } + container._actionGroups.forEach(function (group) { + // if a group with the title exists, use that, otherwise + // create a new group matching the container's group + if (!titleGroupMap[group.title]) { + titleGroupMap[group.title] = this.addArgumentGroup({ + title: group.title, + description: group.description + }); + } + + // map the actions to their new group + group._groupActions.forEach(function (action) { + groupMap[actionHash(action)] = titleGroupMap[group.title]; + }); + }, this); + + // 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 + var mutexGroup; + container._mutuallyExclusiveGroups.forEach(function (group) { + mutexGroup = this.addMutuallyExclusiveGroup({ + required: group.required + }); + // map the actions to their new mutex group + group._groupActions.forEach(function (action) { + groupMap[actionHash(action)] = mutexGroup; + }); + }, this); // forEach takes a 'this' argument + + // add all actions to this container or their group + container._actions.forEach(function (action) { + var key = actionHash(action); + if (groupMap[key]) { + groupMap[key]._addAction(action); + } else { + this._addAction(action); + } + }); +}; + +ActionContainer.prototype._getPositional = function (dest, options) { + if (Array.isArray(dest)) { + dest = dest[0]; + } + // make sure required is not specified + if (options.required) { + throw new Error('"required" is an invalid argument for positionals.'); + } + + // mark positional arguments as required if at least one is + // always required + if (options.nargs !== c.OPTIONAL && options.nargs !== c.ZERO_OR_MORE) { + options.required = true; + } + if (options.nargs === c.ZERO_OR_MORE && typeof options.defaultValue === 'undefined') { + options.required = true; + } + + // return the keyword arguments with no option strings + options.dest = dest; + options.optionStrings = []; + return options; +}; + +ActionContainer.prototype._getOptional = function (args, options) { + var prefixChars = this.prefixChars; + var optionStrings = []; + var optionStringsLong = []; + + // determine short and long option strings + args.forEach(function (optionString) { + // error on strings that don't start with an appropriate prefix + if (prefixChars.indexOf(optionString[0]) < 0) { + throw new Error(format('Invalid option string "%s": must start with a "%s".', + optionString, + prefixChars + )); + } + + // strings starting with two prefix characters are long options + optionStrings.push(optionString); + if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) { + optionStringsLong.push(optionString); + } + }); + + // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' + var dest = options.dest || null; + delete options.dest; + + if (!dest) { + var optionStringDest = optionStringsLong.length ? optionStringsLong[0] : optionStrings[0]; + dest = $$.trimChars(optionStringDest, this.prefixChars); + + if (dest.length === 0) { + throw new Error( + format('dest= is required for options like "%s"', optionStrings.join(', ')) + ); + } + dest = dest.replace(/-/g, '_'); + } + + // return the updated keyword arguments + options.dest = dest; + options.optionStrings = optionStrings; + + return options; +}; + +ActionContainer.prototype._popActionClass = function (options, defaultValue) { + defaultValue = defaultValue || null; + + var action = (options.action || defaultValue); + delete options.action; + + var actionClass = this._registryGet('action', action, action); + return actionClass; +}; + +ActionContainer.prototype._getHandler = function () { + var handlerString = this.conflictHandler; + var handlerFuncName = '_handleConflict' + $$.capitalize(handlerString); + var func = this[handlerFuncName]; + if (typeof func === 'undefined') { + var msg = 'invalid conflict resolution value: ' + handlerString; + throw new Error(msg); + } else { + return func; + } +}; + +ActionContainer.prototype._checkConflict = function (action) { + var optionStringActions = this._optionStringActions; + var conflictOptionals = []; + + // find all options that conflict with this option + // collect pairs, the string, and an existing action that it conflicts with + action.optionStrings.forEach(function (optionString) { + var conflOptional = optionStringActions[optionString]; + if (typeof conflOptional !== 'undefined') { + conflictOptionals.push([ optionString, conflOptional ]); + } + }); + + if (conflictOptionals.length > 0) { + var conflictHandler = this._getHandler(); + conflictHandler.call(this, action, conflictOptionals); + } +}; + +ActionContainer.prototype._handleConflictError = function (action, conflOptionals) { + var conflicts = conflOptionals.map(function (pair) { return pair[0]; }); + conflicts = conflicts.join(', '); + throw argumentErrorHelper( + action, + format('Conflicting option string(s): %s', conflicts) + ); +}; + +ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) { + // remove all conflicting options + var self = this; + conflOptionals.forEach(function (pair) { + var optionString = pair[0]; + var conflictingAction = pair[1]; + // remove the conflicting option string + var i = conflictingAction.optionStrings.indexOf(optionString); + if (i >= 0) { + conflictingAction.optionStrings.splice(i, 1); + } + delete self._optionStringActions[optionString]; + // if the option now has no option string, remove it from the + // container holding it + if (conflictingAction.optionStrings.length === 0) { + conflictingAction.container._removeAction(conflictingAction); + } + }); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/argparse.js b/node_modules/gray-matter/node_modules/argparse/lib/argparse.js new file mode 100644 index 0000000..f2a2c51 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/argparse.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports.ArgumentParser = require('./argument_parser.js'); +module.exports.Namespace = require('./namespace'); +module.exports.Action = require('./action'); +module.exports.HelpFormatter = require('./help/formatter.js'); +module.exports.Const = require('./const.js'); + +module.exports.ArgumentDefaultsHelpFormatter = + require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter; +module.exports.RawDescriptionHelpFormatter = + require('./help/added_formatters.js').RawDescriptionHelpFormatter; +module.exports.RawTextHelpFormatter = + require('./help/added_formatters.js').RawTextHelpFormatter; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/argument/error.js b/node_modules/gray-matter/node_modules/argparse/lib/argument/error.js new file mode 100644 index 0000000..c8a02a0 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/argument/error.js @@ -0,0 +1,50 @@ +'use strict'; + + +var format = require('util').format; + + +var ERR_CODE = 'ARGError'; + +/*:nodoc:* + * argumentError(argument, message) -> TypeError + * - argument (Object): action with broken argument + * - message (String): error message + * + * Error format helper. 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. + * + * #####Example + * + * var argumentErrorHelper = require('./argument/error'); + * if (conflictOptionals.length > 0) { + * throw argumentErrorHelper( + * action, + * format('Conflicting option string(s): %s', conflictOptionals.join(', ')) + * ); + * } + * + **/ +module.exports = function (argument, message) { + var argumentName = null; + var errMessage; + var err; + + if (argument.getName) { + argumentName = argument.getName(); + } else { + argumentName = '' + argument; + } + + if (!argumentName) { + errMessage = message; + } else { + errMessage = format('argument "%s": %s', argumentName, message); + } + + err = new TypeError(errMessage); + err.code = ERR_CODE; + return err; +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/argument/exclusive.js b/node_modules/gray-matter/node_modules/argparse/lib/argument/exclusive.js new file mode 100644 index 0000000..8287e00 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/argument/exclusive.js @@ -0,0 +1,54 @@ +/** internal + * class MutuallyExclusiveGroup + * + * Group arguments. + * By default, ArgumentParser groups command-line arguments + * into “positional arguments” and “optional arguments” + * when displaying help messages. When there is a better + * conceptual grouping of arguments than this default one, + * appropriate groups can be created using the addArgumentGroup() method + * + * This class inherited from [[ArgumentContainer]] + **/ +'use strict'; + +var util = require('util'); + +var ArgumentGroup = require('./group'); + +/** + * new MutuallyExclusiveGroup(container, options) + * - container (object): main container + * - options (object): options.required -> true/false + * + * `required` could be an argument itself, but making it a property of + * the options argument is more consistent with the JS adaptation of the Python) + **/ +var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) { + var required; + options = options || {}; + required = options.required || false; + ArgumentGroup.call(this, container); + this.required = required; + +}; +util.inherits(MutuallyExclusiveGroup, ArgumentGroup); + + +MutuallyExclusiveGroup.prototype._addAction = function (action) { + var msg; + if (action.required) { + msg = 'mutually exclusive arguments must be optional'; + throw new Error(msg); + } + action = this._container._addAction(action); + this._groupActions.push(action); + return action; +}; + + +MutuallyExclusiveGroup.prototype._removeAction = function (action) { + this._container._removeAction(action); + this._groupActions.remove(action); +}; + diff --git a/node_modules/gray-matter/node_modules/argparse/lib/argument/group.js b/node_modules/gray-matter/node_modules/argparse/lib/argument/group.js new file mode 100644 index 0000000..58b271f --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/argument/group.js @@ -0,0 +1,75 @@ +/** internal + * class ArgumentGroup + * + * Group arguments. + * By default, ArgumentParser groups command-line arguments + * into “positional arguments” and “optional arguments” + * when displaying help messages. When there is a better + * conceptual grouping of arguments than this default one, + * appropriate groups can be created using the addArgumentGroup() method + * + * This class inherited from [[ArgumentContainer]] + **/ +'use strict'; + +var util = require('util'); + +var ActionContainer = require('../action_container'); + + +/** + * new ArgumentGroup(container, options) + * - container (object): main container + * - options (object): hash of group options + * + * #### options + * - **prefixChars** group name prefix + * - **argumentDefault** default argument value + * - **title** group title + * - **description** group description + * + **/ +var ArgumentGroup = module.exports = function ArgumentGroup(container, options) { + + options = options || {}; + + // add any missing keyword arguments by checking the container + options.conflictHandler = (options.conflictHandler || container.conflictHandler); + options.prefixChars = (options.prefixChars || container.prefixChars); + options.argumentDefault = (options.argumentDefault || container.argumentDefault); + + ActionContainer.call(this, options); + + // group attributes + this.title = options.title; + this._groupActions = []; + + // share most attributes with the container + this._container = container; + this._registries = container._registries; + this._actions = container._actions; + this._optionStringActions = container._optionStringActions; + this._defaults = container._defaults; + this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals; + this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups; +}; +util.inherits(ArgumentGroup, ActionContainer); + + +ArgumentGroup.prototype._addAction = function (action) { + // Parent add action + action = ActionContainer.prototype._addAction.call(this, action); + this._groupActions.push(action); + return action; +}; + + +ArgumentGroup.prototype._removeAction = function (action) { + // Parent remove action + ActionContainer.prototype._removeAction.call(this, action); + var actionIndex = this._groupActions.indexOf(action); + if (actionIndex >= 0) { + this._groupActions.splice(actionIndex, 1); + } +}; + diff --git a/node_modules/gray-matter/node_modules/argparse/lib/argument_parser.js b/node_modules/gray-matter/node_modules/argparse/lib/argument_parser.js new file mode 100644 index 0000000..bd9a59a --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/argument_parser.js @@ -0,0 +1,1161 @@ +/** + * class ArgumentParser + * + * Object for parsing command line strings into js objects. + * + * Inherited from [[ActionContainer]] + **/ +'use strict'; + +var util = require('util'); +var format = require('util').format; +var Path = require('path'); +var sprintf = require('sprintf-js').sprintf; + +// Constants +var c = require('./const'); + +var $$ = require('./utils'); + +var ActionContainer = require('./action_container'); + +// Errors +var argumentErrorHelper = require('./argument/error'); + +var HelpFormatter = require('./help/formatter'); + +var Namespace = require('./namespace'); + + +/** + * new ArgumentParser(options) + * + * Create a new ArgumentParser object. + * + * ##### Options: + * - `prog` The name of the program (default: Path.basename(process.argv[1])) + * - `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 + * - `formatterClass` HelpFormatter class for printing help messages + * - `prefixChars` Characters that prefix optional arguments + * - `fromfilePrefixChars` Characters that prefix files containing additional arguments + * - `argumentDefault` The default value for all arguments + * - `addHelp` Add a -h/-help option + * - `conflictHandler` Specifies how to handle conflicting argument names + * - `debug` Enable debug mode. Argument errors throw exception in + * debug mode and process.exit in normal. Used for development and + * testing (default: false) + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects + **/ +function ArgumentParser(options) { + if (!(this instanceof ArgumentParser)) { + return new ArgumentParser(options); + } + var self = this; + options = options || {}; + + options.description = (options.description || null); + options.argumentDefault = (options.argumentDefault || null); + options.prefixChars = (options.prefixChars || '-'); + options.conflictHandler = (options.conflictHandler || 'error'); + ActionContainer.call(this, options); + + options.addHelp = typeof options.addHelp === 'undefined' || !!options.addHelp; + options.parents = options.parents || []; + // default program name + options.prog = (options.prog || Path.basename(process.argv[1])); + this.prog = options.prog; + this.usage = options.usage; + this.epilog = options.epilog; + this.version = options.version; + + this.debug = (options.debug === true); + + this.formatterClass = (options.formatterClass || HelpFormatter); + this.fromfilePrefixChars = options.fromfilePrefixChars || null; + this._positionals = this.addArgumentGroup({ title: 'Positional arguments' }); + this._optionals = this.addArgumentGroup({ title: 'Optional arguments' }); + this._subparsers = null; + + // register types + function FUNCTION_IDENTITY(o) { + return o; + } + this.register('type', 'auto', FUNCTION_IDENTITY); + this.register('type', null, FUNCTION_IDENTITY); + this.register('type', 'int', function (x) { + var result = parseInt(x, 10); + if (isNaN(result)) { + throw new Error(x + ' is not a valid integer.'); + } + return result; + }); + this.register('type', 'float', function (x) { + var result = parseFloat(x); + if (isNaN(result)) { + throw new Error(x + ' is not a valid float.'); + } + return result; + }); + this.register('type', 'string', function (x) { + return '' + x; + }); + + // add help and version arguments if necessary + var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0]; + if (options.addHelp) { + this.addArgument( + [ defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help' ], + { + action: 'help', + defaultValue: c.SUPPRESS, + help: 'Show this help message and exit.' + } + ); + } + if (typeof this.version !== 'undefined') { + this.addArgument( + [ defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version' ], + { + action: 'version', + version: this.version, + defaultValue: c.SUPPRESS, + help: "Show program's version number and exit." + } + ); + } + + // add parent arguments and defaults + options.parents.forEach(function (parent) { + self._addContainerActions(parent); + if (typeof parent._defaults !== 'undefined') { + for (var defaultKey in parent._defaults) { + if (parent._defaults.hasOwnProperty(defaultKey)) { + self._defaults[defaultKey] = parent._defaults[defaultKey]; + } + } + } + }); +} + +util.inherits(ArgumentParser, ActionContainer); + +/** + * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]] + * - options (object): hash of options see [[ActionSubparsers.new]] + * + * See also [subcommands][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands + **/ +ArgumentParser.prototype.addSubparsers = function (options) { + if (this._subparsers) { + this.error('Cannot have multiple subparser arguments.'); + } + + options = options || {}; + options.debug = (this.debug === true); + options.optionStrings = []; + options.parserClass = (options.parserClass || ArgumentParser); + + + if (!!options.title || !!options.description) { + + this._subparsers = this.addArgumentGroup({ + title: (options.title || 'subcommands'), + description: options.description + }); + delete options.title; + delete options.description; + + } else { + this._subparsers = this._positionals; + } + + // prog defaults to the usage message of this parser, skipping + // optional arguments and with no "usage:" prefix + if (!options.prog) { + var formatter = this._getFormatter(); + var positionals = this._getPositionalActions(); + var groups = this._mutuallyExclusiveGroups; + formatter.addUsage(this.usage, positionals, groups, ''); + options.prog = formatter.formatHelp().trim(); + } + + // create the parsers action and add it to the positionals list + var ParsersClass = this._popActionClass(options, 'parsers'); + var action = new ParsersClass(options); + this._subparsers._addAction(action); + + // return the created parsers action + return action; +}; + +ArgumentParser.prototype._addAction = function (action) { + if (action.isOptional()) { + this._optionals._addAction(action); + } else { + this._positionals._addAction(action); + } + return action; +}; + +ArgumentParser.prototype._getOptionalActions = function () { + return this._actions.filter(function (action) { + return action.isOptional(); + }); +}; + +ArgumentParser.prototype._getPositionalActions = function () { + return this._actions.filter(function (action) { + return action.isPositional(); + }); +}; + + +/** + * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object + * - args (array): input elements + * - namespace (Namespace|Object): result object + * + * Parsed args and throws error if some arguments are not recognized + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method + **/ +ArgumentParser.prototype.parseArgs = function (args, namespace) { + var argv; + var result = this.parseKnownArgs(args, namespace); + + args = result[0]; + argv = result[1]; + if (argv && argv.length > 0) { + this.error( + format('Unrecognized arguments: %s.', argv.join(' ')) + ); + } + return args; +}; + +/** + * ArgumentParser#parseKnownArgs(args, namespace) -> array + * - args (array): input options + * - namespace (Namespace|Object): result object + * + * Parse known arguments and return tuple of result object + * and unknown args + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing + **/ +ArgumentParser.prototype.parseKnownArgs = function (args, namespace) { + var self = this; + + // args default to the system args + args = args || process.argv.slice(2); + + // default Namespace built from parser defaults + namespace = namespace || new Namespace(); + + self._actions.forEach(function (action) { + if (action.dest !== c.SUPPRESS) { + if (!$$.has(namespace, action.dest)) { + if (action.defaultValue !== c.SUPPRESS) { + var defaultValue = action.defaultValue; + if (typeof action.defaultValue === 'string') { + defaultValue = self._getValue(action, defaultValue); + } + namespace[action.dest] = defaultValue; + } + } + } + }); + + Object.keys(self._defaults).forEach(function (dest) { + namespace[dest] = self._defaults[dest]; + }); + + // parse the arguments and exit if there are any errors + try { + var res = this._parseKnownArgs(args, namespace); + + namespace = res[0]; + args = res[1]; + if ($$.has(namespace, c._UNRECOGNIZED_ARGS_ATTR)) { + args = $$.arrayUnion(args, namespace[c._UNRECOGNIZED_ARGS_ATTR]); + delete namespace[c._UNRECOGNIZED_ARGS_ATTR]; + } + return [ namespace, args ]; + } catch (e) { + this.error(e); + } +}; + +ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) { + var self = this; + + var extras = []; + + // replace arg strings that are file references + if (this.fromfilePrefixChars !== null) { + argStrings = this._readArgsFromFiles(argStrings); + } + // map all mutually exclusive arguments to the other arguments + // they can't occur with + // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])' + // though I can't conceive of a way in which an action could be a member + // of two different mutually exclusive groups. + + function actionHash(action) { + // some sort of hashable key for this action + // action itself cannot be a key in actionConflicts + // I think getName() (join of optionStrings) is unique enough + return action.getName(); + } + + var conflicts, key; + var actionConflicts = {}; + + this._mutuallyExclusiveGroups.forEach(function (mutexGroup) { + mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) { + key = actionHash(mutexAction); + if (!$$.has(actionConflicts, key)) { + actionConflicts[key] = []; + } + conflicts = actionConflicts[key]; + conflicts.push.apply(conflicts, groupActions.slice(0, i)); + conflicts.push.apply(conflicts, groupActions.slice(i + 1)); + }); + }); + + // 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 '--' + var optionStringIndices = {}; + + var argStringPatternParts = []; + + argStrings.forEach(function (argString, argStringIndex) { + if (argString === '--') { + argStringPatternParts.push('-'); + while (argStringIndex < argStrings.length) { + argStringPatternParts.push('A'); + argStringIndex++; + } + } else { + // otherwise, add the arg to the arg strings + // and note the index if it was an option + var pattern; + var optionTuple = self._parseOptional(argString); + if (!optionTuple) { + pattern = 'A'; + } else { + optionStringIndices[argStringIndex] = optionTuple; + pattern = 'O'; + } + argStringPatternParts.push(pattern); + } + }); + var argStringsPattern = argStringPatternParts.join(''); + + var seenActions = []; + var seenNonDefaultActions = []; + + + function takeAction(action, argumentStrings, optionString) { + seenActions.push(action); + var argumentValues = self._getValues(action, argumentStrings); + + // 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 (argumentValues !== action.defaultValue) { + seenNonDefaultActions.push(action); + if (actionConflicts[actionHash(action)]) { + actionConflicts[actionHash(action)].forEach(function (actionConflict) { + if (seenNonDefaultActions.indexOf(actionConflict) >= 0) { + throw argumentErrorHelper( + action, + format('Not allowed with argument "%s".', actionConflict.getName()) + ); + } + }); + } + } + + if (argumentValues !== c.SUPPRESS) { + action.call(self, namespace, argumentValues, optionString); + } + } + + function consumeOptional(startIndex) { + // get the optional identified at this index + var optionTuple = optionStringIndices[startIndex]; + var action = optionTuple[0]; + var optionString = optionTuple[1]; + var explicitArg = optionTuple[2]; + + // identify additional optionals in the same arg string + // (e.g. -xyz is the same as -x -y -z if no args are required) + var actionTuples = []; + + var args, argCount, start, stop; + + for (;;) { + if (!action) { + extras.push(argStrings[startIndex]); + return startIndex + 1; + } + if (explicitArg) { + argCount = self._matchArgument(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 + var chars = self.prefixChars; + if (argCount === 0 && chars.indexOf(optionString[1]) < 0) { + actionTuples.push([ action, [], optionString ]); + optionString = optionString[0] + explicitArg[0]; + var newExplicitArg = explicitArg.slice(1) || null; + var optionalsMap = self._optionStringActions; + + if (Object.keys(optionalsMap).indexOf(optionString) >= 0) { + action = optionalsMap[optionString]; + explicitArg = newExplicitArg; + } else { + throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg)); + } + } else if (argCount === 1) { + // if the action expect exactly one argument, we've + // successfully matched the option; exit the loop + stop = startIndex + 1; + args = [ explicitArg ]; + actionTuples.push([ action, args, optionString ]); + break; + } else { + // error if a double-dash option did not use the + // explicit argument + throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg)); + } + } else { + // if there is no explicit argument, try to match the + // optional's string arguments with the following strings + // if successful, exit the loop + + start = startIndex + 1; + var selectedPatterns = argStringsPattern.substr(start); + + argCount = self._matchArgument(action, selectedPatterns); + stop = start + argCount; + + + args = argStrings.slice(start, stop); + + actionTuples.push([ action, args, optionString ]); + break; + } + + } + + // add the Optional to the list and return the index at which + // the Optional's string args stopped + if (actionTuples.length < 1) { + throw new Error('length should be > 0'); + } + for (var i = 0; i < actionTuples.length; i++) { + takeAction.apply(self, actionTuples[i]); + } + return stop; + } + + // the list of Positionals left to be parsed; this is modified + // by consume_positionals() + var positionals = self._getPositionalActions(); + + function consumePositionals(startIndex) { + // match as many Positionals as possible + var selectedPattern = argStringsPattern.substr(startIndex); + var argCounts = self._matchArgumentsPartial(positionals, selectedPattern); + + // slice off the appropriate arg strings for each Positional + // and add the Positional and its args to the list + for (var i = 0; i < positionals.length; i++) { + var action = positionals[i]; + var argCount = argCounts[i]; + if (typeof argCount === 'undefined') { + continue; + } + var args = argStrings.slice(startIndex, startIndex + argCount); + + startIndex += argCount; + takeAction(action, args); + } + + // slice off the Positionals that we just parsed and return the + // index at which the Positionals' string args stopped + positionals = positionals.slice(argCounts.length); + return startIndex; + } + + // consume Positionals and Optionals alternately, until we have + // passed the last option string + var startIndex = 0; + var position; + + var maxOptionStringIndex = -1; + + Object.keys(optionStringIndices).forEach(function (position) { + maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10)); + }); + + var positionalsEndIndex, nextOptionStringIndex; + + while (startIndex <= maxOptionStringIndex) { + // consume any Positionals preceding the next option + nextOptionStringIndex = null; + for (position in optionStringIndices) { + if (!optionStringIndices.hasOwnProperty(position)) { continue; } + + position = parseInt(position, 10); + if (position >= startIndex) { + if (nextOptionStringIndex !== null) { + nextOptionStringIndex = Math.min(nextOptionStringIndex, position); + } else { + nextOptionStringIndex = position; + } + } + } + + if (startIndex !== nextOptionStringIndex) { + positionalsEndIndex = consumePositionals(startIndex); + // only try to parse the next optional if we didn't consume + // the option string during the positionals parsing + if (positionalsEndIndex > startIndex) { + startIndex = positionalsEndIndex; + continue; + } else { + startIndex = positionalsEndIndex; + } + } + + // if we consumed all the positionals we could and we're not + // at the index of an option string, there were extra arguments + if (!optionStringIndices[startIndex]) { + var strings = argStrings.slice(startIndex, nextOptionStringIndex); + extras = extras.concat(strings); + startIndex = nextOptionStringIndex; + } + // consume the next optional and any arguments for it + startIndex = consumeOptional(startIndex); + } + + // consume any positionals following the last Optional + var stopIndex = consumePositionals(startIndex); + + // if we didn't consume all the argument strings, there were extras + extras = extras.concat(argStrings.slice(stopIndex)); + + // if we didn't use all the Positional objects, there were too few + // arg strings supplied. + if (positionals.length > 0) { + self.error('too few arguments'); + } + + // make sure all required actions were present + self._actions.forEach(function (action) { + if (action.required) { + if (seenActions.indexOf(action) < 0) { + self.error(format('Argument "%s" is required', action.getName())); + } + } + }); + + // make sure all required groups have one option present + var actionUsed = false; + self._mutuallyExclusiveGroups.forEach(function (group) { + if (group.required) { + actionUsed = group._groupActions.some(function (action) { + return seenNonDefaultActions.indexOf(action) !== -1; + }); + + // if no actions were used, report the error + if (!actionUsed) { + var names = []; + group._groupActions.forEach(function (action) { + if (action.help !== c.SUPPRESS) { + names.push(action.getName()); + } + }); + names = names.join(' '); + var msg = 'one of the arguments ' + names + ' is required'; + self.error(msg); + } + } + }); + + // return the updated namespace and the extra arguments + return [ namespace, extras ]; +}; + +ArgumentParser.prototype._readArgsFromFiles = function (argStrings) { + // expand arguments referencing files + var self = this; + var fs = require('fs'); + var newArgStrings = []; + argStrings.forEach(function (argString) { + if (self.fromfilePrefixChars.indexOf(argString[0]) < 0) { + // for regular arguments, just add them back into the list + newArgStrings.push(argString); + } else { + // replace arguments referencing files with the file content + try { + var argstrs = []; + var filename = argString.slice(1); + var content = fs.readFileSync(filename, 'utf8'); + content = content.trim().split('\n'); + content.forEach(function (argLine) { + self.convertArgLineToArgs(argLine).forEach(function (arg) { + argstrs.push(arg); + }); + argstrs = self._readArgsFromFiles(argstrs); + }); + newArgStrings.push.apply(newArgStrings, argstrs); + } catch (error) { + return self.error(error.message); + } + } + }); + return newArgStrings; +}; + +ArgumentParser.prototype.convertArgLineToArgs = function (argLine) { + return [ argLine ]; +}; + +ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) { + + // match the pattern for this action to the arg strings + var regexpNargs = new RegExp('^' + this._getNargsPattern(action)); + var matches = regexpArgStrings.match(regexpNargs); + var message; + + // throw an exception if we weren't able to find a match + if (!matches) { + switch (action.nargs) { + /*eslint-disable no-undefined*/ + case undefined: + case null: + message = 'Expected one argument.'; + break; + case c.OPTIONAL: + message = 'Expected at most one argument.'; + break; + case c.ONE_OR_MORE: + message = 'Expected at least one argument.'; + break; + default: + message = 'Expected %s argument(s)'; + } + + throw argumentErrorHelper( + action, + format(message, action.nargs) + ); + } + // return the number of arguments matched + return matches[1].length; +}; + +ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) { + // progressively shorten the actions list by slicing off the + // final actions until we find a match + var self = this; + var result = []; + var actionSlice, pattern, matches; + var i, j; + + function getLength(string) { + return string.length; + } + + for (i = actions.length; i > 0; i--) { + pattern = ''; + actionSlice = actions.slice(0, i); + for (j = 0; j < actionSlice.length; j++) { + pattern += self._getNargsPattern(actionSlice[j]); + } + + pattern = new RegExp('^' + pattern); + matches = regexpArgStrings.match(pattern); + + if (matches && matches.length > 0) { + // need only groups + matches = matches.splice(1); + result = result.concat(matches.map(getLength)); + break; + } + } + + // return the list of arg string counts + return result; +}; + +ArgumentParser.prototype._parseOptional = function (argString) { + var action, optionString, argExplicit, optionTuples; + + // if it's an empty string, it was meant to be a positional + if (!argString) { + return null; + } + + // if it doesn't start with a prefix, it was meant to be positional + if (this.prefixChars.indexOf(argString[0]) < 0) { + return null; + } + + // if the option string is present in the parser, return the action + if (this._optionStringActions[argString]) { + return [ this._optionStringActions[argString], argString, null ]; + } + + // if it's just a single character, it was meant to be positional + if (argString.length === 1) { + return null; + } + + // if the option string before the "=" is present, return the action + if (argString.indexOf('=') >= 0) { + optionString = argString.split('=', 1)[0]; + argExplicit = argString.slice(optionString.length + 1); + + if (this._optionStringActions[optionString]) { + action = this._optionStringActions[optionString]; + return [ action, optionString, argExplicit ]; + } + } + + // search through all possible prefixes of the option string + // and all actions in the parser for possible interpretations + optionTuples = this._getOptionTuples(argString); + + // if multiple actions match, the option string was ambiguous + if (optionTuples.length > 1) { + var optionStrings = optionTuples.map(function (optionTuple) { + return optionTuple[1]; + }); + this.error(format( + 'Ambiguous option: "%s" could match %s.', + argString, optionStrings.join(', ') + )); + // if exactly one action matched, this segmentation is good, + // so return the parsed action + } else if (optionTuples.length === 1) { + return optionTuples[0]; + } + + // 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 (argString.match(this._regexpNegativeNumber)) { + if (!this._hasNegativeNumberOptionals.some(Boolean)) { + return null; + } + } + // if it contains a space, it was meant to be a positional + if (argString.search(' ') >= 0) { + return null; + } + + // 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 [ null, argString, null ]; +}; + +ArgumentParser.prototype._getOptionTuples = function (optionString) { + var result = []; + var chars = this.prefixChars; + var optionPrefix; + var argExplicit; + var action; + var actionOptionString; + + // option strings starting with two prefix characters are only split at + // the '=' + if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) { + if (optionString.indexOf('=') >= 0) { + var optionStringSplit = optionString.split('=', 1); + + optionPrefix = optionStringSplit[0]; + argExplicit = optionStringSplit[1]; + } else { + optionPrefix = optionString; + argExplicit = null; + } + + for (actionOptionString in this._optionStringActions) { + if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) { + action = this._optionStringActions[actionOptionString]; + result.push([ action, actionOptionString, argExplicit ]); + } + } + + // single character options can be concatenated with their arguments + // but multiple character options always have to have their argument + // separate + } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) { + optionPrefix = optionString; + argExplicit = null; + var optionPrefixShort = optionString.substr(0, 2); + var argExplicitShort = optionString.substr(2); + + for (actionOptionString in this._optionStringActions) { + if (!$$.has(this._optionStringActions, actionOptionString)) continue; + + action = this._optionStringActions[actionOptionString]; + if (actionOptionString === optionPrefixShort) { + result.push([ action, actionOptionString, argExplicitShort ]); + } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) { + result.push([ action, actionOptionString, argExplicit ]); + } + } + + // shouldn't ever get here + } else { + throw new Error(format('Unexpected option string: %s.', optionString)); + } + // return the collected option tuples + return result; +}; + +ArgumentParser.prototype._getNargsPattern = function (action) { + // in all examples below, we have to allow for '--' args + // which are represented as '-' in the pattern + var regexpNargs; + + switch (action.nargs) { + // the default (null) is assumed to be a single argument + case undefined: + case null: + regexpNargs = '(-*A-*)'; + break; + // allow zero or more arguments + case c.OPTIONAL: + regexpNargs = '(-*A?-*)'; + break; + // allow zero or more arguments + case c.ZERO_OR_MORE: + regexpNargs = '(-*[A-]*)'; + break; + // allow one or more arguments + case c.ONE_OR_MORE: + regexpNargs = '(-*A[A-]*)'; + break; + // allow any number of options or arguments + case c.REMAINDER: + regexpNargs = '([-AO]*)'; + break; + // allow one argument followed by any number of options or arguments + case c.PARSER: + regexpNargs = '(-*A[-AO]*)'; + break; + // all others should be integers + default: + regexpNargs = '(-*' + $$.repeat('-*A', action.nargs) + '-*)'; + } + + // if this is an optional action, -- is not allowed + if (action.isOptional()) { + regexpNargs = regexpNargs.replace(/-\*/g, ''); + regexpNargs = regexpNargs.replace(/-/g, ''); + } + + // return the pattern + return regexpNargs; +}; + +// +// Value conversion methods +// + +ArgumentParser.prototype._getValues = function (action, argStrings) { + var self = this; + + // for everything but PARSER args, strip out '--' + if (action.nargs !== c.PARSER && action.nargs !== c.REMAINDER) { + argStrings = argStrings.filter(function (arrayElement) { + return arrayElement !== '--'; + }); + } + + var value, argString; + + // optional argument produces a default when not present + if (argStrings.length === 0 && action.nargs === c.OPTIONAL) { + + value = (action.isOptional()) ? action.constant : action.defaultValue; + + if (typeof (value) === 'string') { + value = this._getValue(action, value); + this._checkValue(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 (argStrings.length === 0 && action.nargs === c.ZERO_OR_MORE && + action.optionStrings.length === 0) { + + value = (action.defaultValue || argStrings); + this._checkValue(action, value); + + // single argument or optional argument produces a single value + } else if (argStrings.length === 1 && + (!action.nargs || action.nargs === c.OPTIONAL)) { + + argString = argStrings[0]; + value = this._getValue(action, argString); + this._checkValue(action, value); + + // REMAINDER arguments convert all values, checking none + } else if (action.nargs === c.REMAINDER) { + value = argStrings.map(function (v) { + return self._getValue(action, v); + }); + + // PARSER arguments convert all values, but check only the first + } else if (action.nargs === c.PARSER) { + value = argStrings.map(function (v) { + return self._getValue(action, v); + }); + this._checkValue(action, value[0]); + + // all other types of nargs produce a list + } else { + value = argStrings.map(function (v) { + return self._getValue(action, v); + }); + value.forEach(function (v) { + self._checkValue(action, v); + }); + } + + // return the converted value + return value; +}; + +ArgumentParser.prototype._getValue = function (action, argString) { + var result; + + var typeFunction = this._registryGet('type', action.type, action.type); + if (typeof typeFunction !== 'function') { + var message = format('%s is not callable', typeFunction); + throw argumentErrorHelper(action, message); + } + + // convert the value to the appropriate type + try { + result = typeFunction(argString); + + // ArgumentTypeErrors indicate errors + // If action.type is not a registered string, it is a function + // Try to deduce its name for inclusion in the error message + // Failing that, include the error message it raised. + } catch (e) { + var name = null; + if (typeof action.type === 'string') { + name = action.type; + } else { + name = action.type.name || action.type.displayName || ''; + } + var msg = format('Invalid %s value: %s', name, argString); + if (name === '') { msg += '\n' + e.message; } + throw argumentErrorHelper(action, msg); + } + // return the converted value + return result; +}; + +ArgumentParser.prototype._checkValue = function (action, value) { + // converted value must be one of the choices (if specified) + var choices = action.choices; + if (choices) { + // choise for argument can by array or string + if ((typeof choices === 'string' || Array.isArray(choices)) && + choices.indexOf(value) !== -1) { + return; + } + // choise for subparsers can by only hash + if (typeof choices === 'object' && !Array.isArray(choices) && choices[value]) { + return; + } + + if (typeof choices === 'string') { + choices = choices.split('').join(', '); + } else if (Array.isArray(choices)) { + choices = choices.join(', '); + } else { + choices = Object.keys(choices).join(', '); + } + var message = format('Invalid choice: %s (choose from [%s])', value, choices); + throw argumentErrorHelper(action, message); + } +}; + +// +// Help formatting methods +// + +/** + * ArgumentParser#formatUsage -> string + * + * Return usage string + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.formatUsage = function () { + var formatter = this._getFormatter(); + formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups); + return formatter.formatHelp(); +}; + +/** + * ArgumentParser#formatHelp -> string + * + * Return help + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.formatHelp = function () { + var formatter = this._getFormatter(); + + // usage + formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups); + + // description + formatter.addText(this.description); + + // positionals, optionals and user-defined groups + this._actionGroups.forEach(function (actionGroup) { + formatter.startSection(actionGroup.title); + formatter.addText(actionGroup.description); + formatter.addArguments(actionGroup._groupActions); + formatter.endSection(); + }); + + // epilog + formatter.addText(this.epilog); + + // determine help from format above + return formatter.formatHelp(); +}; + +ArgumentParser.prototype._getFormatter = function () { + var FormatterClass = this.formatterClass; + var formatter = new FormatterClass({ prog: this.prog }); + return formatter; +}; + +// +// Print functions +// + +/** + * ArgumentParser#printUsage() -> Void + * + * Print usage + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.printUsage = function () { + this._printMessage(this.formatUsage()); +}; + +/** + * ArgumentParser#printHelp() -> Void + * + * Print help + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#printing-help + **/ +ArgumentParser.prototype.printHelp = function () { + this._printMessage(this.formatHelp()); +}; + +ArgumentParser.prototype._printMessage = function (message, stream) { + if (!stream) { + stream = process.stdout; + } + if (message) { + stream.write('' + message); + } +}; + +// +// Exit functions +// + +/** + * ArgumentParser#exit(status=0, message) -> Void + * - status (int): exit status + * - message (string): message + * + * Print message in stderr/stdout and exit program + **/ +ArgumentParser.prototype.exit = function (status, message) { + if (message) { + if (status === 0) { + this._printMessage(message); + } else { + this._printMessage(message, process.stderr); + } + } + + process.exit(status); +}; + +/** + * ArgumentParser#error(message) -> Void + * - err (Error|string): message + * + * Error method 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 throw an exception. + * + **/ +ArgumentParser.prototype.error = function (err) { + var message; + if (err instanceof Error) { + if (this.debug === true) { + throw err; + } + message = err.message; + } else { + message = err; + } + var msg = format('%s: error: %s', this.prog, message) + c.EOL; + + if (this.debug === true) { + throw new Error(msg); + } + + this.printUsage(process.stderr); + + return this.exit(2, msg); +}; + +module.exports = ArgumentParser; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/const.js b/node_modules/gray-matter/node_modules/argparse/lib/const.js new file mode 100644 index 0000000..b1fd4ce --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/const.js @@ -0,0 +1,21 @@ +// +// Constants +// + +'use strict'; + +module.exports.EOL = '\n'; + +module.exports.SUPPRESS = '==SUPPRESS=='; + +module.exports.OPTIONAL = '?'; + +module.exports.ZERO_OR_MORE = '*'; + +module.exports.ONE_OR_MORE = '+'; + +module.exports.PARSER = 'A...'; + +module.exports.REMAINDER = '...'; + +module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/help/added_formatters.js b/node_modules/gray-matter/node_modules/argparse/lib/help/added_formatters.js new file mode 100644 index 0000000..f8e4299 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/help/added_formatters.js @@ -0,0 +1,87 @@ +'use strict'; + +var util = require('util'); + +// Constants +var c = require('../const'); + +var $$ = require('../utils'); +var HelpFormatter = require('./formatter.js'); + +/** + * new RawDescriptionHelpFormatter(options) + * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...}) + * + * 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. + **/ + +function ArgumentDefaultsHelpFormatter(options) { + HelpFormatter.call(this, options); +} + +util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter); + +ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) { + var help = action.help; + if (action.help.indexOf('%(defaultValue)s') === -1) { + if (action.defaultValue !== c.SUPPRESS) { + var defaulting_nargs = [ c.OPTIONAL, c.ZERO_OR_MORE ]; + if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) { + help += ' (default: %(defaultValue)s)'; + } + } + } + return help; +}; + +module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter; + +/** + * new RawDescriptionHelpFormatter(options) + * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...}) + * + * 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. + **/ + +function RawDescriptionHelpFormatter(options) { + HelpFormatter.call(this, options); +} + +util.inherits(RawDescriptionHelpFormatter, HelpFormatter); + +RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) { + var lines = text.split('\n'); + lines = lines.map(function (line) { + return $$.trimEnd(indent + line); + }); + return lines.join('\n'); +}; +module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter; + +/** + * new RawTextHelpFormatter(options) + * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...}) + * + * 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. + **/ + +function RawTextHelpFormatter(options) { + RawDescriptionHelpFormatter.call(this, options); +} + +util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter); + +RawTextHelpFormatter.prototype._splitLines = function (text) { + return text.split('\n'); +}; + +module.exports.RawTextHelpFormatter = RawTextHelpFormatter; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/help/formatter.js b/node_modules/gray-matter/node_modules/argparse/lib/help/formatter.js new file mode 100644 index 0000000..29036c1 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/help/formatter.js @@ -0,0 +1,795 @@ +/** + * 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. + * + * Do not call in your code, use this class only for inherits your own forvatter + * + * ToDo add [additonal formatters][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class + **/ +'use strict'; + +var sprintf = require('sprintf-js').sprintf; + +// Constants +var c = require('../const'); + +var $$ = require('../utils'); + + +/*:nodoc:* internal + * new Support(parent, heding) + * - parent (object): parent section + * - heading (string): header string + * + **/ +function Section(parent, heading) { + this._parent = parent; + this._heading = heading; + this._items = []; +} + +/*:nodoc:* internal + * Section#addItem(callback) -> Void + * - callback (array): tuple with function and args + * + * Add function for single element + **/ +Section.prototype.addItem = function (callback) { + this._items.push(callback); +}; + +/*:nodoc:* internal + * Section#formatHelp(formatter) -> string + * - formatter (HelpFormatter): current formatter + * + * Form help section string + * + **/ +Section.prototype.formatHelp = function (formatter) { + var itemHelp, heading; + + // format the indented section + if (this._parent) { + formatter._indent(); + } + + itemHelp = this._items.map(function (item) { + var obj, func, args; + + obj = formatter; + func = item[0]; + args = item[1]; + return func.apply(obj, args); + }); + itemHelp = formatter._joinParts(itemHelp); + + if (this._parent) { + formatter._dedent(); + } + + // return nothing if the section was empty + if (!itemHelp) { + return ''; + } + + // add the heading if the section was non-empty + heading = ''; + if (this._heading && this._heading !== c.SUPPRESS) { + var currentIndent = formatter.currentIndent; + heading = $$.repeat(' ', currentIndent) + this._heading + ':' + c.EOL; + } + + // join the section-initialize newline, the heading and the help + return formatter._joinParts([ c.EOL, heading, itemHelp, c.EOL ]); +}; + +/** + * new HelpFormatter(options) + * + * #### Options: + * - `prog`: program name + * - `indentIncriment`: indent step, default value 2 + * - `maxHelpPosition`: max help position, default value = 24 + * - `width`: line width + * + **/ +var HelpFormatter = module.exports = function HelpFormatter(options) { + options = options || {}; + + this._prog = options.prog; + + this._maxHelpPosition = options.maxHelpPosition || 24; + this._width = (options.width || ((process.env.COLUMNS || 80) - 2)); + + this._currentIndent = 0; + this._indentIncriment = options.indentIncriment || 2; + this._level = 0; + this._actionMaxLength = 0; + + this._rootSection = new Section(null); + this._currentSection = this._rootSection; + + this._whitespaceMatcher = new RegExp('\\s+', 'g'); + this._longBreakMatcher = new RegExp(c.EOL + c.EOL + c.EOL + '+', 'g'); +}; + +HelpFormatter.prototype._indent = function () { + this._currentIndent += this._indentIncriment; + this._level += 1; +}; + +HelpFormatter.prototype._dedent = function () { + this._currentIndent -= this._indentIncriment; + this._level -= 1; + if (this._currentIndent < 0) { + throw new Error('Indent decreased below 0.'); + } +}; + +HelpFormatter.prototype._addItem = function (func, args) { + this._currentSection.addItem([ func, args ]); +}; + +// +// Message building methods +// + +/** + * HelpFormatter#startSection(heading) -> Void + * - heading (string): header string + * + * Start new help section + * + * See alse [code example][1] + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + * + **/ +HelpFormatter.prototype.startSection = function (heading) { + this._indent(); + var section = new Section(this._currentSection, heading); + var func = section.formatHelp.bind(section); + this._addItem(func, [ this ]); + this._currentSection = section; +}; + +/** + * HelpFormatter#endSection -> Void + * + * End help section + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + **/ +HelpFormatter.prototype.endSection = function () { + this._currentSection = this._currentSection._parent; + this._dedent(); +}; + +/** + * HelpFormatter#addText(text) -> Void + * - text (string): plain text + * + * Add plain text into current section + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + * + **/ +HelpFormatter.prototype.addText = function (text) { + if (text && text !== c.SUPPRESS) { + this._addItem(this._formatText, [ text ]); + } +}; + +/** + * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void + * - usage (string): usage text + * - actions (array): actions list + * - groups (array): groups list + * - prefix (string): usage prefix + * + * Add usage data into current section + * + * ##### Example + * + * formatter.addUsage(this.usage, this._actions, []); + * return formatter.formatHelp(); + * + **/ +HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) { + if (usage !== c.SUPPRESS) { + this._addItem(this._formatUsage, [ usage, actions, groups, prefix ]); + } +}; + +/** + * HelpFormatter#addArgument(action) -> Void + * - action (object): action + * + * Add argument into current section + * + * Single variant of [[HelpFormatter#addArguments]] + **/ +HelpFormatter.prototype.addArgument = function (action) { + if (action.help !== c.SUPPRESS) { + var self = this; + + // find all invocations + var invocations = [ this._formatActionInvocation(action) ]; + var invocationLength = invocations[0].length; + + var actionLength; + + if (action._getSubactions) { + this._indent(); + action._getSubactions().forEach(function (subaction) { + + var invocationNew = self._formatActionInvocation(subaction); + invocations.push(invocationNew); + invocationLength = Math.max(invocationLength, invocationNew.length); + + }); + this._dedent(); + } + + // update the maximum item length + actionLength = invocationLength + this._currentIndent; + this._actionMaxLength = Math.max(this._actionMaxLength, actionLength); + + // add the item to the list + this._addItem(this._formatAction, [ action ]); + } +}; + +/** + * HelpFormatter#addArguments(actions) -> Void + * - actions (array): actions list + * + * Mass add arguments into current section + * + * ##### Example + * + * formatter.startSection(actionGroup.title); + * formatter.addText(actionGroup.description); + * formatter.addArguments(actionGroup._groupActions); + * formatter.endSection(); + * + **/ +HelpFormatter.prototype.addArguments = function (actions) { + var self = this; + actions.forEach(function (action) { + self.addArgument(action); + }); +}; + +// +// Help-formatting methods +// + +/** + * HelpFormatter#formatHelp -> string + * + * Format help + * + * ##### Example + * + * formatter.addText(this.epilog); + * return formatter.formatHelp(); + * + **/ +HelpFormatter.prototype.formatHelp = function () { + var help = this._rootSection.formatHelp(this); + if (help) { + help = help.replace(this._longBreakMatcher, c.EOL + c.EOL); + help = $$.trimChars(help, c.EOL) + c.EOL; + } + return help; +}; + +HelpFormatter.prototype._joinParts = function (partStrings) { + return partStrings.filter(function (part) { + return (part && part !== c.SUPPRESS); + }).join(''); +}; + +HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) { + if (!prefix && typeof prefix !== 'string') { + prefix = 'usage: '; + } + + actions = actions || []; + groups = groups || []; + + + // if usage is specified, use that + if (usage) { + usage = sprintf(usage, { prog: this._prog }); + + // if no optionals or positionals are available, usage is just prog + } else if (!usage && actions.length === 0) { + usage = this._prog; + + // if optionals and positionals are available, calculate usage + } else if (!usage) { + var prog = this._prog; + var optionals = []; + var positionals = []; + var actionUsage; + var textWidth; + + // split optionals from positionals + actions.forEach(function (action) { + if (action.isOptional()) { + optionals.push(action); + } else { + positionals.push(action); + } + }); + + // build full usage string + actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups); + usage = [ prog, actionUsage ].join(' '); + + // wrap the usage parts if it's too long + textWidth = this._width - this._currentIndent; + if ((prefix.length + usage.length) > textWidth) { + + // break usage into wrappable parts + var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g'); + var optionalUsage = this._formatActionsUsage(optionals, groups); + var positionalUsage = this._formatActionsUsage(positionals, groups); + + + var optionalParts = optionalUsage.match(regexpPart); + var positionalParts = positionalUsage.match(regexpPart) || []; + + if (optionalParts.join(' ') !== optionalUsage) { + throw new Error('assert "optionalParts.join(\' \') === optionalUsage"'); + } + if (positionalParts.join(' ') !== positionalUsage) { + throw new Error('assert "positionalParts.join(\' \') === positionalUsage"'); + } + + // helper for wrapping lines + /*eslint-disable func-style*/ // node 0.10 compat + var _getLines = function (parts, indent, prefix) { + var lines = []; + var line = []; + + var lineLength = prefix ? prefix.length - 1 : indent.length - 1; + + parts.forEach(function (part) { + if (lineLength + 1 + part.length > textWidth) { + lines.push(indent + line.join(' ')); + line = []; + lineLength = indent.length - 1; + } + line.push(part); + lineLength += part.length + 1; + }); + + if (line) { + lines.push(indent + line.join(' ')); + } + if (prefix) { + lines[0] = lines[0].substr(indent.length); + } + return lines; + }; + + var lines, indent, parts; + // if prog is short, follow it with optionals or positionals + if (prefix.length + prog.length <= 0.75 * textWidth) { + indent = $$.repeat(' ', (prefix.length + prog.length + 1)); + if (optionalParts) { + lines = [].concat( + _getLines([ prog ].concat(optionalParts), indent, prefix), + _getLines(positionalParts, indent) + ); + } else if (positionalParts) { + lines = _getLines([ prog ].concat(positionalParts), indent, prefix); + } else { + lines = [ prog ]; + } + + // if prog is long, put it on its own line + } else { + indent = $$.repeat(' ', prefix.length); + parts = optionalParts.concat(positionalParts); + lines = _getLines(parts, indent); + if (lines.length > 1) { + lines = [].concat( + _getLines(optionalParts, indent), + _getLines(positionalParts, indent) + ); + } + lines = [ prog ].concat(lines); + } + // join lines into usage + usage = lines.join(c.EOL); + } + } + + // prefix with 'usage:' + return prefix + usage + c.EOL + c.EOL; +}; + +HelpFormatter.prototype._formatActionsUsage = function (actions, groups) { + // find group indices and identify actions in groups + var groupActions = []; + var inserts = []; + var self = this; + + groups.forEach(function (group) { + var end; + var i; + + var start = actions.indexOf(group._groupActions[0]); + if (start >= 0) { + end = start + group._groupActions.length; + + //if (actions.slice(start, end) === group._groupActions) { + if ($$.arrayEqual(actions.slice(start, end), group._groupActions)) { + group._groupActions.forEach(function (action) { + groupActions.push(action); + }); + + if (!group.required) { + if (inserts[start]) { + inserts[start] += ' ['; + } else { + inserts[start] = '['; + } + inserts[end] = ']'; + } else { + if (inserts[start]) { + inserts[start] += ' ('; + } else { + inserts[start] = '('; + } + inserts[end] = ')'; + } + for (i = start + 1; i < end; i += 1) { + inserts[i] = '|'; + } + } + } + }); + + // collect all actions format strings + var parts = []; + + actions.forEach(function (action, actionIndex) { + var part; + var optionString; + var argsDefault; + var argsString; + + // suppressed arguments are marked with None + // remove | separators for suppressed arguments + if (action.help === c.SUPPRESS) { + parts.push(null); + if (inserts[actionIndex] === '|') { + inserts.splice(actionIndex, actionIndex); + } else if (inserts[actionIndex + 1] === '|') { + inserts.splice(actionIndex + 1, actionIndex + 1); + } + + // produce all arg strings + } else if (!action.isOptional()) { + part = self._formatArgs(action, action.dest); + + // if it's in a group, strip the outer [] + if (groupActions.indexOf(action) >= 0) { + 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 { + optionString = action.optionStrings[0]; + + // if the Optional doesn't take a value, format is: -s or --long + if (action.nargs === 0) { + part = '' + optionString; + + // if the Optional takes a value, format is: -s ARGS or --long ARGS + } else { + argsDefault = action.dest.toUpperCase(); + argsString = self._formatArgs(action, argsDefault); + part = optionString + ' ' + argsString; + } + // make it look optional if it's not required or in a group + if (!action.required && groupActions.indexOf(action) < 0) { + part = '[' + part + ']'; + } + // add the action string to the list + parts.push(part); + } + }); + + // insert things at the necessary indices + for (var i = inserts.length - 1; i >= 0; --i) { + if (inserts[i] !== null) { + parts.splice(i, 0, inserts[i]); + } + } + + // join all the action items with spaces + var text = parts.filter(function (part) { + return !!part; + }).join(' '); + + // clean up separators for mutually exclusive groups + text = text.replace(/([\[(]) /g, '$1'); // remove spaces + text = text.replace(/ ([\])])/g, '$1'); + text = text.replace(/\[ *\]/g, ''); // remove empty groups + text = text.replace(/\( *\)/g, ''); + text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups + + text = text.trim(); + + // return the text + return text; +}; + +HelpFormatter.prototype._formatText = function (text) { + text = sprintf(text, { prog: this._prog }); + var textWidth = this._width - this._currentIndent; + var indentIncriment = $$.repeat(' ', this._currentIndent); + return this._fillText(text, textWidth, indentIncriment) + c.EOL + c.EOL; +}; + +HelpFormatter.prototype._formatAction = function (action) { + var self = this; + + var helpText; + var helpLines; + var parts; + var indentFirst; + + // determine the required width and the entry label + var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition); + var helpWidth = this._width - helpPosition; + var actionWidth = helpPosition - this._currentIndent - 2; + var actionHeader = this._formatActionInvocation(action); + + // no help; start on same line and add a final newline + if (!action.help) { + actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL; + + // short action name; start on the same line and pad two spaces + } else if (actionHeader.length <= actionWidth) { + actionHeader = $$.repeat(' ', this._currentIndent) + + actionHeader + + ' ' + + $$.repeat(' ', actionWidth - actionHeader.length); + indentFirst = 0; + + // long action name; start on the next line + } else { + actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL; + indentFirst = helpPosition; + } + + // collect the pieces of the action help + parts = [ actionHeader ]; + + // if there was help for the action, add lines of help text + if (action.help) { + helpText = this._expandHelp(action); + helpLines = this._splitLines(helpText, helpWidth); + parts.push($$.repeat(' ', indentFirst) + helpLines[0] + c.EOL); + helpLines.slice(1).forEach(function (line) { + parts.push($$.repeat(' ', helpPosition) + line + c.EOL); + }); + + // or add a newline if the description doesn't end with one + } else if (actionHeader.charAt(actionHeader.length - 1) !== c.EOL) { + parts.push(c.EOL); + } + // if there are any sub-actions, add their help as well + if (action._getSubactions) { + this._indent(); + action._getSubactions().forEach(function (subaction) { + parts.push(self._formatAction(subaction)); + }); + this._dedent(); + } + // return a single string + return this._joinParts(parts); +}; + +HelpFormatter.prototype._formatActionInvocation = function (action) { + if (!action.isOptional()) { + var format_func = this._metavarFormatter(action, action.dest); + var metavars = format_func(1); + return metavars[0]; + } + + var parts = []; + var argsDefault; + var argsString; + + // if the Optional doesn't take a value, format is: -s, --long + if (action.nargs === 0) { + parts = parts.concat(action.optionStrings); + + // if the Optional takes a value, format is: -s ARGS, --long ARGS + } else { + argsDefault = action.dest.toUpperCase(); + argsString = this._formatArgs(action, argsDefault); + action.optionStrings.forEach(function (optionString) { + parts.push(optionString + ' ' + argsString); + }); + } + return parts.join(', '); +}; + +HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) { + var result; + + if (action.metavar || action.metavar === '') { + result = action.metavar; + } else if (action.choices) { + var choices = action.choices; + + if (typeof choices === 'string') { + choices = choices.split('').join(', '); + } else if (Array.isArray(choices)) { + choices = choices.join(','); + } else { + choices = Object.keys(choices).join(','); + } + result = '{' + choices + '}'; + } else { + result = metavarDefault; + } + + return function (size) { + if (Array.isArray(result)) { + return result; + } + + var metavars = []; + for (var i = 0; i < size; i += 1) { + metavars.push(result); + } + return metavars; + }; +}; + +HelpFormatter.prototype._formatArgs = function (action, metavarDefault) { + var result; + var metavars; + + var buildMetavar = this._metavarFormatter(action, metavarDefault); + + switch (action.nargs) { + /*eslint-disable no-undefined*/ + case undefined: + case null: + metavars = buildMetavar(1); + result = '' + metavars[0]; + break; + case c.OPTIONAL: + metavars = buildMetavar(1); + result = '[' + metavars[0] + ']'; + break; + case c.ZERO_OR_MORE: + metavars = buildMetavar(2); + result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]'; + break; + case c.ONE_OR_MORE: + metavars = buildMetavar(2); + result = '' + metavars[0] + ' [' + metavars[1] + ' ...]'; + break; + case c.REMAINDER: + result = '...'; + break; + case c.PARSER: + metavars = buildMetavar(1); + result = metavars[0] + ' ...'; + break; + default: + metavars = buildMetavar(action.nargs); + result = metavars.join(' '); + } + return result; +}; + +HelpFormatter.prototype._expandHelp = function (action) { + var params = { prog: this._prog }; + + Object.keys(action).forEach(function (actionProperty) { + var actionValue = action[actionProperty]; + + if (actionValue !== c.SUPPRESS) { + params[actionProperty] = actionValue; + } + }); + + if (params.choices) { + if (typeof params.choices === 'string') { + params.choices = params.choices.split('').join(', '); + } else if (Array.isArray(params.choices)) { + params.choices = params.choices.join(', '); + } else { + params.choices = Object.keys(params.choices).join(', '); + } + } + + return sprintf(this._getHelpString(action), params); +}; + +HelpFormatter.prototype._splitLines = function (text, width) { + var lines = []; + var delimiters = [ ' ', '.', ',', '!', '?' ]; + var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$'); + + text = text.replace(/[\n\|\t]/g, ' '); + + text = text.trim(); + text = text.replace(this._whitespaceMatcher, ' '); + + // Wraps the single paragraph in text (a string) so every line + // is at most width characters long. + text.split(c.EOL).forEach(function (line) { + if (width >= line.length) { + lines.push(line); + return; + } + + var wrapStart = 0; + var wrapEnd = width; + var delimiterIndex = 0; + while (wrapEnd <= line.length) { + if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) { + delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index; + wrapEnd = wrapStart + delimiterIndex + 1; + } + lines.push(line.substring(wrapStart, wrapEnd)); + wrapStart = wrapEnd; + wrapEnd += width; + } + if (wrapStart < line.length) { + lines.push(line.substring(wrapStart, wrapEnd)); + } + }); + + return lines; +}; + +HelpFormatter.prototype._fillText = function (text, width, indent) { + var lines = this._splitLines(text, width); + lines = lines.map(function (line) { + return indent + line; + }); + return lines.join(c.EOL); +}; + +HelpFormatter.prototype._getHelpString = function (action) { + return action.help; +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/namespace.js b/node_modules/gray-matter/node_modules/argparse/lib/namespace.js new file mode 100644 index 0000000..a860de9 --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/namespace.js @@ -0,0 +1,76 @@ +/** + * class Namespace + * + * Simple object for storing attributes. Implements equality by attribute names + * and values, and provides a simple string representation. + * + * See also [original guide][1] + * + * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object + **/ +'use strict'; + +var $$ = require('./utils'); + +/** + * new Namespace(options) + * - options(object): predefined propertis for result object + * + **/ +var Namespace = module.exports = function Namespace(options) { + $$.extend(this, options); +}; + +/** + * Namespace#isset(key) -> Boolean + * - key (string|number): property name + * + * Tells whenever `namespace` contains given `key` or not. + **/ +Namespace.prototype.isset = function (key) { + return $$.has(this, key); +}; + +/** + * Namespace#set(key, value) -> self + * -key (string|number|object): propery name + * -value (mixed): new property value + * + * Set the property named key with value. + * If key object then set all key properties to namespace object + **/ +Namespace.prototype.set = function (key, value) { + if (typeof (key) === 'object') { + $$.extend(this, key); + } else { + this[key] = value; + } + return this; +}; + +/** + * Namespace#get(key, defaultValue) -> mixed + * - key (string|number): property name + * - defaultValue (mixed): default value + * + * Return the property key or defaulValue if not set + **/ +Namespace.prototype.get = function (key, defaultValue) { + return !this[key] ? defaultValue : this[key]; +}; + +/** + * Namespace#unset(key, defaultValue) -> mixed + * - key (string|number): property name + * - defaultValue (mixed): default value + * + * Return data[key](and delete it) or defaultValue + **/ +Namespace.prototype.unset = function (key, defaultValue) { + var value = this[key]; + if (value !== null) { + delete this[key]; + return value; + } + return defaultValue; +}; diff --git a/node_modules/gray-matter/node_modules/argparse/lib/utils.js b/node_modules/gray-matter/node_modules/argparse/lib/utils.js new file mode 100644 index 0000000..4a9cf3e --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/lib/utils.js @@ -0,0 +1,57 @@ +'use strict'; + +exports.repeat = function (str, num) { + var result = ''; + for (var i = 0; i < num; i++) { result += str; } + return result; +}; + +exports.arrayEqual = function (a, b) { + if (a.length !== b.length) { return false; } + for (var i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { return false; } + } + return true; +}; + +exports.trimChars = function (str, chars) { + var start = 0; + var end = str.length - 1; + while (chars.indexOf(str.charAt(start)) >= 0) { start++; } + while (chars.indexOf(str.charAt(end)) >= 0) { end--; } + return str.slice(start, end + 1); +}; + +exports.capitalize = function (str) { + return str.charAt(0).toUpperCase() + str.slice(1); +}; + +exports.arrayUnion = function () { + var result = []; + for (var i = 0, values = {}; i < arguments.length; i++) { + var arr = arguments[i]; + for (var j = 0; j < arr.length; j++) { + if (!values[arr[j]]) { + values[arr[j]] = true; + result.push(arr[j]); + } + } + } + return result; +}; + +function has(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + +exports.has = has; + +exports.extend = function (dest, src) { + for (var i in src) { + if (has(src, i)) { dest[i] = src[i]; } + } +}; + +exports.trimEnd = function (str) { + return str.replace(/\s+$/g, ''); +}; diff --git a/node_modules/gray-matter/node_modules/argparse/package.json b/node_modules/gray-matter/node_modules/argparse/package.json new file mode 100644 index 0000000..62fba0a --- /dev/null +++ b/node_modules/gray-matter/node_modules/argparse/package.json @@ -0,0 +1,34 @@ +{ + "name": "argparse", + "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library", + "version": "1.0.10", + "keywords": [ + "cli", + "parser", + "argparse", + "option", + "args" + ], + "contributors": [ + "Eugene Shkuropat", + "Paul Jacobson" + ], + "files": [ + "index.js", + "lib/" + ], + "license": "MIT", + "repository": "nodeca/argparse", + "scripts": { + "test": "make test" + }, + "dependencies": { + "sprintf-js": "~1.0.2" + }, + "devDependencies": { + "eslint": "^2.13.1", + "istanbul": "^0.4.5", + "mocha": "^3.1.0", + "ndoc": "^5.0.1" + } +} diff --git a/node_modules/gray-matter/node_modules/js-yaml/LICENSE b/node_modules/gray-matter/node_modules/js-yaml/LICENSE new file mode 100644 index 0000000..09d3a29 --- /dev/null +++ b/node_modules/gray-matter/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/gray-matter/node_modules/js-yaml/README.md b/node_modules/gray-matter/node_modules/js-yaml/README.md new file mode 100644 index 0000000..246e563 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/README.md @@ -0,0 +1,299 @@ +JS-YAML - YAML 1.2 parser / writer for JavaScript +================================================= + +[![Build Status](https://travis-ci.org/nodeca/js-yaml.svg?branch=master)](https://travis-ci.org/nodeca/js-yaml) +[![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 +``` + + +### Bundled YAML library for browsers + +``` html + + + + +``` + +Browser support was done mostly for the online demo. If you find any errors - feel +free to send pull requests with fixes. Also note, that IE and other old browsers +needs [es5-shims](https://github.com/kriskowal/es5-shim) to operate. + +Notes: + +1. We have no resources to support browserified version. Don't expect it to be + well tested. Don't expect fast fixes if something goes wrong there. +2. `!!js/function` in browser bundle will not work by default. If you really need + it - load `esprima` parser first (via amd or directly). +3. `!!bin` in browser will return `Array`, because browsers do not support + node.js `Buffer` and adding Buffer shims is completely useless on practice. + + +API +--- + +Here we cover the most 'useful' methods. If you need advanced details (creating +your own tags), see [wiki](https://github.com/nodeca/js-yaml/wiki) and +[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.safeLoad(fs.readFileSync('/home/ixti/example.yml', 'utf8')); + console.log(doc); +} catch (e) { + console.log(e); +} +``` + + +### safeLoad (string [ , options ]) + +**Recommended loading way.** Parses `string` as single YAML document. Returns either a +plain object, a string or `undefined`, or throws `YAMLException` on error. By default, does +not support regexps, functions and undefined. This method is safe for untrusted data. + +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_SAFE_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_SAFE_SCHEMA` - all supported YAML types, without unsafe ones + (`!!js/undefined`, `!!js/regexp` and `!!js/function`): + http://yaml.org/type/ + - `DEFAULT_FULL_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. + + +### load (string [ , options ]) + +**Use with care with untrusted sources**. The same as `safeLoad()` but uses +`DEFAULT_FULL_SCHEMA` by default - adds some JavaScript-specific types: +`!!js/function`, `!!js/regexp` and `!!js/undefined`. For untrusted sources, you +must additionally validate object structure to avoid injections: + +``` javascript +const untrusted_code = '"toString": ! "function (){very_evil_thing();}"'; + +// I'm just converting that string, what could possibly go wrong? +require('js-yaml').load(untrusted_code) + '' +``` + + +### safeLoadAll (string [, iterator] [, options ]) + +Same as `safeLoad()`, but understands multi-document sources. Applies +`iterator` to each document if specified, or returns array of documents. + +``` javascript +const yaml = require('js-yaml'); + +yaml.safeLoadAll(data, function (doc) { + console.log(doc); +}); +``` + + +### loadAll (string [, iterator] [ , options ]) + +Same as `safeLoadAll()` but uses `DEFAULT_FULL_SCHEMA` by default. + + +### safeDump (object [ , options ]) + +Serializes `object` as a YAML document. Uses `DEFAULT_SAFE_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_SAFE_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. +- `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. + +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" -> "01", "052", "016172" + "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 +safeDump (object, { + 'styles': { + '!!null': 'canonical' // dump null as ~ + }, + 'sortKeys': true // sort object keys +}); +``` + +### dump (object [ , options ]) + +Same as `safeDump()` but without limits (uses `DEFAULT_FULL_SCHEMA` by default). + + +Supported YAML types +-------------------- + +The list of standard YAML tags and corresponding JavaScipt 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** + +``` +!!js/regexp /pattern/gim # RegExp +!!js/undefined '' # Undefined +!!js/function 'function () {...}' # Function +``` + +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/gray-matter/node_modules/js-yaml/bin/js-yaml.js b/node_modules/gray-matter/node_modules/js-yaml/bin/js-yaml.js new file mode 100755 index 0000000..e79186b --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/bin/js-yaml.js @@ -0,0 +1,132 @@ +#!/usr/bin/env node + + +'use strict'; + +/*eslint-disable no-console*/ + + +// stdlib +var fs = require('fs'); + + +// 3rd-party +var argparse = require('argparse'); + + +// internal +var yaml = require('..'); + + +//////////////////////////////////////////////////////////////////////////////// + + +var cli = new argparse.ArgumentParser({ + prog: 'js-yaml', + version: require('../package.json').version, + addHelp: true +}); + + +cli.addArgument([ '-c', '--compact' ], { + help: 'Display errors in compact mode', + action: 'storeTrue' +}); + + +// deprecated (not needed after we removed output colors) +// option suppressed, but not completely removed for compatibility +cli.addArgument([ '-j', '--to-json' ], { + help: argparse.Const.SUPPRESS, + dest: 'json', + action: 'storeTrue' +}); + + +cli.addArgument([ '-t', '--trace' ], { + help: 'Show stack trace on error', + action: 'storeTrue' +}); + +cli.addArgument([ 'file' ], { + help: 'File to read, utf-8 encoded without BOM', + nargs: '?', + defaultValue: '-' +}); + + +//////////////////////////////////////////////////////////////////////////////// + + +var options = cli.parseArgs(); + + +//////////////////////////////////////////////////////////////////////////////// + +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/gray-matter/node_modules/js-yaml/dist/js-yaml.js b/node_modules/gray-matter/node_modules/js-yaml/dist/js-yaml.js new file mode 100644 index 0000000..edd69ae --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/dist/js-yaml.js @@ -0,0 +1,4005 @@ +/*! js-yaml 3.14.2 https://github.com/nodeca/js-yaml */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.jsyaml = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i */ +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' +]; + +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; +} + +function State(options) { + this.schema = options['schema'] || DEFAULT_FULL_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.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 !== 0xFEFF /* 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 +// [24] b-line-feed ::= #xA /* LF */ +// [25] b-carriage-return ::= #xD /* CR */ +// [3] c-byte-order-mark ::= #xFEFF +function isNsChar(c) { + return isPrintable(c) && !isWhitespace(c) + // byte-order-mark + && c !== 0xFEFF + // b-char + && c !== CHAR_CARRIAGE_RETURN + && c !== CHAR_LINE_FEED; +} + +// Simplified test for values allowed after the first character in plain style. +function isPlainSafe(c, prev) { + // Uses a subset of nb-char - c-flow-indicator - ":" - "#" + // where nb-char ::= c-printable - b-char - c-byte-order-mark. + return isPrintable(c) && c !== 0xFEFF + // - 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 + // - ":" - "#" + // /* An ns-char preceding */ "#" + && c !== CHAR_COLON + && ((c !== CHAR_SHARP) || (prev && isNsChar(prev))); +} + +// 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. + return isPrintable(c) && c !== 0xFEFF + && !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; +} + +// 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) { + var i; + var char, prev_char; + 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(string.charCodeAt(0)) + && !isWhitespace(string.charCodeAt(string.length - 1)); + + if (singleLineOnly) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. + for (i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + prev_char = i > 0 ? string.charCodeAt(i - 1) : null; + plain = plain && isPlainSafe(char, prev_char); + } + } else { + // Case: block styles permitted. + for (i = 0; i < string.length; i++) { + char = string.charCodeAt(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; + } + prev_char = i > 0 ? string.charCodeAt(i - 1) : null; + plain = plain && isPlainSafe(char, prev_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. + return plain && !testAmbiguousType(string) + ? STYLE_PLAIN : 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. + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; +} + +// 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) { + state.dump = (function () { + if (string.length === 0) { + return "''"; + } + if (!state.noCompatMode && + DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { + return "'" + 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)) { + 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, nextChar; + var escapeSeq; + + for (var i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). + if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) { + nextChar = string.charCodeAt(i + 1); + if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) { + // Combine the surrogate pair and store it escaped. + result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); + // Advance index one extra since we already used that char here. + i++; continue; + } + } + escapeSeq = ESCAPE_SEQUENCES[char]; + result += !escapeSeq && isPrintable(char) + ? string[i] + : escapeSeq || encodeHex(char); + } + + return result; +} + +function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length; + + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level, object[index], false, false)) { + if (index !== 0) _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; + + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level + 1, object[index], true, true)) { + if (!compact || index !== 0) { + _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 (index !== 0) pairBuffer += ', '; + + if (state.condenseFlow) pairBuffer += '"'; + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + 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 || index !== 0) { + pairBuffer += generateNextLine(state, level); + } + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + 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))) { + + state.tag = explicit ? type.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) { + state.tag = null; + state.dump = object; + + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + + var type = _toString.call(state.dump); + + 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]') { + var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level; + if (block && (state.dump.length !== 0)) { + writeBlockSequence(state, arrayLevel, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, arrayLevel, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object String]') { + if (state.tag !== '?') { + writeScalar(state, state.dump, level, iskey); + } + } else { + if (state.skipInvalid) return false; + throw new YAMLException('unacceptable kind of an object to dump ' + type); + } + + if (state.tag !== null && state.tag !== '?') { + state.dump = '!<' + state.tag + '> ' + 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); + + if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; + + return ''; +} + +function safeDump(input, options) { + return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + +module.exports.dump = dump; +module.exports.safeDump = safeDump; + +},{"./common":2,"./exception":4,"./schema/default_full":9,"./schema/default_safe":10}],4:[function(require,module,exports){ +// YAML error class. http://stackoverflow.com/questions/8458984 +// +'use strict'; + +function YAMLException(reason, mark) { + // Super constructor + Error.call(this); + + this.name = 'YAMLException'; + this.reason = reason; + this.mark = mark; + this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); + + // 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) { + var result = this.name + ': '; + + result += this.reason || '(unknown reason)'; + + if (!compact && this.mark) { + result += ' ' + this.mark.toString(); + } + + return result; +}; + + +module.exports = YAMLException; + +},{}],5:[function(require,module,exports){ +'use strict'; + +/*eslint-disable max-len,no-use-before-define*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var Mark = require('./mark'); +var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); +var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); + + +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 + ); +} + +// set a property of a literal object, while protecting against prototype pollution, +// see https://github.com/nodeca/js-yaml/issues/164 for more details +function setProperty(object, key, value) { + // used for this specific key only because Object.defineProperty is slow + if (key === '__proto__') { + Object.defineProperty(object, key, { + configurable: true, + enumerable: true, + writable: true, + value: value + }); + } else { + object[key] = value; + } +} + +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_FULL_SCHEMA; + this.onWarning = options['onWarning'] || null; + 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; + + this.documents = []; + + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ + +} + + +function generateError(state, message) { + return new YAMLException( + message, + new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart))); +} + +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'); + } + + 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)) { + setProperty(destination, key, source[key]); + overridableKeys[key] = true; + } + } +} + +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, 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.position = startPos || state.position; + throwError(state, 'duplicated mapping key'); + } + setProperty(_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; +} + +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + 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, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = {}, + 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'); + } + + 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; + 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); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); + } 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; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + + 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, + _pos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = {}, + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. + _pos = state.position; + + // + // 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); + 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 if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + + 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); + 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`. + } + + } else { + break; // Reading is done. Go to the epilogue. + } + + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + 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, _line, _pos); + keyTag = keyNode = valueNode = null; + } + + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + + if (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); + } + + // 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); + } + + 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 && state.tag !== '!') { + 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 (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) { + type = state.typeMap[state.kind || 'fallback'][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.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); + } else { + state.result = type.construct(state.result); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else { + throwError(state, 'unknown tag !<' + state.tag + '>'); + } + } + + 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 = {}; + state.anchorMap = {}; + + 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'); +} + + +function safeLoadAll(input, iterator, options) { + if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + + return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + + +function safeLoad(input, options) { + return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + + +module.exports.loadAll = loadAll; +module.exports.load = load; +module.exports.safeLoadAll = safeLoadAll; +module.exports.safeLoad = safeLoad; + +},{"./common":2,"./exception":4,"./mark":6,"./schema/default_full":9,"./schema/default_safe":10}],6:[function(require,module,exports){ +'use strict'; + + +var common = require('./common'); + + +function Mark(name, buffer, position, line, column) { + this.name = name; + this.buffer = buffer; + this.position = position; + this.line = line; + this.column = column; +} + + +Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { + var head, start, tail, end, snippet; + + if (!this.buffer) return null; + + indent = indent || 4; + maxLength = maxLength || 75; + + head = ''; + start = this.position; + + while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) { + start -= 1; + if (this.position - start > (maxLength / 2 - 1)) { + head = ' ... '; + start += 5; + break; + } + } + + tail = ''; + end = this.position; + + while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) { + end += 1; + if (end - this.position > (maxLength / 2 - 1)) { + tail = ' ... '; + end -= 5; + break; + } + } + + snippet = this.buffer.slice(start, end); + + return common.repeat(' ', indent) + head + snippet + tail + '\n' + + common.repeat(' ', indent + this.position - start + head.length) + '^'; +}; + + +Mark.prototype.toString = function toString(compact) { + var snippet, where = ''; + + if (this.name) { + where += 'in "' + this.name + '" '; + } + + where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); + + if (!compact) { + snippet = this.getSnippet(); + + if (snippet) { + where += ':\n' + snippet; + } + } + + return where; +}; + + +module.exports = Mark; + +},{"./common":2}],7:[function(require,module,exports){ +'use strict'; + +/*eslint-disable max-len*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var Type = require('./type'); + + +function compileList(schema, name, result) { + var exclude = []; + + schema.include.forEach(function (includedSchema) { + result = compileList(includedSchema, name, result); + }); + + schema[name].forEach(function (currentType) { + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) { + exclude.push(previousIndex); + } + }); + + result.push(currentType); + }); + + return result.filter(function (type, index) { + return exclude.indexOf(index) === -1; + }); +} + + +function compileMap(/* lists... */) { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {} + }, index, length; + + function collectType(type) { + 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) { + this.include = definition.include || []; + this.implicit = definition.implicit || []; + this.explicit = definition.explicit || []; + + this.implicit.forEach(function (type) { + 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.'); + } + }); + + this.compiledImplicit = compileList(this, 'implicit', []); + this.compiledExplicit = compileList(this, 'explicit', []); + this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); +} + + +Schema.DEFAULT = null; + + +Schema.create = function createSchema() { + var schemas, types; + + switch (arguments.length) { + case 1: + schemas = Schema.DEFAULT; + types = arguments[0]; + break; + + case 2: + schemas = arguments[0]; + types = arguments[1]; + break; + + default: + throw new YAMLException('Wrong number of arguments for Schema.create function'); + } + + schemas = common.toArray(schemas); + types = common.toArray(types); + + if (!schemas.every(function (schema) { return schema instanceof Schema; })) { + throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); + } + + if (!types.every(function (type) { return type instanceof Type; })) { + throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + + return new Schema({ + include: schemas, + explicit: types + }); +}; + + +module.exports = Schema; + +},{"./common":2,"./exception":4,"./type":13}],8:[function(require,module,exports){ +// 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'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + include: [ + require('./json') + ] +}); + +},{"../schema":7,"./json":12}],9:[function(require,module,exports){ +// JS-YAML's default schema for `load` function. +// It is not described in the YAML specification. +// +// This schema is based on JS-YAML's default safe schema and includes +// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function. +// +// Also this schema is used as default base schema at `Schema.create` function. + + +'use strict'; + + +var Schema = require('../schema'); + + +module.exports = Schema.DEFAULT = new Schema({ + include: [ + require('./default_safe') + ], + explicit: [ + require('../type/js/undefined'), + require('../type/js/regexp'), + require('../type/js/function') + ] +}); + +},{"../schema":7,"../type/js/function":18,"../type/js/regexp":19,"../type/js/undefined":20,"./default_safe":10}],10:[function(require,module,exports){ +// 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'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + include: [ + require('./core') + ], + implicit: [ + require('../type/timestamp'), + require('../type/merge') + ], + explicit: [ + require('../type/binary'), + require('../type/omap'), + require('../type/pairs'), + require('../type/set') + ] +}); + +},{"../schema":7,"../type/binary":14,"../type/merge":22,"../type/omap":24,"../type/pairs":25,"../type/set":27,"../type/timestamp":29,"./core":8}],11:[function(require,module,exports){ +// 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') + ] +}); + +},{"../schema":7,"../type/map":21,"../type/seq":26,"../type/str":28}],12:[function(require,module,exports){ +// 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'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + include: [ + require('./failsafe') + ], + implicit: [ + require('../type/null'), + require('../type/bool'), + require('../type/int'), + require('../type/float') + ] +}); + +},{"../schema":7,"../type/bool":15,"../type/float":16,"../type/int":17,"../type/null":23,"./failsafe":11}],13:[function(require,module,exports){ +'use strict'; + +var YAMLException = require('./exception'); + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + '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.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.defaultStyle = options['defaultStyle'] || null; + 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; + +},{"./exception":4}],14:[function(require,module,exports){ +'use strict'; + +/*eslint-disable no-bitwise*/ + +var NodeBuffer; + +try { + // A trick for browserified version, to not include `Buffer` shim + var _require = require; + NodeBuffer = _require('buffer').Buffer; +} catch (__) {} + +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); + } + + // Wrap into Buffer for NodeJS and leave Array for browser + if (NodeBuffer) { + // Support node 6.+ Buffer API when available + return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); + } + + return 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(object) { + return NodeBuffer && NodeBuffer.isBuffer(object); +} + +module.exports = new Type('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); + +},{"../type":13}],15:[function(require,module,exports){ +'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' +}); + +},{"../type":13}],16:[function(require,module,exports){ +'use strict'; + +var common = require('../common'); +var Type = require('../type'); + +var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // 20:59 + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[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, base, digits; + + value = data.replace(/_/g, '').toLowerCase(); + sign = value[0] === '-' ? -1 : 1; + digits = []; + + 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; + + } else if (value.indexOf(':') >= 0) { + value.split(':').forEach(function (v) { + digits.unshift(parseFloat(v, 10)); + }); + + value = 0.0; + base = 1; + + digits.forEach(function (d) { + value += d * base; + base *= 60; + }); + + return sign * value; + + } + 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' +}); + +},{"../common":2,"../type":13}],17:[function(require,module,exports){ +'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 !== '_'; + } + + // base 8 + 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) or base 60 + + // value should not start with `_`; + if (ch === '_') return false; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch === ':') break; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } + + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; + + // if !base60 - done; + if (ch !== ':') return true; + + // base60 almost not used, no needs to optimize + return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); +} + +function constructYamlInteger(data) { + var value = data, sign = 1, ch, base, digits = []; + + 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, 16); + return sign * parseInt(value, 8); + } + + if (value.indexOf(':') !== -1) { + value.split(':').forEach(function (v) { + digits.unshift(parseInt(v, 10)); + }); + + value = 0; + base = 1; + + digits.forEach(function (d) { + value += (d * base); + base *= 60; + }); + + return sign * value; + + } + + 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 ? '0' + obj.toString(8) : '-0' + 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' ] + } +}); + +},{"../common":2,"../type":13}],18:[function(require,module,exports){ +'use strict'; + +var esprima; + +// Browserified version does not have esprima +// +// 1. For node.js just require module as deps +// 2. For browser try to require mudule via external AMD system. +// If not found - try to fallback to window.esprima. If not +// found too - then fail to parse. +// +try { + // workaround to exclude package from browserify list. + var _require = require; + esprima = _require('esprima'); +} catch (_) { + /* eslint-disable no-redeclare */ + /* global window */ + if (typeof window !== 'undefined') esprima = window.esprima; +} + +var Type = require('../../type'); + +function resolveJavascriptFunction(data) { + if (data === null) return false; + + try { + var source = '(' + data + ')', + ast = esprima.parse(source, { range: true }); + + if (ast.type !== 'Program' || + ast.body.length !== 1 || + ast.body[0].type !== 'ExpressionStatement' || + (ast.body[0].expression.type !== 'ArrowFunctionExpression' && + ast.body[0].expression.type !== 'FunctionExpression')) { + return false; + } + + return true; + } catch (err) { + return false; + } +} + +function constructJavascriptFunction(data) { + /*jslint evil:true*/ + + var source = '(' + data + ')', + ast = esprima.parse(source, { range: true }), + params = [], + body; + + if (ast.type !== 'Program' || + ast.body.length !== 1 || + ast.body[0].type !== 'ExpressionStatement' || + (ast.body[0].expression.type !== 'ArrowFunctionExpression' && + ast.body[0].expression.type !== 'FunctionExpression')) { + throw new Error('Failed to resolve function'); + } + + ast.body[0].expression.params.forEach(function (param) { + params.push(param.name); + }); + + body = ast.body[0].expression.body.range; + + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. + if (ast.body[0].expression.body.type === 'BlockStatement') { + /*eslint-disable no-new-func*/ + return new Function(params, source.slice(body[0] + 1, body[1] - 1)); + } + // ES6 arrow functions can omit the BlockStatement. In that case, just return + // the body. + /*eslint-disable no-new-func*/ + return new Function(params, 'return ' + source.slice(body[0], body[1])); +} + +function representJavascriptFunction(object /*, style*/) { + return object.toString(); +} + +function isFunction(object) { + return Object.prototype.toString.call(object) === '[object Function]'; +} + +module.exports = new Type('tag:yaml.org,2002:js/function', { + kind: 'scalar', + resolve: resolveJavascriptFunction, + construct: constructJavascriptFunction, + predicate: isFunction, + represent: representJavascriptFunction +}); + +},{"../../type":13}],19:[function(require,module,exports){ +'use strict'; + +var Type = require('../../type'); + +function resolveJavascriptRegExp(data) { + if (data === null) return false; + if (data.length === 0) return false; + + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars + if (regexp[0] === '/') { + if (tail) modifiers = tail[1]; + + if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated + if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; + } + + return true; +} + +function constructJavascriptRegExp(data) { + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + + // `/foo/gim` - tail can be maximum 4 chars + if (regexp[0] === '/') { + if (tail) modifiers = tail[1]; + regexp = regexp.slice(1, regexp.length - modifiers.length - 1); + } + + return new RegExp(regexp, modifiers); +} + +function representJavascriptRegExp(object /*, style*/) { + var result = '/' + object.source + '/'; + + if (object.global) result += 'g'; + if (object.multiline) result += 'm'; + if (object.ignoreCase) result += 'i'; + + return result; +} + +function isRegExp(object) { + return Object.prototype.toString.call(object) === '[object RegExp]'; +} + +module.exports = new Type('tag:yaml.org,2002:js/regexp', { + kind: 'scalar', + resolve: resolveJavascriptRegExp, + construct: constructJavascriptRegExp, + predicate: isRegExp, + represent: representJavascriptRegExp +}); + +},{"../../type":13}],20:[function(require,module,exports){ +'use strict'; + +var Type = require('../../type'); + +function resolveJavascriptUndefined() { + return true; +} + +function constructJavascriptUndefined() { + /*eslint-disable no-undefined*/ + return undefined; +} + +function representJavascriptUndefined() { + return ''; +} + +function isUndefined(object) { + return typeof object === 'undefined'; +} + +module.exports = new Type('tag:yaml.org,2002:js/undefined', { + kind: 'scalar', + resolve: resolveJavascriptUndefined, + construct: constructJavascriptUndefined, + predicate: isUndefined, + represent: representJavascriptUndefined +}); + +},{"../../type":13}],21:[function(require,module,exports){ +'use strict'; + +var Type = require('../type'); + +module.exports = new Type('tag:yaml.org,2002:map', { + kind: 'mapping', + construct: function (data) { return data !== null ? data : {}; } +}); + +},{"../type":13}],22:[function(require,module,exports){ +'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 +}); + +},{"../type":13}],23:[function(require,module,exports){ +'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'; } + }, + defaultStyle: 'lowercase' +}); + +},{"../type":13}],24:[function(require,module,exports){ +'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 +}); + +},{"../type":13}],25:[function(require,module,exports){ +'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 +}); + +},{"../type":13}],26:[function(require,module,exports){ +'use strict'; + +var Type = require('../type'); + +module.exports = new Type('tag:yaml.org,2002:seq', { + kind: 'sequence', + construct: function (data) { return data !== null ? data : []; } +}); + +},{"../type":13}],27:[function(require,module,exports){ +'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 +}); + +},{"../type":13}],28:[function(require,module,exports){ +'use strict'; + +var Type = require('../type'); + +module.exports = new Type('tag:yaml.org,2002:str', { + kind: 'scalar', + construct: function (data) { return data !== null ? data : ''; } +}); + +},{"../type":13}],29:[function(require,module,exports){ +'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 +}); + +},{"../type":13}],"/":[function(require,module,exports){ +'use strict'; + + +var yaml = require('./lib/js-yaml.js'); + + +module.exports = yaml; + +},{"./lib/js-yaml.js":1}]},{},[])("/") +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/dist/js-yaml.min.js b/node_modules/gray-matter/node_modules/js-yaml/dist/js-yaml.min.js new file mode 100644 index 0000000..66cc94e --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/dist/js-yaml.min.js @@ -0,0 +1 @@ +/*! js-yaml 3.14.2 https://github.com/nodeca/js-yaml */!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jsyaml=e()}(function(){return function i(r,o,a){function s(t,e){if(!o[t]){if(!r[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}n=o[t]={exports:{}},r[t][0].call(n.exports,function(e){return s(r[t][1][e]||e)},n,n.exports,i,r,o,a)}return o[t].exports}for(var c="function"==typeof require&&require,e=0;e{var n,i,r,o,a,s,c;if(null===t)return{};for(n={},r=0,o=(i=Object.keys(t)).length;r{if(0===i.length)return"''";if(!o.noCompatMode&&-1!==Q.indexOf(i))return"'"+i+"'";var e=o.indent*Math.max(1,r),t=-1===o.lineWidth?-1:Math.max(Math.min(o.lineWidth,40),o.lineWidth-e),n=a||-1=o.flowLevel;switch(ee(i,n,o.indent,t,function(e){for(var t=o,n=e,i=0,r=t.implicitTypes.length;i"+p(i,o.indent)+f(u(((t,n)=>{for(var e,i=/(\n+)([^\n]*)/g,r=(()=>{var e=-1!==(e=t.indexOf("\n"))?e:t.length;return i.lastIndex=e,d(t.slice(0,e),n)})(),o="\n"===t[0]||" "===t[0];s=i.exec(t);){var a=s[1],s=s[2];e=" "===s[0],r+=a+(o||e||""===s?"":"\n")+d(s,n),o=e}return r})(i,t),e));case E:return'"'+(e=>{for(var t,n,i="",r=0;rt&&o tag resolver accepts not "'+o+'" style');i=r.represent[o](t,o)}e.dump=i}return 1}}function Z(e,t,n,i,r,D){e.tag=null,e.dump=n,V(e,n,!1)||V(e,n,!0);var o,a,s=$.call(e.dump),c=(i=i&&(e.flowLevel<0||e.flowLevel>t),"[object Object]"===s||"[object Array]"===s);if(c&&(a=-1!==(o=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||a||2!==e.indent&&0 "+e.dump)}return 1}function ne(e,t){var n,i,r=[],o=[];for(!function e(t,n,i){var r,o,a;if(null!==t&&"object"==typeof t)if(-1!==(o=n.indexOf(t)))-1===i.indexOf(o)&&i.push(o);else if(n.push(t),Array.isArray(t))for(o=0,a=t.length;o>10),56320+(c-65536&1023)),e.position++}else O(e,"unknown escape sequence");n=i=e.position}else k(l)?(_(e,n,i,!0),U(e,L(e,!1,t)),n=i=e.position):e.position===e.lineStart&&D(e)?O(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}O(e,"unexpected end of the stream within a double quoted scalar")}}function $(e,t){var n,i,r=e.tag,o=e.anchor,a=[],s=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),i=e.input.charCodeAt(e.position);0!==i&&45===i&&S(e.input.charCodeAt(e.position+1));)if(s=!0,e.position++,L(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,q(e,t,x,!1,!0),a.push(e.result),L(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)O(e,"bad indentation of a sequence entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndent{var t,n,i,r=!1,o=!1,a=e.input.charCodeAt(e.position);if(33===a){if(null!==e.tag&&O(e,"duplication of a tag property"),60===(a=e.input.charCodeAt(++e.position))?(r=!0,a=e.input.charCodeAt(++e.position)):33===a?(o=!0,n="!!",a=e.input.charCodeAt(++e.position)):n="!",t=e.position,r){for(;0!==(a=e.input.charCodeAt(++e.position))&&62!==a;);e.position{var t,n=e.input.charCodeAt(e.position);if(38===n){for(null!==e.anchor&&O(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!S(n)&&!I(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&O(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),1}})(e);)L(e,!0,-1)?(f=!0,s=o,e.lineIndent>t?p=1:e.lineIndent===t?p=0:e.lineIndent{var i,r,o,a,s,c=e.tag,l=e.anchor,u={},p={},f=null,d=null,h=null,m=!1,g=!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=u),s=e.input.charCodeAt(e.position);0!==s;){if(i=e.input.charCodeAt(e.position+1),o=e.line,a=e.position,63!==s&&58!==s||!S(i)){if(!q(e,n,y,!1,!0))break;if(e.line===o){for(s=e.input.charCodeAt(e.position);j(s);)s=e.input.charCodeAt(++e.position);if(58===s)S(s=e.input.charCodeAt(++e.position))||O(e,"a whitespace character is expected after the key-value separator within a block mapping"),m&&(M(e,u,p,f,d,null),f=d=h=null),r=m=!(g=!0),f=e.tag,d=e.result;else{if(!g)return e.tag=c,e.anchor=l,1;O(e,"can not read an implicit mapping pair; a colon is missed")}}else{if(!g)return e.tag=c,e.anchor=l,1;O(e,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===s?(m&&(M(e,u,p,f,d,null),f=d=h=null),r=m=g=!0):m?r=!(m=!1):O(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,s=i;if((e.line===o||e.lineIndent>t)&&(q(e,t,A,!0,r)&&(m?d=e.result:h=e.result),m||(M(e,u,p,f,d,h,o,a),f=d=h=null),L(e,!0,-1),s=e.input.charCodeAt(e.position)),t{var n,i,r,o,a,s,c,l,u,p=!0,f=e.tag,d=e.anchor,h={},m=e.input.charCodeAt(e.position);if(91===m)s=!(r=93),i=[];else{if(123!==m)return;r=125,s=!0,i={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),m=e.input.charCodeAt(++e.position);0!==m;){if(L(e,!0,t),(m=e.input.charCodeAt(e.position))===r)return e.position++,e.tag=f,e.anchor=d,e.kind=s?"mapping":"sequence",e.result=i,1;p||O(e,"missed comma between flow collection entries"),u=null,o=a=!1,63===m&&S(e.input.charCodeAt(e.position+1))&&(o=a=!0,e.position++,L(e,!0,t)),n=e.line,q(e,t,g,!1,!0),l=e.tag,c=e.result,L(e,!0,t),m=e.input.charCodeAt(e.position),!a&&e.line!==n||58!==m||(o=!0,m=e.input.charCodeAt(++e.position),L(e,!0,t),q(e,t,g,!1,!0),u=e.result),s?M(e,i,h,l,c,u):o?i.push(M(e,null,h,l,c,u)):i.push(c),L(e,!0,t),44===(m=e.input.charCodeAt(e.position))?(p=!0,m=e.input.charCodeAt(++e.position)):p=!1}O(e,"unexpected end of the stream within a flow collection")})(e,i)?d=!0:(a&&((e,t)=>{var n,i,r,o=b,a=!1,s=!1,c=t,l=0,u=!1,p=e.input.charCodeAt(e.position);if(124===p)i=!1;else{if(62!==p)return;i=!0}for(e.kind="scalar",e.result="";0!==p;)if(43===(p=e.input.charCodeAt(++e.position))||45===p)b===o?o=43===p?v:Y:O(e,"repeat of a chomping mode identifier");else{if(!(0<=(r=48<=(r=p)&&r<=57?r-48:-1)))break;0==r?O(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?O(e,"repeat of an indentation width identifier"):(c=t+r-1,s=!0)}if(j(p)){for(;j(p=e.input.charCodeAt(++e.position)););if(35===p)for(;!k(p=e.input.charCodeAt(++e.position))&&0!==p;);}for(;0!==p;){for(T(e),e.lineIndent=0,p=e.input.charCodeAt(e.position);(!s||e.lineIndentc&&(c=e.lineIndent),k(p))l++;else{if(e.lineIndent{var n,i,r=e.input.charCodeAt(e.position);if(39===r){for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(r=e.input.charCodeAt(e.position));)if(39===r){if(_(e,n,e.position,!0),39!==(r=e.input.charCodeAt(++e.position)))return 1;n=e.position,e.position++,i=e.position}else k(r)?(_(e,n,i,!0),U(e,L(e,!1,t)),n=i=e.position):e.position===e.lineStart&&D(e)?O(e,"unexpected end of the document within a single quoted scalar"):(e.position++,i=e.position);O(e,"unexpected end of the stream within a single quoted scalar")}})(e,i)||K(e,i)?d=!0:(e=>{var t,n=e.input.charCodeAt(e.position);if(42===n){for(n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!S(n)&&!I(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&O(e,"name of an alias node must contain at least one character"),t=e.input.slice(t,e.position),m.call(e.anchorMap,t)||O(e,'unidentified alias "'+t+'"'),e.result=e.anchorMap[t],L(e,!0,-1),1}})(e)?(d=!0,null===e.tag&&null===e.anchor||O(e,"alias node should not have any properties")):((e,t,n)=>{var i,r,o,a,s,c,l,u=e.kind,p=e.result,f=e.input.charCodeAt(e.position);if(!S(f)&&!I(f)&&35!==f&&38!==f&&42!==f&&33!==f&&124!==f&&62!==f&&39!==f&&34!==f&&37!==f&&64!==f&&96!==f&&(63!==f&&45!==f||!(S(i=e.input.charCodeAt(e.position+1))||n&&I(i)))){for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==f;){if(58===f){if(S(i=e.input.charCodeAt(e.position+1))||n&&I(i))break}else if(35===f){if(S(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&D(e)||n&&I(f))break;if(k(f)){if(s=e.line,c=e.lineStart,l=e.lineIndent,L(e,!1,-1),t<=e.lineIndent){a=!0,f=e.input.charCodeAt(e.position);continue}e.position=o,e.line=s,e.lineStart=c,e.lineIndent=l;break}}a&&(_(e,r,o,!1),U(e,e.line-s),r=o=e.position,a=!1),j(f)||(o=e.position+1),f=e.input.charCodeAt(++e.position)}if(_(e,r,o,!1),e.result)return 1;e.kind=u,e.result=p}})(e,i,g===n)&&(d=!0,null===e.tag)&&(e.tag="?"),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===p&&(d=s&&$(e,r))),null!==e.tag&&"!"!==e.tag)if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&O(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),c=0,l=e.implicitTypes.length;c tag; it should be "'+u.kind+'", not "'+e.kind+'"'),u.resolve(e.result)?(e.result=u.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):O(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):O(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||d}function H(e,t){t=t||{};var n=new W(e=0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+="\n"),65279===e.charCodeAt(0))?e.slice(1):e,t),t=e.indexOf("\0");for(-1!==t&&(n.position=t,O(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.positiont/2-1){n=" ... ",i+=5;break}for(r="",o=this.position;ot/2-1){r=" ... ",o-=5;break}return a=this.buffer.slice(i,o),s.repeat(" ",e)+n+a+r+"\n"+s.repeat(" ",e+this.position-i+n.length)+"^"},i.prototype.toString=function(e){var t="";return this.name&&(t+='in "'+this.name+'" '),t+="at line "+(this.line+1)+", column "+(this.column+1),e||(e=this.getSnippet())&&(t+=":\n"+e),t},t.exports=i},{"./common":2}],7:[function(e,t,n){var i=e("./common"),r=e("./exception"),o=e("./type");function a(e,t,i){var r=[];return e.include.forEach(function(e){i=a(e,t,i)}),e[t].forEach(function(n){i.forEach(function(e,t){e.tag===n.tag&&e.kind===n.kind&&r.push(t)}),i.push(n)}),i.filter(function(e,t){return-1===r.indexOf(t)})}function s(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new r("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=a(this,"implicit",[]),this.compiledExplicit=a(this,"explicit",[]),this.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{}};function i(e){n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e>16&255),o.push(r>>8&255),o.push(255&r)),r=r<<6|i.indexOf(t.charAt(a));return 0==(e=n%4*6)?(o.push(r>>16&255),o.push(r>>8&255),o.push(255&r)):18==e?(o.push(r>>10&255),o.push(r>>2&255)):12==e&&o.push(r>>4&255),s?s.from?s.from(o):new s(o):o},predicate:function(e){return s&&s.isBuffer(e)},represent:function(e){for(var t,n="",i=0,r=e.length,o=c,a=0;a>18&63]+o[i>>12&63])+o[i>>6&63]+o[63&i]),i=(i<<8)+e[a];return 0==(t=r%3)?n=(n=n+o[i>>18&63]+o[i>>12&63])+o[i>>6&63]+o[63&i]:2==t?n=(n=n+o[i>>10&63]+o[i>>4&63])+o[i<<2&63]+o[64]:1==t&&(n=(n=n+o[i>>2&63]+o[i<<4&63])+o[64]+o[64]),n}})},{"../type":13}],15:[function(e,t,n){e=e("../type");t.exports=new e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){var t;return null!==e&&(4===(t=e.length)&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e))},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":13}],16:[function(e,t,n){var i=e("../common"),e=e("../type"),r=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var o=/^[-+]?[0-9]+e/;t.exports=new e("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!r.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n=e.replace(/_/g,"").toLowerCase(),e="-"===n[0]?-1:1,i=[];return".inf"===(n=0<="+-".indexOf(n[0])?n.slice(1):n)?1==e?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===n?NaN:0<=n.indexOf(":")?(n.split(":").forEach(function(e){i.unshift(parseFloat(e,10))}),n=0,t=1,i.forEach(function(e){n+=e*t,t*=60}),e*n):e*parseFloat(n,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||i.isNegativeZero(e))},represent:function(e,t){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(i.isNegativeZero(e))return"-0.0";return t=e.toString(10),o.test(t)?t.replace("e",".e"):t},defaultStyle:"lowercase"})},{"../common":2,"../type":13}],17:[function(e,t,n){var i=e("../common"),e=e("../type");t.exports=new e("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i,r,o=e.length,a=0,s=!1;if(!o)return!1;if("0"===(t="-"!==(t=e[a])&&"+"!==t?t:e[++a])){if(a+1===o)return!0;if("b"===(t=e[++a])){for(a++;a */ +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' +]; + +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; +} + +function State(options) { + this.schema = options['schema'] || DEFAULT_FULL_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.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 !== 0xFEFF /* 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 +// [24] b-line-feed ::= #xA /* LF */ +// [25] b-carriage-return ::= #xD /* CR */ +// [3] c-byte-order-mark ::= #xFEFF +function isNsChar(c) { + return isPrintable(c) && !isWhitespace(c) + // byte-order-mark + && c !== 0xFEFF + // b-char + && c !== CHAR_CARRIAGE_RETURN + && c !== CHAR_LINE_FEED; +} + +// Simplified test for values allowed after the first character in plain style. +function isPlainSafe(c, prev) { + // Uses a subset of nb-char - c-flow-indicator - ":" - "#" + // where nb-char ::= c-printable - b-char - c-byte-order-mark. + return isPrintable(c) && c !== 0xFEFF + // - 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 + // - ":" - "#" + // /* An ns-char preceding */ "#" + && c !== CHAR_COLON + && ((c !== CHAR_SHARP) || (prev && isNsChar(prev))); +} + +// 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. + return isPrintable(c) && c !== 0xFEFF + && !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; +} + +// 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) { + var i; + var char, prev_char; + 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(string.charCodeAt(0)) + && !isWhitespace(string.charCodeAt(string.length - 1)); + + if (singleLineOnly) { + // Case: no block styles. + // Check for disallowed characters to rule out plain and single. + for (i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; + } + prev_char = i > 0 ? string.charCodeAt(i - 1) : null; + plain = plain && isPlainSafe(char, prev_char); + } + } else { + // Case: block styles permitted. + for (i = 0; i < string.length; i++) { + char = string.charCodeAt(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; + } + prev_char = i > 0 ? string.charCodeAt(i - 1) : null; + plain = plain && isPlainSafe(char, prev_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. + return plain && !testAmbiguousType(string) + ? STYLE_PLAIN : 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. + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; +} + +// 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) { + state.dump = (function () { + if (string.length === 0) { + return "''"; + } + if (!state.noCompatMode && + DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) { + return "'" + 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)) { + 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, nextChar; + var escapeSeq; + + for (var i = 0; i < string.length; i++) { + char = string.charCodeAt(i); + // Check for surrogate pairs (reference Unicode 3.0 section "3.7 Surrogates"). + if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) { + nextChar = string.charCodeAt(i + 1); + if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) { + // Combine the surrogate pair and store it escaped. + result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000); + // Advance index one extra since we already used that char here. + i++; continue; + } + } + escapeSeq = ESCAPE_SEQUENCES[char]; + result += !escapeSeq && isPrintable(char) + ? string[i] + : escapeSeq || encodeHex(char); + } + + return result; +} + +function writeFlowSequence(state, level, object) { + var _result = '', + _tag = state.tag, + index, + length; + + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level, object[index], false, false)) { + if (index !== 0) _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; + + for (index = 0, length = object.length; index < length; index += 1) { + // Write only valid elements. + if (writeNode(state, level + 1, object[index], true, true)) { + if (!compact || index !== 0) { + _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 (index !== 0) pairBuffer += ', '; + + if (state.condenseFlow) pairBuffer += '"'; + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + 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 || index !== 0) { + pairBuffer += generateNextLine(state, level); + } + + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + + 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))) { + + state.tag = explicit ? type.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) { + state.tag = null; + state.dump = object; + + if (!detectType(state, object, false)) { + detectType(state, object, true); + } + + var type = _toString.call(state.dump); + + 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]') { + var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level; + if (block && (state.dump.length !== 0)) { + writeBlockSequence(state, arrayLevel, state.dump, compact); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, arrayLevel, state.dump); + if (duplicate) { + state.dump = '&ref_' + duplicateIndex + ' ' + state.dump; + } + } + } else if (type === '[object String]') { + if (state.tag !== '?') { + writeScalar(state, state.dump, level, iskey); + } + } else { + if (state.skipInvalid) return false; + throw new YAMLException('unacceptable kind of an object to dump ' + type); + } + + if (state.tag !== null && state.tag !== '?') { + state.dump = '!<' + state.tag + '> ' + 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); + + if (writeNode(state, 0, input, true, true)) return state.dump + '\n'; + + return ''; +} + +function safeDump(input, options) { + return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + +module.exports.dump = dump; +module.exports.safeDump = safeDump; diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/exception.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/exception.js new file mode 100644 index 0000000..b744a1e --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/exception.js @@ -0,0 +1,43 @@ +// YAML error class. http://stackoverflow.com/questions/8458984 +// +'use strict'; + +function YAMLException(reason, mark) { + // Super constructor + Error.call(this); + + this.name = 'YAMLException'; + this.reason = reason; + this.mark = mark; + this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : ''); + + // 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) { + var result = this.name + ': '; + + result += this.reason || '(unknown reason)'; + + if (!compact && this.mark) { + result += ' ' + this.mark.toString(); + } + + return result; +}; + + +module.exports = YAMLException; diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/loader.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/loader.js new file mode 100644 index 0000000..0e1e43d --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/loader.js @@ -0,0 +1,1660 @@ +'use strict'; + +/*eslint-disable max-len,no-use-before-define*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var Mark = require('./mark'); +var DEFAULT_SAFE_SCHEMA = require('./schema/default_safe'); +var DEFAULT_FULL_SCHEMA = require('./schema/default_full'); + + +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 + ); +} + +// set a property of a literal object, while protecting against prototype pollution, +// see https://github.com/nodeca/js-yaml/issues/164 for more details +function setProperty(object, key, value) { + // used for this specific key only because Object.defineProperty is slow + if (key === '__proto__') { + Object.defineProperty(object, key, { + configurable: true, + enumerable: true, + writable: true, + value: value + }); + } else { + object[key] = value; + } +} + +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_FULL_SCHEMA; + this.onWarning = options['onWarning'] || null; + 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; + + this.documents = []; + + /* + this.version; + this.checkLineBreaks; + this.tagMap; + this.anchorMap; + this.tag; + this.anchor; + this.kind; + this.result;*/ + +} + + +function generateError(state, message) { + return new YAMLException( + message, + new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart))); +} + +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'); + } + + 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)) { + setProperty(destination, key, source[key]); + overridableKeys[key] = true; + } + } +} + +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, 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.position = startPos || state.position; + throwError(state, 'duplicated mapping key'); + } + setProperty(_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; +} + +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + 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, + _tag = state.tag, + _result, + _anchor = state.anchor, + following, + terminator, + isPair, + isExplicitPair, + isMapping, + overridableKeys = {}, + 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'); + } + + 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; + 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); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); + } 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; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + + 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, + _pos, + _tag = state.tag, + _anchor = state.anchor, + _result = {}, + overridableKeys = {}, + keyTag = null, + keyNode = null, + valueNode = null, + atExplicitKey = false, + detected = false, + ch; + + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + + ch = state.input.charCodeAt(state.position); + + while (ch !== 0) { + following = state.input.charCodeAt(state.position + 1); + _line = state.line; // Save the current line. + _pos = state.position; + + // + // 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); + 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 if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + + 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); + 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`. + } + + } else { + break; // Reading is done. Go to the epilogue. + } + + // + // Common reading code for both explicit and implicit notations. + // + if (state.line === _line || state.lineIndent > nodeIndent) { + 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, _line, _pos); + keyTag = keyNode = valueNode = null; + } + + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + + if (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); + } + + // 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); + } + + 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 && state.tag !== '!') { + 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 (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) { + type = state.typeMap[state.kind || 'fallback'][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.result` updated in resolver if matched + throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag'); + } else { + state.result = type.construct(state.result); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } + } + } else { + throwError(state, 'unknown tag !<' + state.tag + '>'); + } + } + + 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 = {}; + state.anchorMap = {}; + + 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'); +} + + +function safeLoadAll(input, iterator, options) { + if (typeof iterator === 'object' && iterator !== null && typeof options === 'undefined') { + options = iterator; + iterator = null; + } + + return loadAll(input, iterator, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + + +function safeLoad(input, options) { + return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options)); +} + + +module.exports.loadAll = loadAll; +module.exports.load = load; +module.exports.safeLoadAll = safeLoadAll; +module.exports.safeLoad = safeLoad; diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/mark.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/mark.js new file mode 100644 index 0000000..47b265c --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/mark.js @@ -0,0 +1,76 @@ +'use strict'; + + +var common = require('./common'); + + +function Mark(name, buffer, position, line, column) { + this.name = name; + this.buffer = buffer; + this.position = position; + this.line = line; + this.column = column; +} + + +Mark.prototype.getSnippet = function getSnippet(indent, maxLength) { + var head, start, tail, end, snippet; + + if (!this.buffer) return null; + + indent = indent || 4; + maxLength = maxLength || 75; + + head = ''; + start = this.position; + + while (start > 0 && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) { + start -= 1; + if (this.position - start > (maxLength / 2 - 1)) { + head = ' ... '; + start += 5; + break; + } + } + + tail = ''; + end = this.position; + + while (end < this.buffer.length && '\x00\r\n\x85\u2028\u2029'.indexOf(this.buffer.charAt(end)) === -1) { + end += 1; + if (end - this.position > (maxLength / 2 - 1)) { + tail = ' ... '; + end -= 5; + break; + } + } + + snippet = this.buffer.slice(start, end); + + return common.repeat(' ', indent) + head + snippet + tail + '\n' + + common.repeat(' ', indent + this.position - start + head.length) + '^'; +}; + + +Mark.prototype.toString = function toString(compact) { + var snippet, where = ''; + + if (this.name) { + where += 'in "' + this.name + '" '; + } + + where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1); + + if (!compact) { + snippet = this.getSnippet(); + + if (snippet) { + where += ':\n' + snippet; + } + } + + return where; +}; + + +module.exports = Mark; diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema.js new file mode 100644 index 0000000..ca7cf47 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema.js @@ -0,0 +1,108 @@ +'use strict'; + +/*eslint-disable max-len*/ + +var common = require('./common'); +var YAMLException = require('./exception'); +var Type = require('./type'); + + +function compileList(schema, name, result) { + var exclude = []; + + schema.include.forEach(function (includedSchema) { + result = compileList(includedSchema, name, result); + }); + + schema[name].forEach(function (currentType) { + result.forEach(function (previousType, previousIndex) { + if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) { + exclude.push(previousIndex); + } + }); + + result.push(currentType); + }); + + return result.filter(function (type, index) { + return exclude.indexOf(index) === -1; + }); +} + + +function compileMap(/* lists... */) { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {} + }, index, length; + + function collectType(type) { + 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) { + this.include = definition.include || []; + this.implicit = definition.implicit || []; + this.explicit = definition.explicit || []; + + this.implicit.forEach(function (type) { + 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.'); + } + }); + + this.compiledImplicit = compileList(this, 'implicit', []); + this.compiledExplicit = compileList(this, 'explicit', []); + this.compiledTypeMap = compileMap(this.compiledImplicit, this.compiledExplicit); +} + + +Schema.DEFAULT = null; + + +Schema.create = function createSchema() { + var schemas, types; + + switch (arguments.length) { + case 1: + schemas = Schema.DEFAULT; + types = arguments[0]; + break; + + case 2: + schemas = arguments[0]; + types = arguments[1]; + break; + + default: + throw new YAMLException('Wrong number of arguments for Schema.create function'); + } + + schemas = common.toArray(schemas); + types = common.toArray(types); + + if (!schemas.every(function (schema) { return schema instanceof Schema; })) { + throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.'); + } + + if (!types.every(function (type) { return type instanceof Type; })) { + throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.'); + } + + return new Schema({ + include: schemas, + explicit: types + }); +}; + + +module.exports = Schema; diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/core.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/core.js new file mode 100644 index 0000000..206daab --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/core.js @@ -0,0 +1,18 @@ +// 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'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + include: [ + require('./json') + ] +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/default_full.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/default_full.js new file mode 100644 index 0000000..a55ef42 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/default_full.js @@ -0,0 +1,25 @@ +// JS-YAML's default schema for `load` function. +// It is not described in the YAML specification. +// +// This schema is based on JS-YAML's default safe schema and includes +// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function. +// +// Also this schema is used as default base schema at `Schema.create` function. + + +'use strict'; + + +var Schema = require('../schema'); + + +module.exports = Schema.DEFAULT = new Schema({ + include: [ + require('./default_safe') + ], + explicit: [ + require('../type/js/undefined'), + require('../type/js/regexp'), + require('../type/js/function') + ] +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js new file mode 100644 index 0000000..11d89bb --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js @@ -0,0 +1,28 @@ +// 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'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + include: [ + require('./core') + ], + 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/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js new file mode 100644 index 0000000..b7a33eb --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/json.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/json.js new file mode 100644 index 0000000..5be3dbf --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/schema/json.js @@ -0,0 +1,25 @@ +// 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'; + + +var Schema = require('../schema'); + + +module.exports = new Schema({ + include: [ + require('./failsafe') + ], + implicit: [ + require('../type/null'), + require('../type/bool'), + require('../type/int'), + require('../type/float') + ] +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type.js new file mode 100644 index 0000000..90b702a --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type.js @@ -0,0 +1,61 @@ +'use strict'; + +var YAMLException = require('./exception'); + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + '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.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.defaultStyle = options['defaultStyle'] || null; + 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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/binary.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/binary.js new file mode 100644 index 0000000..10b1875 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/binary.js @@ -0,0 +1,138 @@ +'use strict'; + +/*eslint-disable no-bitwise*/ + +var NodeBuffer; + +try { + // A trick for browserified version, to not include `Buffer` shim + var _require = require; + NodeBuffer = _require('buffer').Buffer; +} catch (__) {} + +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); + } + + // Wrap into Buffer for NodeJS and leave Array for browser + if (NodeBuffer) { + // Support node 6.+ Buffer API when available + return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result); + } + + return 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(object) { + return NodeBuffer && NodeBuffer.isBuffer(object); +} + +module.exports = new Type('tag:yaml.org,2002:binary', { + kind: 'scalar', + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/bool.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/bool.js new file mode 100644 index 0000000..cb77459 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/float.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/float.js new file mode 100644 index 0000000..127671b --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/float.js @@ -0,0 +1,116 @@ +'use strict'; + +var common = require('../common'); +var Type = require('../type'); + +var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' + + // .2e4, .2 + // special case, seems not from spec + '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' + + // 20:59 + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[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, base, digits; + + value = data.replace(/_/g, '').toLowerCase(); + sign = value[0] === '-' ? -1 : 1; + digits = []; + + 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; + + } else if (value.indexOf(':') >= 0) { + value.split(':').forEach(function (v) { + digits.unshift(parseFloat(v, 10)); + }); + + value = 0.0; + base = 1; + + digits.forEach(function (d) { + value += d * base; + base *= 60; + }); + + return sign * value; + + } + 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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/int.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/int.js new file mode 100644 index 0000000..ba61c5f --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/int.js @@ -0,0 +1,173 @@ +'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 !== '_'; + } + + // base 8 + 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) or base 60 + + // value should not start with `_`; + if (ch === '_') return false; + + for (; index < max; index++) { + ch = data[index]; + if (ch === '_') continue; + if (ch === ':') break; + if (!isDecCode(data.charCodeAt(index))) { + return false; + } + hasDigits = true; + } + + // Should have digits and should not end with `_` + if (!hasDigits || ch === '_') return false; + + // if !base60 - done; + if (ch !== ':') return true; + + // base60 almost not used, no needs to optimize + return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); +} + +function constructYamlInteger(data) { + var value = data, sign = 1, ch, base, digits = []; + + 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, 16); + return sign * parseInt(value, 8); + } + + if (value.indexOf(':') !== -1) { + value.split(':').forEach(function (v) { + digits.unshift(parseInt(v, 10)); + }); + + value = 0; + base = 1; + + digits.forEach(function (d) { + value += (d * base); + base *= 60; + }); + + return sign * value; + + } + + 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 ? '0' + obj.toString(8) : '-0' + 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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/function.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/function.js new file mode 100644 index 0000000..8fab8c4 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/function.js @@ -0,0 +1,93 @@ +'use strict'; + +var esprima; + +// Browserified version does not have esprima +// +// 1. For node.js just require module as deps +// 2. For browser try to require mudule via external AMD system. +// If not found - try to fallback to window.esprima. If not +// found too - then fail to parse. +// +try { + // workaround to exclude package from browserify list. + var _require = require; + esprima = _require('esprima'); +} catch (_) { + /* eslint-disable no-redeclare */ + /* global window */ + if (typeof window !== 'undefined') esprima = window.esprima; +} + +var Type = require('../../type'); + +function resolveJavascriptFunction(data) { + if (data === null) return false; + + try { + var source = '(' + data + ')', + ast = esprima.parse(source, { range: true }); + + if (ast.type !== 'Program' || + ast.body.length !== 1 || + ast.body[0].type !== 'ExpressionStatement' || + (ast.body[0].expression.type !== 'ArrowFunctionExpression' && + ast.body[0].expression.type !== 'FunctionExpression')) { + return false; + } + + return true; + } catch (err) { + return false; + } +} + +function constructJavascriptFunction(data) { + /*jslint evil:true*/ + + var source = '(' + data + ')', + ast = esprima.parse(source, { range: true }), + params = [], + body; + + if (ast.type !== 'Program' || + ast.body.length !== 1 || + ast.body[0].type !== 'ExpressionStatement' || + (ast.body[0].expression.type !== 'ArrowFunctionExpression' && + ast.body[0].expression.type !== 'FunctionExpression')) { + throw new Error('Failed to resolve function'); + } + + ast.body[0].expression.params.forEach(function (param) { + params.push(param.name); + }); + + body = ast.body[0].expression.body.range; + + // Esprima's ranges include the first '{' and the last '}' characters on + // function expressions. So cut them out. + if (ast.body[0].expression.body.type === 'BlockStatement') { + /*eslint-disable no-new-func*/ + return new Function(params, source.slice(body[0] + 1, body[1] - 1)); + } + // ES6 arrow functions can omit the BlockStatement. In that case, just return + // the body. + /*eslint-disable no-new-func*/ + return new Function(params, 'return ' + source.slice(body[0], body[1])); +} + +function representJavascriptFunction(object /*, style*/) { + return object.toString(); +} + +function isFunction(object) { + return Object.prototype.toString.call(object) === '[object Function]'; +} + +module.exports = new Type('tag:yaml.org,2002:js/function', { + kind: 'scalar', + resolve: resolveJavascriptFunction, + construct: constructJavascriptFunction, + predicate: isFunction, + represent: representJavascriptFunction +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js new file mode 100644 index 0000000..43fa470 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js @@ -0,0 +1,60 @@ +'use strict'; + +var Type = require('../../type'); + +function resolveJavascriptRegExp(data) { + if (data === null) return false; + if (data.length === 0) return false; + + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + + // if regexp starts with '/' it can have modifiers and must be properly closed + // `/foo/gim` - modifiers tail can be maximum 3 chars + if (regexp[0] === '/') { + if (tail) modifiers = tail[1]; + + if (modifiers.length > 3) return false; + // if expression starts with /, is should be properly terminated + if (regexp[regexp.length - modifiers.length - 1] !== '/') return false; + } + + return true; +} + +function constructJavascriptRegExp(data) { + var regexp = data, + tail = /\/([gim]*)$/.exec(data), + modifiers = ''; + + // `/foo/gim` - tail can be maximum 4 chars + if (regexp[0] === '/') { + if (tail) modifiers = tail[1]; + regexp = regexp.slice(1, regexp.length - modifiers.length - 1); + } + + return new RegExp(regexp, modifiers); +} + +function representJavascriptRegExp(object /*, style*/) { + var result = '/' + object.source + '/'; + + if (object.global) result += 'g'; + if (object.multiline) result += 'm'; + if (object.ignoreCase) result += 'i'; + + return result; +} + +function isRegExp(object) { + return Object.prototype.toString.call(object) === '[object RegExp]'; +} + +module.exports = new Type('tag:yaml.org,2002:js/regexp', { + kind: 'scalar', + resolve: resolveJavascriptRegExp, + construct: constructJavascriptRegExp, + predicate: isRegExp, + represent: representJavascriptRegExp +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js new file mode 100644 index 0000000..95b5569 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js @@ -0,0 +1,28 @@ +'use strict'; + +var Type = require('../../type'); + +function resolveJavascriptUndefined() { + return true; +} + +function constructJavascriptUndefined() { + /*eslint-disable no-undefined*/ + return undefined; +} + +function representJavascriptUndefined() { + return ''; +} + +function isUndefined(object) { + return typeof object === 'undefined'; +} + +module.exports = new Type('tag:yaml.org,2002:js/undefined', { + kind: 'scalar', + resolve: resolveJavascriptUndefined, + construct: constructJavascriptUndefined, + predicate: isUndefined, + represent: representJavascriptUndefined +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/map.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/map.js new file mode 100644 index 0000000..f327bee --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/merge.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/merge.js new file mode 100644 index 0000000..ae08a86 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/null.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/null.js new file mode 100644 index 0000000..6874daa --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/null.js @@ -0,0 +1,34 @@ +'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'; } + }, + defaultStyle: 'lowercase' +}); diff --git a/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/omap.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/omap.js new file mode 100644 index 0000000..b2b5323 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/pairs.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/pairs.js new file mode 100644 index 0000000..74b5240 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/seq.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/seq.js new file mode 100644 index 0000000..be8f77f --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/set.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/set.js new file mode 100644 index 0000000..f885a32 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/str.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/str.js new file mode 100644 index 0000000..27acc10 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/lib/js-yaml/type/timestamp.js b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/type/timestamp.js new file mode 100644 index 0000000..8fa9c58 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/lib/js-yaml/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/gray-matter/node_modules/js-yaml/package.json b/node_modules/gray-matter/node_modules/js-yaml/package.json new file mode 100644 index 0000000..0d68bf6 --- /dev/null +++ b/node_modules/gray-matter/node_modules/js-yaml/package.json @@ -0,0 +1,49 @@ +{ + "name": "js-yaml", + "version": "3.14.2", + "description": "YAML 1.2 parser and serializer", + "keywords": [ + "yaml", + "parser", + "serializer", + "pyyaml" + ], + "homepage": "https://github.com/nodeca/js-yaml", + "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" + }, + "unpkg": "dist/js-yaml.min.js", + "jsdelivr": "dist/js-yaml.min.js", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "devDependencies": { + "ansi": "^0.3.1", + "benchmark": "^2.1.4", + "browserify": "^16.2.2", + "codemirror": "^5.13.4", + "eslint": "^7.0.0", + "fast-check": "^1.24.2", + "istanbul": "^0.4.5", + "mocha": "^7.1.2", + "uglify-js": "^3.0.1" + }, + "scripts": { + "test": "make test" + } +} diff --git a/node_modules/gray-matter/package.json b/node_modules/gray-matter/package.json new file mode 100644 index 0000000..c5a1fff --- /dev/null +++ b/node_modules/gray-matter/package.json @@ -0,0 +1,127 @@ +{ + "name": "gray-matter", + "description": "Parse front-matter from a string or file. Fast, reliable and easy to use. Parses YAML front matter by default, but also has support for YAML, JSON, TOML or Coffee Front-Matter, with options to set custom delimiters. Used by metalsmith, assemble, verb and many other projects.", + "version": "4.0.3", + "homepage": "https://github.com/jonschlinkert/gray-matter", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Andrew Meyer (https://github.com/Ajedi32)", + "Brian Woodward (https://twitter.com/doowb)", + "Caesar Schinas (https://caesarschinas.com)", + "Ian Storm Taylor (http://ianstormtaylor.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Osman Nuri Okumuş (http://onokumus.com)", + "Pawel Kadluczka (http://blog.3d-logic.com)", + "Rob Loach (http://robloach.net)", + "(https://github.com/heymind)", + "Zach Whaley (http://zachwhaleys.website)" + ], + "repository": "jonschlinkert/gray-matter", + "bugs": { + "url": "https://github.com/jonschlinkert/gray-matter/issues" + }, + "license": "MIT", + "files": [ + "gray-matter.d.ts", + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=6.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "devDependencies": { + "ansi-green": "^0.1.1", + "benchmarked": "^2.0.0", + "coffeescript": "^2.2.3", + "delimiter-regex": "^2.0.0", + "extend-shallow": "^3.0.2", + "front-matter": "^2.3.0", + "gulp-format-md": "^1.0.0", + "minimist": "^1.2.0", + "mocha": "^6.1.4", + "toml": "^2.3.3", + "vinyl": "^2.1.0", + "write": "^1.0.3" + }, + "keywords": [ + "assemble", + "coffee", + "coffee-script", + "data", + "docs", + "documentation", + "extract", + "extracting", + "front", + "front-matter", + "frontmatter", + "generate", + "generator", + "gh-pages", + "gray", + "javascript", + "jekyll", + "js", + "JSON", + "markdown", + "matter", + "parse", + "parser", + "parsing", + "site", + "static", + "template", + "toml", + "yaml", + "yfm" + ], + "browser": { + "fs": false + }, + "typings": "gray-matter.d.ts", + "eslintConfig": { + "rules": { + "no-console": 0 + } + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "helpers": { + "examples": "./examples/helper.js" + }, + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "assemble", + "metalsmith", + "verb" + ] + }, + "reflinks": [ + "coffe-script", + "generate", + "js-yaml", + "toml", + "update" + ] + } +} diff --git a/node_modules/htmlparser2/LICENSE b/node_modules/htmlparser2/LICENSE new file mode 100644 index 0000000..0a35e02 --- /dev/null +++ b/node_modules/htmlparser2/LICENSE @@ -0,0 +1,18 @@ +Copyright 2010, 2011, Chris Winberry . All rights reserved. +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. \ No newline at end of file diff --git a/node_modules/htmlparser2/README.md b/node_modules/htmlparser2/README.md new file mode 100644 index 0000000..8a11eaf --- /dev/null +++ b/node_modules/htmlparser2/README.md @@ -0,0 +1,166 @@ +# htmlparser2 + +[![NPM version](http://img.shields.io/npm/v/htmlparser2.svg?style=flat)](https://npmjs.org/package/htmlparser2) +[![Downloads](https://img.shields.io/npm/dm/htmlparser2.svg?style=flat)](https://npmjs.org/package/htmlparser2) +[![Build Status](https://img.shields.io/github/workflow/status/fb55/htmlparser2/Node.js%20Test?label=tests&style=flat)](https://github.com/fb55/htmlparser2/actions?query=workflow%3A%22Node.js+Test%22) +[![Coverage](http://img.shields.io/coveralls/fb55/htmlparser2.svg?style=flat)](https://coveralls.io/r/fb55/htmlparser2) + +The fast & forgiving HTML/XML parser. + +## Installation + + npm install htmlparser2 + +A live demo of `htmlparser2` is available [here](https://astexplorer.net/#/2AmVrGuGVJ). + +## Ecosystem + +| Name | Description | +| ------------------------------------------------------------- | ------------------------------------------------------- | +| [htmlparser2](https://github.com/fb55/htmlparser2) | Fast & forgiving HTML/XML parser | +| [domhandler](https://github.com/fb55/domhandler) | Handler for htmlparser2 that turns documents into a DOM | +| [domutils](https://github.com/fb55/domutils) | Utilities for working with domhandler's DOM | +| [css-select](https://github.com/fb55/css-select) | CSS selector engine, compatible with domhandler's DOM | +| [cheerio](https://github.com/cheeriojs/cheerio) | The jQuery API for domhandler's DOM | +| [dom-serializer](https://github.com/cheeriojs/dom-serializer) | Serializer for domhandler's DOM | + +## Usage + +`htmlparser2` itself provides a callback interface that allows consumption of documents with minimal allocations. +For a more ergonomic experience, read [Getting a DOM](#getting-a-dom) below. + +```javascript +const htmlparser2 = require("htmlparser2"); +const parser = new htmlparser2.Parser({ + onopentag(name, attributes) { + /* + * This fires when a new tag is opened. + * + * If you don't need an aggregated `attributes` object, + * have a look at the `onopentagname` and `onattribute` events. + */ + if (name === "script" && attributes.type === "text/javascript") { + console.log("JS! Hooray!"); + } + }, + ontext(text) { + /* + * Fires whenever a section of text was processed. + * + * Note that this can fire at any point within text and you might + * have to stich together multiple pieces. + */ + console.log("-->", text); + }, + onclosetag(tagname) { + /* + * Fires when a tag is closed. + * + * You can rely on this event only firing when you have received an + * equivalent opening tag before. Closing tags without corresponding + * opening tags will be ignored. + */ + if (tagname === "script") { + console.log("That's it?!"); + } + }, +}); +parser.write( + "Xyz `. + this.sequenceIndex = Number(c === 60 /* Lt */); + } + }; + Tokenizer.prototype.stateCDATASequence = function (c) { + if (c === Sequences.Cdata[this.sequenceIndex]) { + if (++this.sequenceIndex === Sequences.Cdata.length) { + this._state = 21 /* InCommentLike */; + this.currentSequence = Sequences.CdataEnd; + this.sequenceIndex = 0; + this.sectionStart = this._index + 1; + } + } + else { + this.sequenceIndex = 0; + this._state = 16 /* InDeclaration */; + this.stateInDeclaration(c); // Reconsume the character + } + }; + /** + * When we wait for one specific character, we can speed things up + * by skipping through the buffer until we find it. + * + * @returns Whether the character was found. + */ + Tokenizer.prototype.fastForwardTo = function (c) { + while (++this._index < this.buffer.length) { + if (this.buffer.charCodeAt(this._index) === c) { + return true; + } + } + /* + * We increment the index at the end of the `parse` loop, + * so set it to `buffer.length - 1` here. + * + * TODO: Refactor `parse` to increment index before calling states. + */ + this._index = this.buffer.length - 1; + return false; + }; + /** + * Comments and CDATA end with `-->` and `]]>`. + * + * Their common qualities are: + * - Their end sequences have a distinct character they start with. + * - That character is then repeated, so we have to check multiple repeats. + * - All characters but the start character of the sequence can be skipped. + */ + Tokenizer.prototype.stateInCommentLike = function (c) { + if (c === this.currentSequence[this.sequenceIndex]) { + if (++this.sequenceIndex === this.currentSequence.length) { + // Remove 2 trailing chars + var section = this.buffer.slice(this.sectionStart, this._index - 2); + if (this.currentSequence === Sequences.CdataEnd) { + this.cbs.oncdata(section); + } + else { + this.cbs.oncomment(section); + } + this.sequenceIndex = 0; + this.sectionStart = this._index + 1; + this._state = 1 /* Text */; + } + } + else if (this.sequenceIndex === 0) { + // Fast-forward to the first character of the sequence + if (this.fastForwardTo(this.currentSequence[0])) { + this.sequenceIndex = 1; + } + } + else if (c !== this.currentSequence[this.sequenceIndex - 1]) { + // Allow long sequences, eg. --->, ]]]> + this.sequenceIndex = 0; + } + }; + /** + * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name. + * + * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar). + * We allow anything that wouldn't end the tag. + */ + Tokenizer.prototype.isTagStartChar = function (c) { + return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c); + }; + Tokenizer.prototype.startSpecial = function (sequence, offset) { + this.isSpecial = true; + this.currentSequence = sequence; + this.sequenceIndex = offset; + this._state = 23 /* SpecialStartSequence */; + }; + Tokenizer.prototype.stateBeforeTagName = function (c) { + if (c === 33 /* ExclamationMark */) { + this._state = 15 /* BeforeDeclaration */; + this.sectionStart = this._index + 1; + } + else if (c === 63 /* Questionmark */) { + this._state = 17 /* InProcessingInstruction */; + this.sectionStart = this._index + 1; + } + else if (this.isTagStartChar(c)) { + var lower = c | 0x20; + this.sectionStart = this._index; + if (!this.xmlMode && lower === Sequences.TitleEnd[2]) { + this.startSpecial(Sequences.TitleEnd, 3); + } + else { + this._state = + !this.xmlMode && lower === Sequences.ScriptEnd[2] + ? 22 /* BeforeSpecialS */ + : 3 /* InTagName */; + } + } + else if (c === 47 /* Slash */) { + this._state = 5 /* BeforeClosingTagName */; + } + else { + this._state = 1 /* Text */; + this.stateText(c); + } + }; + Tokenizer.prototype.stateInTagName = function (c) { + if (isEndOfTagSection(c)) { + this.cbs.onopentagname(this.getSection()); + this.sectionStart = -1; + this._state = 8 /* BeforeAttributeName */; + this.stateBeforeAttributeName(c); + } + }; + Tokenizer.prototype.stateBeforeClosingTagName = function (c) { + if (isWhitespace(c)) { + // Ignore + } + else if (c === 62 /* Gt */) { + this._state = 1 /* Text */; + } + else { + this._state = this.isTagStartChar(c) + ? 6 /* InClosingTagName */ + : 20 /* InSpecialComment */; + this.sectionStart = this._index; + } + }; + Tokenizer.prototype.stateInClosingTagName = function (c) { + if (c === 62 /* Gt */ || isWhitespace(c)) { + this.cbs.onclosetag(this.getSection()); + this.sectionStart = -1; + this._state = 7 /* AfterClosingTagName */; + this.stateAfterClosingTagName(c); + } + }; + Tokenizer.prototype.stateAfterClosingTagName = function (c) { + // Skip everything until ">" + if (c === 62 /* Gt */ || this.fastForwardTo(62 /* Gt */)) { + this._state = 1 /* Text */; + this.sectionStart = this._index + 1; + } + }; + Tokenizer.prototype.stateBeforeAttributeName = function (c) { + if (c === 62 /* Gt */) { + this.cbs.onopentagend(); + if (this.isSpecial) { + this._state = 24 /* InSpecialTag */; + this.sequenceIndex = 0; + } + else { + this._state = 1 /* Text */; + } + this.baseState = this._state; + this.sectionStart = this._index + 1; + } + else if (c === 47 /* Slash */) { + this._state = 4 /* InSelfClosingTag */; + } + else if (!isWhitespace(c)) { + this._state = 9 /* InAttributeName */; + this.sectionStart = this._index; + } + }; + Tokenizer.prototype.stateInSelfClosingTag = function (c) { + if (c === 62 /* Gt */) { + this.cbs.onselfclosingtag(); + this._state = 1 /* Text */; + this.baseState = 1 /* Text */; + this.sectionStart = this._index + 1; + this.isSpecial = false; // Reset special state, in case of self-closing special tags + } + else if (!isWhitespace(c)) { + this._state = 8 /* BeforeAttributeName */; + this.stateBeforeAttributeName(c); + } + }; + Tokenizer.prototype.stateInAttributeName = function (c) { + if (c === 61 /* Eq */ || isEndOfTagSection(c)) { + this.cbs.onattribname(this.getSection()); + this.sectionStart = -1; + this._state = 10 /* AfterAttributeName */; + this.stateAfterAttributeName(c); + } + }; + Tokenizer.prototype.stateAfterAttributeName = function (c) { + if (c === 61 /* Eq */) { + this._state = 11 /* BeforeAttributeValue */; + } + else if (c === 47 /* Slash */ || c === 62 /* Gt */) { + this.cbs.onattribend(undefined); + this._state = 8 /* BeforeAttributeName */; + this.stateBeforeAttributeName(c); + } + else if (!isWhitespace(c)) { + this.cbs.onattribend(undefined); + this._state = 9 /* InAttributeName */; + this.sectionStart = this._index; + } + }; + Tokenizer.prototype.stateBeforeAttributeValue = function (c) { + if (c === 34 /* DoubleQuote */) { + this._state = 12 /* InAttributeValueDq */; + this.sectionStart = this._index + 1; + } + else if (c === 39 /* SingleQuote */) { + this._state = 13 /* InAttributeValueSq */; + this.sectionStart = this._index + 1; + } + else if (!isWhitespace(c)) { + this.sectionStart = this._index; + this._state = 14 /* InAttributeValueNq */; + this.stateInAttributeValueNoQuotes(c); // Reconsume token + } + }; + Tokenizer.prototype.handleInAttributeValue = function (c, quote) { + if (c === quote || + (!this.decodeEntities && this.fastForwardTo(quote))) { + this.cbs.onattribdata(this.getSection()); + this.sectionStart = -1; + this.cbs.onattribend(String.fromCharCode(quote)); + this._state = 8 /* BeforeAttributeName */; + } + else if (this.decodeEntities && c === 38 /* Amp */) { + this.baseState = this._state; + this._state = 25 /* BeforeEntity */; + } + }; + Tokenizer.prototype.stateInAttributeValueDoubleQuotes = function (c) { + this.handleInAttributeValue(c, 34 /* DoubleQuote */); + }; + Tokenizer.prototype.stateInAttributeValueSingleQuotes = function (c) { + this.handleInAttributeValue(c, 39 /* SingleQuote */); + }; + Tokenizer.prototype.stateInAttributeValueNoQuotes = function (c) { + if (isWhitespace(c) || c === 62 /* Gt */) { + this.cbs.onattribdata(this.getSection()); + this.sectionStart = -1; + this.cbs.onattribend(null); + this._state = 8 /* BeforeAttributeName */; + this.stateBeforeAttributeName(c); + } + else if (this.decodeEntities && c === 38 /* Amp */) { + this.baseState = this._state; + this._state = 25 /* BeforeEntity */; + } + }; + Tokenizer.prototype.stateBeforeDeclaration = function (c) { + if (c === 91 /* OpeningSquareBracket */) { + this._state = 19 /* CDATASequence */; + this.sequenceIndex = 0; + } + else { + this._state = + c === 45 /* Dash */ + ? 18 /* BeforeComment */ + : 16 /* InDeclaration */; + } + }; + Tokenizer.prototype.stateInDeclaration = function (c) { + if (c === 62 /* Gt */ || this.fastForwardTo(62 /* Gt */)) { + this.cbs.ondeclaration(this.getSection()); + this._state = 1 /* Text */; + this.sectionStart = this._index + 1; + } + }; + Tokenizer.prototype.stateInProcessingInstruction = function (c) { + if (c === 62 /* Gt */ || this.fastForwardTo(62 /* Gt */)) { + this.cbs.onprocessinginstruction(this.getSection()); + this._state = 1 /* Text */; + this.sectionStart = this._index + 1; + } + }; + Tokenizer.prototype.stateBeforeComment = function (c) { + if (c === 45 /* Dash */) { + this._state = 21 /* InCommentLike */; + this.currentSequence = Sequences.CommentEnd; + // Allow short comments (eg. ) + this.sequenceIndex = 2; + this.sectionStart = this._index + 1; + } + else { + this._state = 16 /* InDeclaration */; + } + }; + Tokenizer.prototype.stateInSpecialComment = function (c) { + if (c === 62 /* Gt */ || this.fastForwardTo(62 /* Gt */)) { + this.cbs.oncomment(this.getSection()); + this._state = 1 /* Text */; + this.sectionStart = this._index + 1; + } + }; + Tokenizer.prototype.stateBeforeSpecialS = function (c) { + var lower = c | 0x20; + if (lower === Sequences.ScriptEnd[3]) { + this.startSpecial(Sequences.ScriptEnd, 4); + } + else if (lower === Sequences.StyleEnd[3]) { + this.startSpecial(Sequences.StyleEnd, 4); + } + else { + this._state = 3 /* InTagName */; + this.stateInTagName(c); // Consume the token again + } + }; + Tokenizer.prototype.stateBeforeEntity = function (c) { + // Start excess with 1 to include the '&' + this.entityExcess = 1; + if (c === 35 /* Num */) { + this._state = 26 /* BeforeNumericEntity */; + } + else if (c === 38 /* Amp */) { + // We have two `&` characters in a row. Stay in the current state. + } + else { + this.trieIndex = 0; + this.trieCurrent = this.entityTrie[0]; + this.trieResult = null; + this._state = 27 /* InNamedEntity */; + this.stateInNamedEntity(c); + } + }; + Tokenizer.prototype.stateInNamedEntity = function (c) { + this.entityExcess += 1; + this.trieIndex = (0, decode_1.determineBranch)(this.entityTrie, this.trieCurrent, this.trieIndex + 1, c); + if (this.trieIndex < 0) { + this.emitNamedEntity(); + this._index--; + return; + } + this.trieCurrent = this.entityTrie[this.trieIndex]; + // If the branch is a value, store it and continue + if (this.trieCurrent & decode_1.BinTrieFlags.HAS_VALUE) { + // If we have a legacy entity while parsing strictly, just skip the number of bytes + if (!this.allowLegacyEntity() && c !== 59 /* Semi */) { + // No need to consider multi-byte values, as the legacy entity is always a single byte + this.trieIndex += 1; + } + else { + // Add 1 as we have already incremented the excess + var entityStart = this._index - this.entityExcess + 1; + if (entityStart > this.sectionStart) { + this.emitPartial(this.buffer.substring(this.sectionStart, entityStart)); + } + // If this is a surrogate pair, combine the higher bits from the node with the next byte + this.trieResult = + this.trieCurrent & decode_1.BinTrieFlags.MULTI_BYTE + ? String.fromCharCode(this.entityTrie[++this.trieIndex], this.entityTrie[++this.trieIndex]) + : String.fromCharCode(this.entityTrie[++this.trieIndex]); + this.entityExcess = 0; + this.sectionStart = this._index + 1; + } + } + }; + Tokenizer.prototype.emitNamedEntity = function () { + if (this.trieResult) { + this.emitPartial(this.trieResult); + } + this._state = this.baseState; + }; + Tokenizer.prototype.stateBeforeNumericEntity = function (c) { + if ((c | 0x20) === 120 /* LowerX */) { + this.entityExcess++; + this._state = 29 /* InHexEntity */; + } + else { + this._state = 28 /* InNumericEntity */; + this.stateInNumericEntity(c); + } + }; + Tokenizer.prototype.decodeNumericEntity = function (base, strict) { + var entityStart = this._index - this.entityExcess - 1; + var numberStart = entityStart + 2 + (base >> 4); + if (numberStart !== this._index) { + // Emit leading data if any + if (entityStart > this.sectionStart) { + this.emitPartial(this.buffer.substring(this.sectionStart, entityStart)); + } + // Parse entity + var entity = this.buffer.substring(numberStart, this._index); + var parsed = parseInt(entity, base); + this.emitPartial((0, decode_codepoint_1.default)(parsed)); + this.sectionStart = this._index + Number(strict); + } + this._state = this.baseState; + }; + Tokenizer.prototype.stateInNumericEntity = function (c) { + if (c === 59 /* Semi */) { + this.decodeNumericEntity(10, true); + } + else if (!isNumber(c)) { + if (this.allowLegacyEntity()) { + this.decodeNumericEntity(10, false); + } + else { + this._state = this.baseState; + } + this._index--; + } + else { + this.entityExcess++; + } + }; + Tokenizer.prototype.stateInHexEntity = function (c) { + if (c === 59 /* Semi */) { + this.decodeNumericEntity(16, true); + } + else if ((c < 97 /* LowerA */ || c > 102 /* LowerF */) && + (c < 65 /* UpperA */ || c > 70 /* UpperF */) && + !isNumber(c)) { + if (this.allowLegacyEntity()) { + this.decodeNumericEntity(16, false); + } + else { + this._state = this.baseState; + } + this._index--; + } + else { + this.entityExcess++; + } + }; + Tokenizer.prototype.allowLegacyEntity = function () { + return (!this.xmlMode && + (this.baseState === 1 /* Text */ || + this.baseState === 24 /* InSpecialTag */)); + }; + /** + * Remove data that has already been consumed from the buffer. + */ + Tokenizer.prototype.cleanup = function () { + // If we are inside of text, emit what we already have. + if (this.running && + this.sectionStart !== this._index && + (this._state === 1 /* Text */ || + (this._state === 24 /* InSpecialTag */ && + this.sequenceIndex === 0))) { + // TODO: We could emit attribute data here as well. + this.cbs.ontext(this.buffer.substr(this.sectionStart)); + this.sectionStart = this._index; + } + var start = this.sectionStart < 0 ? this._index : this.sectionStart; + this.buffer = + start === this.buffer.length ? "" : this.buffer.substr(start); + this._index -= start; + this.bufferOffset += start; + if (this.sectionStart > 0) { + this.sectionStart = 0; + } + }; + Tokenizer.prototype.shouldContinue = function () { + return this._index < this.buffer.length && this.running; + }; + /** + * Iterates through the buffer, calling the function corresponding to the current state. + * + * States that are more likely to be hit are higher up, as a performance improvement. + */ + Tokenizer.prototype.parse = function () { + while (this.shouldContinue()) { + var c = this.buffer.charCodeAt(this._index); + if (this._state === 1 /* Text */) { + this.stateText(c); + } + else if (this._state === 23 /* SpecialStartSequence */) { + this.stateSpecialStartSequence(c); + } + else if (this._state === 24 /* InSpecialTag */) { + this.stateInSpecialTag(c); + } + else if (this._state === 19 /* CDATASequence */) { + this.stateCDATASequence(c); + } + else if (this._state === 12 /* InAttributeValueDq */) { + this.stateInAttributeValueDoubleQuotes(c); + } + else if (this._state === 9 /* InAttributeName */) { + this.stateInAttributeName(c); + } + else if (this._state === 21 /* InCommentLike */) { + this.stateInCommentLike(c); + } + else if (this._state === 20 /* InSpecialComment */) { + this.stateInSpecialComment(c); + } + else if (this._state === 8 /* BeforeAttributeName */) { + this.stateBeforeAttributeName(c); + } + else if (this._state === 3 /* InTagName */) { + this.stateInTagName(c); + } + else if (this._state === 6 /* InClosingTagName */) { + this.stateInClosingTagName(c); + } + else if (this._state === 2 /* BeforeTagName */) { + this.stateBeforeTagName(c); + } + else if (this._state === 10 /* AfterAttributeName */) { + this.stateAfterAttributeName(c); + } + else if (this._state === 13 /* InAttributeValueSq */) { + this.stateInAttributeValueSingleQuotes(c); + } + else if (this._state === 11 /* BeforeAttributeValue */) { + this.stateBeforeAttributeValue(c); + } + else if (this._state === 5 /* BeforeClosingTagName */) { + this.stateBeforeClosingTagName(c); + } + else if (this._state === 7 /* AfterClosingTagName */) { + this.stateAfterClosingTagName(c); + } + else if (this._state === 22 /* BeforeSpecialS */) { + this.stateBeforeSpecialS(c); + } + else if (this._state === 14 /* InAttributeValueNq */) { + this.stateInAttributeValueNoQuotes(c); + } + else if (this._state === 4 /* InSelfClosingTag */) { + this.stateInSelfClosingTag(c); + } + else if (this._state === 16 /* InDeclaration */) { + this.stateInDeclaration(c); + } + else if (this._state === 15 /* BeforeDeclaration */) { + this.stateBeforeDeclaration(c); + } + else if (this._state === 18 /* BeforeComment */) { + this.stateBeforeComment(c); + } + else if (this._state === 17 /* InProcessingInstruction */) { + this.stateInProcessingInstruction(c); + } + else if (this._state === 27 /* InNamedEntity */) { + this.stateInNamedEntity(c); + } + else if (this._state === 25 /* BeforeEntity */) { + this.stateBeforeEntity(c); + } + else if (this._state === 29 /* InHexEntity */) { + this.stateInHexEntity(c); + } + else if (this._state === 28 /* InNumericEntity */) { + this.stateInNumericEntity(c); + } + else { + // `this._state === State.BeforeNumericEntity` + this.stateBeforeNumericEntity(c); + } + this._index++; + } + this.cleanup(); + }; + Tokenizer.prototype.finish = function () { + if (this._state === 27 /* InNamedEntity */) { + this.emitNamedEntity(); + } + // If there is remaining data, emit it in a reasonable way + if (this.sectionStart < this._index) { + this.handleTrailingData(); + } + this.cbs.onend(); + }; + /** Handle any trailing data. */ + Tokenizer.prototype.handleTrailingData = function () { + var data = this.buffer.substr(this.sectionStart); + if (this._state === 21 /* InCommentLike */) { + if (this.currentSequence === Sequences.CdataEnd) { + this.cbs.oncdata(data); + } + else { + this.cbs.oncomment(data); + } + } + else if (this._state === 28 /* InNumericEntity */ && + this.allowLegacyEntity()) { + this.decodeNumericEntity(10, false); + // All trailing data will have been consumed + } + else if (this._state === 29 /* InHexEntity */ && + this.allowLegacyEntity()) { + this.decodeNumericEntity(16, false); + // All trailing data will have been consumed + } + else if (this._state === 3 /* InTagName */ || + this._state === 8 /* BeforeAttributeName */ || + this._state === 11 /* BeforeAttributeValue */ || + this._state === 10 /* AfterAttributeName */ || + this._state === 9 /* InAttributeName */ || + this._state === 13 /* InAttributeValueSq */ || + this._state === 12 /* InAttributeValueDq */ || + this._state === 14 /* InAttributeValueNq */ || + this._state === 6 /* InClosingTagName */) { + /* + * If we are currently in an opening or closing tag, us not calling the + * respective callback signals that the tag should be ignored. + */ + } + else { + this.cbs.ontext(data); + } + }; + Tokenizer.prototype.getSection = function () { + return this.buffer.substring(this.sectionStart, this._index); + }; + Tokenizer.prototype.emitPartial = function (value) { + if (this.baseState !== 1 /* Text */ && + this.baseState !== 24 /* InSpecialTag */) { + this.cbs.onattribdata(value); + } + else { + this.cbs.ontext(value); + } + }; + return Tokenizer; +}()); +exports.default = Tokenizer; diff --git a/node_modules/htmlparser2/lib/WritableStream.d.ts b/node_modules/htmlparser2/lib/WritableStream.d.ts new file mode 100644 index 0000000..0755f99 --- /dev/null +++ b/node_modules/htmlparser2/lib/WritableStream.d.ts @@ -0,0 +1,16 @@ +/// +import { Handler, ParserOptions } from "./Parser"; +import { Writable } from "stream"; +/** + * WritableStream makes the `Parser` interface available as a NodeJS stream. + * + * @see Parser + */ +export declare class WritableStream extends Writable { + private readonly _parser; + private readonly _decoder; + constructor(cbs: Partial, options?: ParserOptions); + _write(chunk: string | Buffer, encoding: string, cb: () => void): void; + _final(cb: () => void): void; +} +//# sourceMappingURL=WritableStream.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/lib/WritableStream.d.ts.map b/node_modules/htmlparser2/lib/WritableStream.d.ts.map new file mode 100644 index 0000000..31295a2 --- /dev/null +++ b/node_modules/htmlparser2/lib/WritableStream.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"WritableStream.d.ts","sourceRoot":"","sources":["../src/WritableStream.ts"],"names":[],"mappings":";AAAA,OAAO,EAAU,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK1D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAQlC;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;gBAEpC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa;IAK1D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAOtE,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;CAI/B"} \ No newline at end of file diff --git a/node_modules/htmlparser2/lib/WritableStream.js b/node_modules/htmlparser2/lib/WritableStream.js new file mode 100644 index 0000000..ff87995 --- /dev/null +++ b/node_modules/htmlparser2/lib/WritableStream.js @@ -0,0 +1,53 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WritableStream = void 0; +var Parser_1 = require("./Parser"); +/* + * NOTE: If either of these two imports produces a type error, + * please update your @types/node dependency! + */ +var stream_1 = require("stream"); +var string_decoder_1 = require("string_decoder"); +// Following the example in https://nodejs.org/api/stream.html#stream_decoding_buffers_in_a_writable_stream +function isBuffer(_chunk, encoding) { + return encoding === "buffer"; +} +/** + * WritableStream makes the `Parser` interface available as a NodeJS stream. + * + * @see Parser + */ +var WritableStream = /** @class */ (function (_super) { + __extends(WritableStream, _super); + function WritableStream(cbs, options) { + var _this = _super.call(this, { decodeStrings: false }) || this; + _this._decoder = new string_decoder_1.StringDecoder(); + _this._parser = new Parser_1.Parser(cbs, options); + return _this; + } + WritableStream.prototype._write = function (chunk, encoding, cb) { + this._parser.write(isBuffer(chunk, encoding) ? this._decoder.write(chunk) : chunk); + cb(); + }; + WritableStream.prototype._final = function (cb) { + this._parser.end(this._decoder.end()); + cb(); + }; + return WritableStream; +}(stream_1.Writable)); +exports.WritableStream = WritableStream; diff --git a/node_modules/htmlparser2/lib/index.d.ts b/node_modules/htmlparser2/lib/index.d.ts new file mode 100644 index 0000000..997c6d9 --- /dev/null +++ b/node_modules/htmlparser2/lib/index.d.ts @@ -0,0 +1,39 @@ +import { Parser, ParserOptions } from "./Parser"; +export { Parser, ParserOptions }; +import { DomHandler, DomHandlerOptions, Node, Element, Document } from "domhandler"; +export { DomHandler, DomHandlerOptions }; +declare type Options = ParserOptions & DomHandlerOptions; +/** + * Parses the data, returns the resulting document. + * + * @param data The data that should be parsed. + * @param options Optional options for the parser and DOM builder. + */ +export declare function parseDocument(data: string, options?: Options): Document; +/** + * Parses data, returns an array of the root nodes. + * + * Note that the root nodes still have a `Document` node as their parent. + * Use `parseDocument` to get the `Document` node instead. + * + * @param data The data that should be parsed. + * @param options Optional options for the parser and DOM builder. + * @deprecated Use `parseDocument` instead. + */ +export declare function parseDOM(data: string, options?: Options): Node[]; +/** + * Creates a parser instance, with an attached DOM handler. + * + * @param cb A callback that will be called once parsing has been completed. + * @param options Optional options for the parser and DOM builder. + * @param elementCb An optional callback that will be called every time a tag has been completed inside of the DOM. + */ +export declare function createDomStream(cb: (error: Error | null, dom: Node[]) => void, options?: Options, elementCb?: (element: Element) => void): Parser; +export { default as Tokenizer, Callbacks as TokenizerCallbacks, } from "./Tokenizer"; +import * as ElementType from "domelementtype"; +export { ElementType }; +export * from "./FeedHandler"; +export * as DomUtils from "domutils"; +export { DomHandler as DefaultHandler }; +export { FeedHandler as RssHandler } from "./FeedHandler"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/lib/index.d.ts.map b/node_modules/htmlparser2/lib/index.d.ts.map new file mode 100644 index 0000000..058fcba --- /dev/null +++ b/node_modules/htmlparser2/lib/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAEjC,OAAO,EACH,UAAU,EACV,iBAAiB,EACjB,IAAI,EACJ,OAAO,EACP,QAAQ,EACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;AAEzC,aAAK,OAAO,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAIjD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAIvE;AACD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,CAEhE;AACD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC3B,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,EAC9C,OAAO,CAAC,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GACvC,MAAM,CAGR;AAED,OAAO,EACH,OAAO,IAAI,SAAS,EACpB,SAAS,IAAI,kBAAkB,GAClC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,CAAC;AAOvB,cAAc,eAAe,CAAC;AAC9B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,CAAC;AACxC,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC"} \ No newline at end of file diff --git a/node_modules/htmlparser2/lib/index.js b/node_modules/htmlparser2/lib/index.js new file mode 100644 index 0000000..3e461fa --- /dev/null +++ b/node_modules/htmlparser2/lib/index.js @@ -0,0 +1,84 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RssHandler = exports.DefaultHandler = exports.DomUtils = exports.ElementType = exports.Tokenizer = exports.createDomStream = exports.parseDOM = exports.parseDocument = exports.DomHandler = exports.Parser = void 0; +var Parser_1 = require("./Parser"); +Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return Parser_1.Parser; } }); +var domhandler_1 = require("domhandler"); +Object.defineProperty(exports, "DomHandler", { enumerable: true, get: function () { return domhandler_1.DomHandler; } }); +Object.defineProperty(exports, "DefaultHandler", { enumerable: true, get: function () { return domhandler_1.DomHandler; } }); +// Helper methods +/** + * Parses the data, returns the resulting document. + * + * @param data The data that should be parsed. + * @param options Optional options for the parser and DOM builder. + */ +function parseDocument(data, options) { + var handler = new domhandler_1.DomHandler(undefined, options); + new Parser_1.Parser(handler, options).end(data); + return handler.root; +} +exports.parseDocument = parseDocument; +/** + * Parses data, returns an array of the root nodes. + * + * Note that the root nodes still have a `Document` node as their parent. + * Use `parseDocument` to get the `Document` node instead. + * + * @param data The data that should be parsed. + * @param options Optional options for the parser and DOM builder. + * @deprecated Use `parseDocument` instead. + */ +function parseDOM(data, options) { + return parseDocument(data, options).children; +} +exports.parseDOM = parseDOM; +/** + * Creates a parser instance, with an attached DOM handler. + * + * @param cb A callback that will be called once parsing has been completed. + * @param options Optional options for the parser and DOM builder. + * @param elementCb An optional callback that will be called every time a tag has been completed inside of the DOM. + */ +function createDomStream(cb, options, elementCb) { + var handler = new domhandler_1.DomHandler(cb, options, elementCb); + return new Parser_1.Parser(handler, options); +} +exports.createDomStream = createDomStream; +var Tokenizer_1 = require("./Tokenizer"); +Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return __importDefault(Tokenizer_1).default; } }); +var ElementType = __importStar(require("domelementtype")); +exports.ElementType = ElementType; +/* + * All of the following exports exist for backwards-compatibility. + * They should probably be removed eventually. + */ +__exportStar(require("./FeedHandler"), exports); +exports.DomUtils = __importStar(require("domutils")); +var FeedHandler_1 = require("./FeedHandler"); +Object.defineProperty(exports, "RssHandler", { enumerable: true, get: function () { return FeedHandler_1.FeedHandler; } }); diff --git a/node_modules/htmlparser2/node_modules/entities/LICENSE b/node_modules/htmlparser2/node_modules/entities/LICENSE new file mode 100644 index 0000000..c464f86 --- /dev/null +++ b/node_modules/htmlparser2/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/htmlparser2/node_modules/entities/lib/decode.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/decode.d.ts new file mode 100644 index 0000000..d2b434f --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/decode.d.ts @@ -0,0 +1,15 @@ +import htmlDecodeTree from "./generated/decode-data-html"; +import xmlDecodeTree from "./generated/decode-data-xml"; +export { htmlDecodeTree, xmlDecodeTree }; +export declare enum BinTrieFlags { + HAS_VALUE = 32768, + BRANCH_LENGTH = 32512, + MULTI_BYTE = 128, + JUMP_TABLE = 127 +} +export declare const JUMP_OFFSET_BASE: number; +export declare function determineBranch(decodeTree: Uint16Array, current: number, nodeIdx: number, char: number): number; +export declare function decodeHTML(str: string): string; +export declare function decodeHTMLStrict(str: string): string; +export declare function decodeXML(str: string): string; +//# sourceMappingURL=decode.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/decode.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/decode.d.ts.map new file mode 100644 index 0000000..9d48903 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/decode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAIxD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAczC,oBAAY,YAAY;IACpB,SAAS,QAAwB;IACjC,aAAa,QAAwB;IACrC,UAAU,MAAwB;IAClC,UAAU,MAAwB;CACrC;AAED,eAAO,MAAM,gBAAgB,QAAqB,CAAC;AAmGnD,wBAAgB,eAAe,CAC3B,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACb,MAAM,CA0CR;AAKD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/decode.js b/node_modules/htmlparser2/node_modules/entities/lib/decode.js new file mode 100644 index 0000000..7074d06 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/decode.js @@ -0,0 +1,145 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeXML = exports.decodeHTMLStrict = exports.decodeHTML = exports.determineBranch = exports.JUMP_OFFSET_BASE = exports.BinTrieFlags = exports.xmlDecodeTree = exports.htmlDecodeTree = void 0; +var decode_data_html_1 = __importDefault(require("./generated/decode-data-html")); +exports.htmlDecodeTree = decode_data_html_1.default; +var decode_data_xml_1 = __importDefault(require("./generated/decode-data-xml")); +exports.xmlDecodeTree = decode_data_xml_1.default; +var decode_codepoint_1 = __importDefault(require("./decode_codepoint")); +var BinTrieFlags; +(function (BinTrieFlags) { + BinTrieFlags[BinTrieFlags["HAS_VALUE"] = 32768] = "HAS_VALUE"; + BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 32512] = "BRANCH_LENGTH"; + BinTrieFlags[BinTrieFlags["MULTI_BYTE"] = 128] = "MULTI_BYTE"; + BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE"; +})(BinTrieFlags = exports.BinTrieFlags || (exports.BinTrieFlags = {})); +exports.JUMP_OFFSET_BASE = 48 /* ZERO */ - 1; +function getDecoder(decodeTree) { + return function decodeHTMLBinary(str, strict) { + var ret = ""; + var lastIdx = 0; + var strIdx = 0; + while ((strIdx = str.indexOf("&", strIdx)) >= 0) { + ret += str.slice(lastIdx, strIdx); + lastIdx = strIdx; + // Skip the "&" + strIdx += 1; + // If we have a numeric entity, handle this separately. + if (str.charCodeAt(strIdx) === 35 /* NUM */) { + // Skip the leading "&#". For hex entities, also skip the leading "x". + var start = strIdx + 1; + var base = 10; + var cp = str.charCodeAt(start); + if ((cp | 32 /* To_LOWER_BIT */) === 120 /* LOWER_X */) { + base = 16; + strIdx += 1; + start += 1; + } + while (((cp = str.charCodeAt(++strIdx)) >= 48 /* ZERO */ && + cp <= 57 /* NINE */) || + (base === 16 && + (cp | 32 /* To_LOWER_BIT */) >= 97 /* LOWER_A */ && + (cp | 32 /* To_LOWER_BIT */) <= 102 /* LOWER_F */)) + ; + if (start !== strIdx) { + var entity = str.substring(start, strIdx); + var parsed = parseInt(entity, base); + if (str.charCodeAt(strIdx) === 59 /* SEMI */) { + strIdx += 1; + } + else if (strict) { + continue; + } + ret += decode_codepoint_1.default(parsed); + lastIdx = strIdx; + } + continue; + } + var result = null; + var excess = 1; + var treeIdx = 0; + var current = decodeTree[treeIdx]; + for (; strIdx < str.length; strIdx++, excess++) { + treeIdx = determineBranch(decodeTree, current, treeIdx + 1, str.charCodeAt(strIdx)); + if (treeIdx < 0) + break; + current = decodeTree[treeIdx]; + // If the branch is a value, store it and continue + if (current & BinTrieFlags.HAS_VALUE) { + // If we have a legacy entity while parsing strictly, just skip the number of bytes + if (strict && str.charCodeAt(strIdx) !== 59 /* SEMI */) { + // No need to consider multi-byte values, as the legacy entity is always a single byte + treeIdx += 1; + } + else { + // If this is a surrogate pair, combine the higher bits from the node with the next byte + result = + current & BinTrieFlags.MULTI_BYTE + ? String.fromCharCode(decodeTree[++treeIdx], decodeTree[++treeIdx]) + : String.fromCharCode(decodeTree[++treeIdx]); + excess = 0; + } + } + } + if (result != null) { + ret += result; + lastIdx = strIdx - excess + 1; + } + } + return ret + str.slice(lastIdx); + }; +} +function determineBranch(decodeTree, current, nodeIdx, char) { + if (current <= 128) { + return char === current ? nodeIdx : -1; + } + var branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 8; + if (branchCount === 0) { + return -1; + } + if (branchCount === 1) { + return char === decodeTree[nodeIdx] ? nodeIdx + 1 : -1; + } + var jumpOffset = current & BinTrieFlags.JUMP_TABLE; + if (jumpOffset) { + var value = char - exports.JUMP_OFFSET_BASE - jumpOffset; + return value < 0 || value > branchCount + ? -1 + : decodeTree[nodeIdx + value] - 1; + } + // Binary search for the character. + var lo = nodeIdx; + var hi = lo + branchCount - 1; + while (lo <= hi) { + var mid = (lo + hi) >>> 1; + var midVal = decodeTree[mid]; + if (midVal < char) { + lo = mid + 1; + } + else if (midVal > char) { + hi = mid - 1; + } + else { + return decodeTree[mid + branchCount]; + } + } + return -1; +} +exports.determineBranch = determineBranch; +var htmlDecoder = getDecoder(decode_data_html_1.default); +var xmlDecoder = getDecoder(decode_data_xml_1.default); +function decodeHTML(str) { + return htmlDecoder(str, false); +} +exports.decodeHTML = decodeHTML; +function decodeHTMLStrict(str) { + return htmlDecoder(str, true); +} +exports.decodeHTMLStrict = decodeHTMLStrict; +function decodeXML(str) { + return xmlDecoder(str, true); +} +exports.decodeXML = decodeXML; diff --git a/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.d.ts new file mode 100644 index 0000000..6b72eaa --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.d.ts @@ -0,0 +1,2 @@ +export default function decodeCodePoint(codePoint: number): string; +//# sourceMappingURL=decode_codepoint.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.d.ts.map new file mode 100644 index 0000000..5b013a4 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"decode_codepoint.d.ts","sourceRoot":"","sources":["../src/decode_codepoint.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMjE"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js b/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js new file mode 100644 index 0000000..4ecdf42 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js @@ -0,0 +1,54 @@ +"use strict"; +// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 +Object.defineProperty(exports, "__esModule", { value: true }); +var decodeMap = new Map([ + [0, 65533], + [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], +]); +var fromCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins +String.fromCodePoint || + function (codePoint) { + var output = ""; + if (codePoint > 0xffff) { + codePoint -= 0x10000; + output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800); + codePoint = 0xdc00 | (codePoint & 0x3ff); + } + output += String.fromCharCode(codePoint); + return output; + }; +function decodeCodePoint(codePoint) { + var _a; + if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) { + return "\uFFFD"; + } + return fromCodePoint((_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint); +} +exports.default = decodeCodePoint; diff --git a/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.d.ts new file mode 100644 index 0000000..c590da2 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.d.ts @@ -0,0 +1,8 @@ +export declare const getCodePoint: (str: string, index: number) => number; +export declare function encodeHTMLTrieRe(regExp: RegExp, str: string): string; +export interface TrieNode { + value?: string; + next?: Map; +} +export declare function getTrie(map: Record): Map; +//# sourceMappingURL=encode-trie.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.d.ts.map new file mode 100644 index 0000000..9fab7b9 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"encode-trie.d.ts","sourceRoot":"","sources":["../src/encode-trie.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,YAAY,QAGT,MAAM,SAAS,MAAM,KAAG,MAQD,CAAC;AAIxC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAkCpE;AAED,MAAM,WAAW,QAAQ;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAChC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAmB1E"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.js b/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.js new file mode 100644 index 0000000..2e071d2 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/encode-trie.js @@ -0,0 +1,77 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getTrie = exports.encodeHTMLTrieRe = exports.getCodePoint = void 0; +var entities_json_1 = __importDefault(require("./maps/entities.json")); +function isHighSurrugate(c) { + return (c & 64512 /* Mask */) === 55296 /* High */; +} +// For compatibility with node < 4, we wrap `codePointAt` +exports.getCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +String.prototype.codePointAt != null + ? function (str, index) { return str.codePointAt(index); } + : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + function (c, index) { + return isHighSurrugate(c.charCodeAt(index)) + ? (c.charCodeAt(index) - 55296 /* High */) * 0x400 + + c.charCodeAt(index + 1) - + 0xdc00 + + 0x10000 + : c.charCodeAt(index); + }; +var htmlTrie = getTrie(entities_json_1.default); +function encodeHTMLTrieRe(regExp, str) { + var _a; + var ret = ""; + var lastIdx = 0; + var match; + while ((match = regExp.exec(str)) !== null) { + var i = match.index; + var char = str.charCodeAt(i); + var next = htmlTrie.get(char); + if (next) { + if (next.next != null && i + 1 < str.length) { + var value = (_a = next.next.get(str.charCodeAt(i + 1))) === null || _a === void 0 ? void 0 : _a.value; + if (value != null) { + ret += str.substring(lastIdx, i) + value; + regExp.lastIndex += 1; + lastIdx = i + 2; + continue; + } + } + ret += str.substring(lastIdx, i) + next.value; + lastIdx = i + 1; + } + else { + ret += str.substring(lastIdx, i) + "&#x" + exports.getCodePoint(str, i).toString(16) + ";"; + // Increase by 1 if we have a surrogate pair + lastIdx = regExp.lastIndex += Number(isHighSurrugate(char)); + } + } + return ret + str.substr(lastIdx); +} +exports.encodeHTMLTrieRe = encodeHTMLTrieRe; +function getTrie(map) { + var _a, _b, _c, _d; + var trie = new Map(); + for (var _i = 0, _e = Object.keys(map); _i < _e.length; _i++) { + var value = _e[_i]; + var key = map[value]; + // Resolve the key + var lastMap = trie; + for (var i = 0; i < key.length - 1; i++) { + var char = key.charCodeAt(i); + var next = (_a = lastMap.get(char)) !== null && _a !== void 0 ? _a : {}; + lastMap.set(char, next); + lastMap = (_b = next.next) !== null && _b !== void 0 ? _b : (next.next = new Map()); + } + var val = (_c = lastMap.get(key.charCodeAt(key.length - 1))) !== null && _c !== void 0 ? _c : {}; + (_d = val.value) !== null && _d !== void 0 ? _d : (val.value = "&" + value + ";"); + lastMap.set(key.charCodeAt(key.length - 1), val); + } + return trie; +} +exports.getTrie = getTrie; diff --git a/node_modules/htmlparser2/node_modules/entities/lib/encode.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/encode.d.ts new file mode 100644 index 0000000..20e5e48 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/encode.d.ts @@ -0,0 +1,46 @@ +/** + * 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(str: string): string; +/** + * Encodes all entities and non-ASCII characters in the input. + * + * This includes characters that are valid ASCII characters in HTML documents. + * For example `#` will be encoded as `#`. To get a more compact output, + * consider using the `encodeNonAsciiHTML` function. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +export declare function encodeHTML(data: string): string; +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +export declare function encodeNonAsciiHTML(data: 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 function escapeUTF8(data: string): string; +//# sourceMappingURL=encode.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/encode.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/encode.d.ts.map new file mode 100644 index 0000000..58b86b1 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/encode.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../src/encode.ts"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA0B7C;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AACD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAoCD;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,kBAAY,CAAC;AAEhC;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB/C"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/encode.js b/node_modules/htmlparser2/node_modules/entities/lib/encode.js new file mode 100644 index 0000000..2497b55 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/encode.js @@ -0,0 +1,126 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0; +var xml_json_1 = __importDefault(require("./maps/xml.json")); +var encode_trie_1 = require("./encode-trie"); +var entities_json_1 = __importDefault(require("./maps/entities.json")); +var htmlReplacer = getCharRegExp(entities_json_1.default, true); +var xmlReplacer = getCharRegExp(xml_json_1.default, true); +var xmlInvalidChars = getCharRegExp(xml_json_1.default, false); +var xmlCodeMap = new Map(Object.keys(xml_json_1.default).map(function (k) { return [ + xml_json_1.default[k].charCodeAt(0), + "&" + k + ";", +]; })); +/** + * 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(str) { + var ret = ""; + var lastIdx = 0; + var match; + while ((match = xmlReplacer.exec(str)) !== null) { + var i = match.index; + var char = str.charCodeAt(i); + var next = xmlCodeMap.get(char); + if (next) { + ret += str.substring(lastIdx, i) + next; + lastIdx = i + 1; + } + else { + ret += str.substring(lastIdx, i) + "&#x" + encode_trie_1.getCodePoint(str, i).toString(16) + ";"; + // Increase by 1 if we have a surrogate pair + lastIdx = xmlReplacer.lastIndex += Number((char & 65408) === 0xd800); + } + } + return ret + str.substr(lastIdx); +} +exports.encodeXML = encodeXML; +/** + * Encodes all entities and non-ASCII characters in the input. + * + * This includes characters that are valid ASCII characters in HTML documents. + * For example `#` will be encoded as `#`. To get a more compact output, + * consider using the `encodeNonAsciiHTML` function. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +function encodeHTML(data) { + return encode_trie_1.encodeHTMLTrieRe(htmlReplacer, data); +} +exports.encodeHTML = encodeHTML; +/** + * Encodes all non-ASCII characters, as well as characters not valid in HTML + * documents using HTML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +function encodeNonAsciiHTML(data) { + return encode_trie_1.encodeHTMLTrieRe(xmlReplacer, data); +} +exports.encodeNonAsciiHTML = encodeNonAsciiHTML; +function getCharRegExp(map, nonAscii) { + // Collect the start characters of all entities + var chars = Object.keys(map) + .map(function (k) { return "\\" + map[k].charAt(0); }) + .filter(function (v) { return !nonAscii || v.charCodeAt(1) < 128; }) + .sort(function (a, b) { return a.charCodeAt(1) - b.charCodeAt(1); }) + // Remove duplicates + .filter(function (v, i, a) { return v !== a[i + 1]; }); + // Add ranges to single characters. + for (var start = 0; start < chars.length - 1; start++) { + // Find the end of a run of characters + var end = start; + while (end < chars.length - 1 && + chars[end].charCodeAt(1) + 1 === chars[end + 1].charCodeAt(1)) { + end += 1; + } + var count = 1 + end - start; + // We want to replace at least three characters + if (count < 3) + continue; + chars.splice(start, count, chars[start] + "-" + chars[end]); + } + return new RegExp("[" + chars.join("") + (nonAscii ? "\\x80-\\uFFFF" : "") + "]", "g"); +} +/** + * 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; +/** + * 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. + */ +function escapeUTF8(data) { + var match; + var lastIdx = 0; + var result = ""; + while ((match = xmlInvalidChars.exec(data))) { + if (lastIdx !== match.index) { + result += data.substring(lastIdx, match.index); + } + // We know that this chararcter will be in `inverseXML` + result += xmlCodeMap.get(match[0].charCodeAt(0)); + // Every match will be of length 1 + lastIdx = match.index + 1; + } + return result + data.substring(lastIdx); +} +exports.escapeUTF8 = escapeUTF8; diff --git a/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.d.ts new file mode 100644 index 0000000..9cfc4f4 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.d.ts @@ -0,0 +1,3 @@ +declare const _default: Uint16Array; +export default _default; +//# sourceMappingURL=decode-data-html.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.d.ts.map new file mode 100644 index 0000000..c98d6ec --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/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,wBAAox9E"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.js b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.js new file mode 100644 index 0000000..7b99a2e --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-html.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Generated using scripts/write-decode-map.ts +// prettier-ignore +exports.default = new Uint16Array([14866, 60, 237, 340, 721, 1312, 1562, 1654, 1838, 1957, 2183, 2239, 2301, 2958, 3037, 3893, 4123, 4298, 4330, 4801, 5191, 5395, 5752, 5903, 5943, 5972, 6050, 0, 0, 0, 0, 0, 0, 6135, 6565, 7422, 8183, 8738, 9242, 9503, 9938, 10189, 10573, 10637, 10715, 11950, 12246, 13539, 13950, 14445, 14533, 15364, 16514, 16980, 17390, 17763, 17849, 18036, 18125, 4096, 69, 77, 97, 98, 99, 102, 103, 108, 109, 110, 111, 112, 114, 115, 116, 117, 92, 100, 106, 115, 122, 137, 142, 151, 157, 163, 167, 182, 196, 204, 220, 229, 108, 105, 103, 33024, 198, 59, 32768, 198, 80, 33024, 38, 59, 32768, 38, 99, 117, 116, 101, 33024, 193, 59, 32768, 193, 114, 101, 118, 101, 59, 32768, 258, 512, 105, 121, 127, 134, 114, 99, 33024, 194, 59, 32768, 194, 59, 32768, 1040, 114, 59, 32896, 55349, 56580, 114, 97, 118, 101, 33024, 192, 59, 32768, 192, 112, 104, 97, 59, 32768, 913, 97, 99, 114, 59, 32768, 256, 100, 59, 32768, 10835, 512, 103, 112, 172, 177, 111, 110, 59, 32768, 260, 102, 59, 32896, 55349, 56632, 112, 108, 121, 70, 117, 110, 99, 116, 105, 111, 110, 59, 32768, 8289, 105, 110, 103, 33024, 197, 59, 32768, 197, 512, 99, 115, 209, 214, 114, 59, 32896, 55349, 56476, 105, 103, 110, 59, 32768, 8788, 105, 108, 100, 101, 33024, 195, 59, 32768, 195, 109, 108, 33024, 196, 59, 32768, 196, 2048, 97, 99, 101, 102, 111, 114, 115, 117, 253, 278, 282, 310, 315, 321, 327, 332, 512, 99, 114, 258, 267, 107, 115, 108, 97, 115, 104, 59, 32768, 8726, 583, 271, 274, 59, 32768, 10983, 101, 100, 59, 32768, 8966, 121, 59, 32768, 1041, 768, 99, 114, 116, 289, 296, 306, 97, 117, 115, 101, 59, 32768, 8757, 110, 111, 117, 108, 108, 105, 115, 59, 32768, 8492, 97, 59, 32768, 914, 114, 59, 32896, 55349, 56581, 112, 102, 59, 32896, 55349, 56633, 101, 118, 101, 59, 32768, 728, 99, 114, 59, 32768, 8492, 109, 112, 101, 113, 59, 32768, 8782, 3584, 72, 79, 97, 99, 100, 101, 102, 104, 105, 108, 111, 114, 115, 117, 368, 373, 380, 426, 461, 466, 487, 491, 495, 533, 593, 695, 701, 707, 99, 121, 59, 32768, 1063, 80, 89, 33024, 169, 59, 32768, 169, 768, 99, 112, 121, 387, 393, 419, 117, 116, 101, 59, 32768, 262, 512, 59, 105, 398, 400, 32768, 8914, 116, 97, 108, 68, 105, 102, 102, 101, 114, 101, 110, 116, 105, 97, 108, 68, 59, 32768, 8517, 108, 101, 121, 115, 59, 32768, 8493, 1024, 97, 101, 105, 111, 435, 441, 449, 454, 114, 111, 110, 59, 32768, 268, 100, 105, 108, 33024, 199, 59, 32768, 199, 114, 99, 59, 32768, 264, 110, 105, 110, 116, 59, 32768, 8752, 111, 116, 59, 32768, 266, 512, 100, 110, 471, 478, 105, 108, 108, 97, 59, 32768, 184, 116, 101, 114, 68, 111, 116, 59, 32768, 183, 114, 59, 32768, 8493, 105, 59, 32768, 935, 114, 99, 108, 101, 1024, 68, 77, 80, 84, 508, 513, 520, 526, 111, 116, 59, 32768, 8857, 105, 110, 117, 115, 59, 32768, 8854, 108, 117, 115, 59, 32768, 8853, 105, 109, 101, 115, 59, 32768, 8855, 111, 512, 99, 115, 539, 562, 107, 119, 105, 115, 101, 67, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8754, 101, 67, 117, 114, 108, 121, 512, 68, 81, 573, 586, 111, 117, 98, 108, 101, 81, 117, 111, 116, 101, 59, 32768, 8221, 117, 111, 116, 101, 59, 32768, 8217, 1024, 108, 110, 112, 117, 602, 614, 648, 664, 111, 110, 512, 59, 101, 609, 611, 32768, 8759, 59, 32768, 10868, 768, 103, 105, 116, 621, 629, 634, 114, 117, 101, 110, 116, 59, 32768, 8801, 110, 116, 59, 32768, 8751, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8750, 512, 102, 114, 653, 656, 59, 32768, 8450, 111, 100, 117, 99, 116, 59, 32768, 8720, 110, 116, 101, 114, 67, 108, 111, 99, 107, 119, 105, 115, 101, 67, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8755, 111, 115, 115, 59, 32768, 10799, 99, 114, 59, 32896, 55349, 56478, 112, 512, 59, 67, 713, 715, 32768, 8915, 97, 112, 59, 32768, 8781, 2816, 68, 74, 83, 90, 97, 99, 101, 102, 105, 111, 115, 743, 758, 763, 768, 773, 795, 809, 821, 826, 910, 1295, 512, 59, 111, 748, 750, 32768, 8517, 116, 114, 97, 104, 100, 59, 32768, 10513, 99, 121, 59, 32768, 1026, 99, 121, 59, 32768, 1029, 99, 121, 59, 32768, 1039, 768, 103, 114, 115, 780, 786, 790, 103, 101, 114, 59, 32768, 8225, 114, 59, 32768, 8609, 104, 118, 59, 32768, 10980, 512, 97, 121, 800, 806, 114, 111, 110, 59, 32768, 270, 59, 32768, 1044, 108, 512, 59, 116, 815, 817, 32768, 8711, 97, 59, 32768, 916, 114, 59, 32896, 55349, 56583, 512, 97, 102, 831, 897, 512, 99, 109, 836, 891, 114, 105, 116, 105, 99, 97, 108, 1024, 65, 68, 71, 84, 852, 859, 877, 884, 99, 117, 116, 101, 59, 32768, 180, 111, 581, 864, 867, 59, 32768, 729, 98, 108, 101, 65, 99, 117, 116, 101, 59, 32768, 733, 114, 97, 118, 101, 59, 32768, 96, 105, 108, 100, 101, 59, 32768, 732, 111, 110, 100, 59, 32768, 8900, 102, 101, 114, 101, 110, 116, 105, 97, 108, 68, 59, 32768, 8518, 2113, 920, 0, 0, 0, 925, 946, 0, 1139, 102, 59, 32896, 55349, 56635, 768, 59, 68, 69, 931, 933, 938, 32768, 168, 111, 116, 59, 32768, 8412, 113, 117, 97, 108, 59, 32768, 8784, 98, 108, 101, 1536, 67, 68, 76, 82, 85, 86, 961, 978, 996, 1080, 1101, 1125, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 32768, 8751, 111, 1093, 985, 0, 0, 988, 59, 32768, 168, 110, 65, 114, 114, 111, 119, 59, 32768, 8659, 512, 101, 111, 1001, 1034, 102, 116, 768, 65, 82, 84, 1010, 1017, 1029, 114, 114, 111, 119, 59, 32768, 8656, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8660, 101, 101, 59, 32768, 10980, 110, 103, 512, 76, 82, 1041, 1068, 101, 102, 116, 512, 65, 82, 1049, 1056, 114, 114, 111, 119, 59, 32768, 10232, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10234, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10233, 105, 103, 104, 116, 512, 65, 84, 1089, 1096, 114, 114, 111, 119, 59, 32768, 8658, 101, 101, 59, 32768, 8872, 112, 1042, 1108, 0, 0, 1115, 114, 114, 111, 119, 59, 32768, 8657, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8661, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 32768, 8741, 110, 1536, 65, 66, 76, 82, 84, 97, 1152, 1179, 1186, 1236, 1272, 1288, 114, 114, 111, 119, 768, 59, 66, 85, 1163, 1165, 1170, 32768, 8595, 97, 114, 59, 32768, 10515, 112, 65, 114, 114, 111, 119, 59, 32768, 8693, 114, 101, 118, 101, 59, 32768, 785, 101, 102, 116, 1315, 1196, 0, 1209, 0, 1220, 105, 103, 104, 116, 86, 101, 99, 116, 111, 114, 59, 32768, 10576, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10590, 101, 99, 116, 111, 114, 512, 59, 66, 1229, 1231, 32768, 8637, 97, 114, 59, 32768, 10582, 105, 103, 104, 116, 805, 1245, 0, 1256, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10591, 101, 99, 116, 111, 114, 512, 59, 66, 1265, 1267, 32768, 8641, 97, 114, 59, 32768, 10583, 101, 101, 512, 59, 65, 1279, 1281, 32768, 8868, 114, 114, 111, 119, 59, 32768, 8615, 114, 114, 111, 119, 59, 32768, 8659, 512, 99, 116, 1300, 1305, 114, 59, 32896, 55349, 56479, 114, 111, 107, 59, 32768, 272, 4096, 78, 84, 97, 99, 100, 102, 103, 108, 109, 111, 112, 113, 115, 116, 117, 120, 1344, 1348, 1354, 1363, 1386, 1391, 1396, 1405, 1413, 1460, 1475, 1483, 1514, 1527, 1531, 1538, 71, 59, 32768, 330, 72, 33024, 208, 59, 32768, 208, 99, 117, 116, 101, 33024, 201, 59, 32768, 201, 768, 97, 105, 121, 1370, 1376, 1383, 114, 111, 110, 59, 32768, 282, 114, 99, 33024, 202, 59, 32768, 202, 59, 32768, 1069, 111, 116, 59, 32768, 278, 114, 59, 32896, 55349, 56584, 114, 97, 118, 101, 33024, 200, 59, 32768, 200, 101, 109, 101, 110, 116, 59, 32768, 8712, 512, 97, 112, 1418, 1423, 99, 114, 59, 32768, 274, 116, 121, 1060, 1431, 0, 0, 1444, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9723, 101, 114, 121, 83, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9643, 512, 103, 112, 1465, 1470, 111, 110, 59, 32768, 280, 102, 59, 32896, 55349, 56636, 115, 105, 108, 111, 110, 59, 32768, 917, 117, 512, 97, 105, 1489, 1504, 108, 512, 59, 84, 1495, 1497, 32768, 10869, 105, 108, 100, 101, 59, 32768, 8770, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 8652, 512, 99, 105, 1519, 1523, 114, 59, 32768, 8496, 109, 59, 32768, 10867, 97, 59, 32768, 919, 109, 108, 33024, 203, 59, 32768, 203, 512, 105, 112, 1543, 1549, 115, 116, 115, 59, 32768, 8707, 111, 110, 101, 110, 116, 105, 97, 108, 69, 59, 32768, 8519, 1280, 99, 102, 105, 111, 115, 1572, 1576, 1581, 1620, 1648, 121, 59, 32768, 1060, 114, 59, 32896, 55349, 56585, 108, 108, 101, 100, 1060, 1591, 0, 0, 1604, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9724, 101, 114, 121, 83, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 32768, 9642, 1601, 1628, 0, 1633, 0, 0, 1639, 102, 59, 32896, 55349, 56637, 65, 108, 108, 59, 32768, 8704, 114, 105, 101, 114, 116, 114, 102, 59, 32768, 8497, 99, 114, 59, 32768, 8497, 3072, 74, 84, 97, 98, 99, 100, 102, 103, 111, 114, 115, 116, 1678, 1683, 1688, 1701, 1708, 1729, 1734, 1739, 1742, 1748, 1828, 1834, 99, 121, 59, 32768, 1027, 33024, 62, 59, 32768, 62, 109, 109, 97, 512, 59, 100, 1696, 1698, 32768, 915, 59, 32768, 988, 114, 101, 118, 101, 59, 32768, 286, 768, 101, 105, 121, 1715, 1721, 1726, 100, 105, 108, 59, 32768, 290, 114, 99, 59, 32768, 284, 59, 32768, 1043, 111, 116, 59, 32768, 288, 114, 59, 32896, 55349, 56586, 59, 32768, 8921, 112, 102, 59, 32896, 55349, 56638, 101, 97, 116, 101, 114, 1536, 69, 70, 71, 76, 83, 84, 1766, 1783, 1794, 1803, 1809, 1821, 113, 117, 97, 108, 512, 59, 76, 1775, 1777, 32768, 8805, 101, 115, 115, 59, 32768, 8923, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8807, 114, 101, 97, 116, 101, 114, 59, 32768, 10914, 101, 115, 115, 59, 32768, 8823, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 10878, 105, 108, 100, 101, 59, 32768, 8819, 99, 114, 59, 32896, 55349, 56482, 59, 32768, 8811, 2048, 65, 97, 99, 102, 105, 111, 115, 117, 1854, 1861, 1874, 1880, 1884, 1897, 1919, 1934, 82, 68, 99, 121, 59, 32768, 1066, 512, 99, 116, 1866, 1871, 101, 107, 59, 32768, 711, 59, 32768, 94, 105, 114, 99, 59, 32768, 292, 114, 59, 32768, 8460, 108, 98, 101, 114, 116, 83, 112, 97, 99, 101, 59, 32768, 8459, 833, 1902, 0, 1906, 102, 59, 32768, 8461, 105, 122, 111, 110, 116, 97, 108, 76, 105, 110, 101, 59, 32768, 9472, 512, 99, 116, 1924, 1928, 114, 59, 32768, 8459, 114, 111, 107, 59, 32768, 294, 109, 112, 533, 1940, 1950, 111, 119, 110, 72, 117, 109, 112, 59, 32768, 8782, 113, 117, 97, 108, 59, 32768, 8783, 3584, 69, 74, 79, 97, 99, 100, 102, 103, 109, 110, 111, 115, 116, 117, 1985, 1990, 1996, 2001, 2010, 2025, 2030, 2034, 2043, 2077, 2134, 2155, 2160, 2167, 99, 121, 59, 32768, 1045, 108, 105, 103, 59, 32768, 306, 99, 121, 59, 32768, 1025, 99, 117, 116, 101, 33024, 205, 59, 32768, 205, 512, 105, 121, 2015, 2022, 114, 99, 33024, 206, 59, 32768, 206, 59, 32768, 1048, 111, 116, 59, 32768, 304, 114, 59, 32768, 8465, 114, 97, 118, 101, 33024, 204, 59, 32768, 204, 768, 59, 97, 112, 2050, 2052, 2070, 32768, 8465, 512, 99, 103, 2057, 2061, 114, 59, 32768, 298, 105, 110, 97, 114, 121, 73, 59, 32768, 8520, 108, 105, 101, 115, 59, 32768, 8658, 837, 2082, 0, 2110, 512, 59, 101, 2086, 2088, 32768, 8748, 512, 103, 114, 2093, 2099, 114, 97, 108, 59, 32768, 8747, 115, 101, 99, 116, 105, 111, 110, 59, 32768, 8898, 105, 115, 105, 98, 108, 101, 512, 67, 84, 2120, 2127, 111, 109, 109, 97, 59, 32768, 8291, 105, 109, 101, 115, 59, 32768, 8290, 768, 103, 112, 116, 2141, 2146, 2151, 111, 110, 59, 32768, 302, 102, 59, 32896, 55349, 56640, 97, 59, 32768, 921, 99, 114, 59, 32768, 8464, 105, 108, 100, 101, 59, 32768, 296, 828, 2172, 0, 2177, 99, 121, 59, 32768, 1030, 108, 33024, 207, 59, 32768, 207, 1280, 99, 102, 111, 115, 117, 2193, 2206, 2211, 2217, 2232, 512, 105, 121, 2198, 2203, 114, 99, 59, 32768, 308, 59, 32768, 1049, 114, 59, 32896, 55349, 56589, 112, 102, 59, 32896, 55349, 56641, 820, 2222, 0, 2227, 114, 59, 32896, 55349, 56485, 114, 99, 121, 59, 32768, 1032, 107, 99, 121, 59, 32768, 1028, 1792, 72, 74, 97, 99, 102, 111, 115, 2253, 2258, 2263, 2269, 2283, 2288, 2294, 99, 121, 59, 32768, 1061, 99, 121, 59, 32768, 1036, 112, 112, 97, 59, 32768, 922, 512, 101, 121, 2274, 2280, 100, 105, 108, 59, 32768, 310, 59, 32768, 1050, 114, 59, 32896, 55349, 56590, 112, 102, 59, 32896, 55349, 56642, 99, 114, 59, 32896, 55349, 56486, 2816, 74, 84, 97, 99, 101, 102, 108, 109, 111, 115, 116, 2323, 2328, 2333, 2374, 2396, 2775, 2780, 2797, 2804, 2934, 2954, 99, 121, 59, 32768, 1033, 33024, 60, 59, 32768, 60, 1280, 99, 109, 110, 112, 114, 2344, 2350, 2356, 2360, 2370, 117, 116, 101, 59, 32768, 313, 98, 100, 97, 59, 32768, 923, 103, 59, 32768, 10218, 108, 97, 99, 101, 116, 114, 102, 59, 32768, 8466, 114, 59, 32768, 8606, 768, 97, 101, 121, 2381, 2387, 2393, 114, 111, 110, 59, 32768, 317, 100, 105, 108, 59, 32768, 315, 59, 32768, 1051, 512, 102, 115, 2401, 2702, 116, 2560, 65, 67, 68, 70, 82, 84, 85, 86, 97, 114, 2423, 2470, 2479, 2530, 2537, 2561, 2618, 2666, 2683, 2690, 512, 110, 114, 2428, 2441, 103, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10216, 114, 111, 119, 768, 59, 66, 82, 2451, 2453, 2458, 32768, 8592, 97, 114, 59, 32768, 8676, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8646, 101, 105, 108, 105, 110, 103, 59, 32768, 8968, 111, 838, 2485, 0, 2498, 98, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10214, 110, 805, 2503, 0, 2514, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10593, 101, 99, 116, 111, 114, 512, 59, 66, 2523, 2525, 32768, 8643, 97, 114, 59, 32768, 10585, 108, 111, 111, 114, 59, 32768, 8970, 105, 103, 104, 116, 512, 65, 86, 2546, 2553, 114, 114, 111, 119, 59, 32768, 8596, 101, 99, 116, 111, 114, 59, 32768, 10574, 512, 101, 114, 2566, 2591, 101, 768, 59, 65, 86, 2574, 2576, 2583, 32768, 8867, 114, 114, 111, 119, 59, 32768, 8612, 101, 99, 116, 111, 114, 59, 32768, 10586, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 2604, 2606, 2611, 32768, 8882, 97, 114, 59, 32768, 10703, 113, 117, 97, 108, 59, 32768, 8884, 112, 768, 68, 84, 86, 2626, 2638, 2649, 111, 119, 110, 86, 101, 99, 116, 111, 114, 59, 32768, 10577, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10592, 101, 99, 116, 111, 114, 512, 59, 66, 2659, 2661, 32768, 8639, 97, 114, 59, 32768, 10584, 101, 99, 116, 111, 114, 512, 59, 66, 2676, 2678, 32768, 8636, 97, 114, 59, 32768, 10578, 114, 114, 111, 119, 59, 32768, 8656, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8660, 115, 1536, 69, 70, 71, 76, 83, 84, 2716, 2730, 2741, 2750, 2756, 2768, 113, 117, 97, 108, 71, 114, 101, 97, 116, 101, 114, 59, 32768, 8922, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8806, 114, 101, 97, 116, 101, 114, 59, 32768, 8822, 101, 115, 115, 59, 32768, 10913, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 10877, 105, 108, 100, 101, 59, 32768, 8818, 114, 59, 32896, 55349, 56591, 512, 59, 101, 2785, 2787, 32768, 8920, 102, 116, 97, 114, 114, 111, 119, 59, 32768, 8666, 105, 100, 111, 116, 59, 32768, 319, 768, 110, 112, 119, 2811, 2899, 2904, 103, 1024, 76, 82, 108, 114, 2821, 2848, 2860, 2887, 101, 102, 116, 512, 65, 82, 2829, 2836, 114, 114, 111, 119, 59, 32768, 10229, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10231, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 10230, 101, 102, 116, 512, 97, 114, 2868, 2875, 114, 114, 111, 119, 59, 32768, 10232, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10234, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10233, 102, 59, 32896, 55349, 56643, 101, 114, 512, 76, 82, 2911, 2922, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8601, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8600, 768, 99, 104, 116, 2941, 2945, 2948, 114, 59, 32768, 8466, 59, 32768, 8624, 114, 111, 107, 59, 32768, 321, 59, 32768, 8810, 2048, 97, 99, 101, 102, 105, 111, 115, 117, 2974, 2978, 2982, 3007, 3012, 3022, 3028, 3033, 112, 59, 32768, 10501, 121, 59, 32768, 1052, 512, 100, 108, 2987, 2998, 105, 117, 109, 83, 112, 97, 99, 101, 59, 32768, 8287, 108, 105, 110, 116, 114, 102, 59, 32768, 8499, 114, 59, 32896, 55349, 56592, 110, 117, 115, 80, 108, 117, 115, 59, 32768, 8723, 112, 102, 59, 32896, 55349, 56644, 99, 114, 59, 32768, 8499, 59, 32768, 924, 2304, 74, 97, 99, 101, 102, 111, 115, 116, 117, 3055, 3060, 3067, 3089, 3201, 3206, 3874, 3880, 3889, 99, 121, 59, 32768, 1034, 99, 117, 116, 101, 59, 32768, 323, 768, 97, 101, 121, 3074, 3080, 3086, 114, 111, 110, 59, 32768, 327, 100, 105, 108, 59, 32768, 325, 59, 32768, 1053, 768, 103, 115, 119, 3096, 3160, 3194, 97, 116, 105, 118, 101, 768, 77, 84, 86, 3108, 3121, 3145, 101, 100, 105, 117, 109, 83, 112, 97, 99, 101, 59, 32768, 8203, 104, 105, 512, 99, 110, 3128, 3137, 107, 83, 112, 97, 99, 101, 59, 32768, 8203, 83, 112, 97, 99, 101, 59, 32768, 8203, 101, 114, 121, 84, 104, 105, 110, 83, 112, 97, 99, 101, 59, 32768, 8203, 116, 101, 100, 512, 71, 76, 3168, 3184, 114, 101, 97, 116, 101, 114, 71, 114, 101, 97, 116, 101, 114, 59, 32768, 8811, 101, 115, 115, 76, 101, 115, 115, 59, 32768, 8810, 76, 105, 110, 101, 59, 32768, 10, 114, 59, 32896, 55349, 56593, 1024, 66, 110, 112, 116, 3215, 3222, 3238, 3242, 114, 101, 97, 107, 59, 32768, 8288, 66, 114, 101, 97, 107, 105, 110, 103, 83, 112, 97, 99, 101, 59, 32768, 160, 102, 59, 32768, 8469, 3328, 59, 67, 68, 69, 71, 72, 76, 78, 80, 82, 83, 84, 86, 3269, 3271, 3293, 3312, 3352, 3430, 3455, 3551, 3589, 3625, 3678, 3821, 3861, 32768, 10988, 512, 111, 117, 3276, 3286, 110, 103, 114, 117, 101, 110, 116, 59, 32768, 8802, 112, 67, 97, 112, 59, 32768, 8813, 111, 117, 98, 108, 101, 86, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 32768, 8742, 768, 108, 113, 120, 3319, 3327, 3345, 101, 109, 101, 110, 116, 59, 32768, 8713, 117, 97, 108, 512, 59, 84, 3335, 3337, 32768, 8800, 105, 108, 100, 101, 59, 32896, 8770, 824, 105, 115, 116, 115, 59, 32768, 8708, 114, 101, 97, 116, 101, 114, 1792, 59, 69, 70, 71, 76, 83, 84, 3373, 3375, 3382, 3394, 3404, 3410, 3423, 32768, 8815, 113, 117, 97, 108, 59, 32768, 8817, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32896, 8807, 824, 114, 101, 97, 116, 101, 114, 59, 32896, 8811, 824, 101, 115, 115, 59, 32768, 8825, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32896, 10878, 824, 105, 108, 100, 101, 59, 32768, 8821, 117, 109, 112, 533, 3437, 3448, 111, 119, 110, 72, 117, 109, 112, 59, 32896, 8782, 824, 113, 117, 97, 108, 59, 32896, 8783, 824, 101, 512, 102, 115, 3461, 3492, 116, 84, 114, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 3477, 3479, 3485, 32768, 8938, 97, 114, 59, 32896, 10703, 824, 113, 117, 97, 108, 59, 32768, 8940, 115, 1536, 59, 69, 71, 76, 83, 84, 3506, 3508, 3515, 3524, 3531, 3544, 32768, 8814, 113, 117, 97, 108, 59, 32768, 8816, 114, 101, 97, 116, 101, 114, 59, 32768, 8824, 101, 115, 115, 59, 32896, 8810, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32896, 10877, 824, 105, 108, 100, 101, 59, 32768, 8820, 101, 115, 116, 101, 100, 512, 71, 76, 3561, 3578, 114, 101, 97, 116, 101, 114, 71, 114, 101, 97, 116, 101, 114, 59, 32896, 10914, 824, 101, 115, 115, 76, 101, 115, 115, 59, 32896, 10913, 824, 114, 101, 99, 101, 100, 101, 115, 768, 59, 69, 83, 3603, 3605, 3613, 32768, 8832, 113, 117, 97, 108, 59, 32896, 10927, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8928, 512, 101, 105, 3630, 3645, 118, 101, 114, 115, 101, 69, 108, 101, 109, 101, 110, 116, 59, 32768, 8716, 103, 104, 116, 84, 114, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 3663, 3665, 3671, 32768, 8939, 97, 114, 59, 32896, 10704, 824, 113, 117, 97, 108, 59, 32768, 8941, 512, 113, 117, 3683, 3732, 117, 97, 114, 101, 83, 117, 512, 98, 112, 3694, 3712, 115, 101, 116, 512, 59, 69, 3702, 3705, 32896, 8847, 824, 113, 117, 97, 108, 59, 32768, 8930, 101, 114, 115, 101, 116, 512, 59, 69, 3722, 3725, 32896, 8848, 824, 113, 117, 97, 108, 59, 32768, 8931, 768, 98, 99, 112, 3739, 3757, 3801, 115, 101, 116, 512, 59, 69, 3747, 3750, 32896, 8834, 8402, 113, 117, 97, 108, 59, 32768, 8840, 99, 101, 101, 100, 115, 1024, 59, 69, 83, 84, 3771, 3773, 3781, 3793, 32768, 8833, 113, 117, 97, 108, 59, 32896, 10928, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8929, 105, 108, 100, 101, 59, 32896, 8831, 824, 101, 114, 115, 101, 116, 512, 59, 69, 3811, 3814, 32896, 8835, 8402, 113, 117, 97, 108, 59, 32768, 8841, 105, 108, 100, 101, 1024, 59, 69, 70, 84, 3834, 3836, 3843, 3854, 32768, 8769, 113, 117, 97, 108, 59, 32768, 8772, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8775, 105, 108, 100, 101, 59, 32768, 8777, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 32768, 8740, 99, 114, 59, 32896, 55349, 56489, 105, 108, 100, 101, 33024, 209, 59, 32768, 209, 59, 32768, 925, 3584, 69, 97, 99, 100, 102, 103, 109, 111, 112, 114, 115, 116, 117, 118, 3921, 3927, 3936, 3951, 3958, 3963, 3972, 3996, 4002, 4034, 4037, 4055, 4071, 4078, 108, 105, 103, 59, 32768, 338, 99, 117, 116, 101, 33024, 211, 59, 32768, 211, 512, 105, 121, 3941, 3948, 114, 99, 33024, 212, 59, 32768, 212, 59, 32768, 1054, 98, 108, 97, 99, 59, 32768, 336, 114, 59, 32896, 55349, 56594, 114, 97, 118, 101, 33024, 210, 59, 32768, 210, 768, 97, 101, 105, 3979, 3984, 3989, 99, 114, 59, 32768, 332, 103, 97, 59, 32768, 937, 99, 114, 111, 110, 59, 32768, 927, 112, 102, 59, 32896, 55349, 56646, 101, 110, 67, 117, 114, 108, 121, 512, 68, 81, 4014, 4027, 111, 117, 98, 108, 101, 81, 117, 111, 116, 101, 59, 32768, 8220, 117, 111, 116, 101, 59, 32768, 8216, 59, 32768, 10836, 512, 99, 108, 4042, 4047, 114, 59, 32896, 55349, 56490, 97, 115, 104, 33024, 216, 59, 32768, 216, 105, 573, 4060, 4067, 100, 101, 33024, 213, 59, 32768, 213, 101, 115, 59, 32768, 10807, 109, 108, 33024, 214, 59, 32768, 214, 101, 114, 512, 66, 80, 4085, 4109, 512, 97, 114, 4090, 4094, 114, 59, 32768, 8254, 97, 99, 512, 101, 107, 4101, 4104, 59, 32768, 9182, 101, 116, 59, 32768, 9140, 97, 114, 101, 110, 116, 104, 101, 115, 105, 115, 59, 32768, 9180, 2304, 97, 99, 102, 104, 105, 108, 111, 114, 115, 4141, 4150, 4154, 4159, 4163, 4166, 4176, 4198, 4284, 114, 116, 105, 97, 108, 68, 59, 32768, 8706, 121, 59, 32768, 1055, 114, 59, 32896, 55349, 56595, 105, 59, 32768, 934, 59, 32768, 928, 117, 115, 77, 105, 110, 117, 115, 59, 32768, 177, 512, 105, 112, 4181, 4194, 110, 99, 97, 114, 101, 112, 108, 97, 110, 101, 59, 32768, 8460, 102, 59, 32768, 8473, 1024, 59, 101, 105, 111, 4207, 4209, 4251, 4256, 32768, 10939, 99, 101, 100, 101, 115, 1024, 59, 69, 83, 84, 4223, 4225, 4232, 4244, 32768, 8826, 113, 117, 97, 108, 59, 32768, 10927, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8828, 105, 108, 100, 101, 59, 32768, 8830, 109, 101, 59, 32768, 8243, 512, 100, 112, 4261, 4267, 117, 99, 116, 59, 32768, 8719, 111, 114, 116, 105, 111, 110, 512, 59, 97, 4278, 4280, 32768, 8759, 108, 59, 32768, 8733, 512, 99, 105, 4289, 4294, 114, 59, 32896, 55349, 56491, 59, 32768, 936, 1024, 85, 102, 111, 115, 4306, 4313, 4318, 4323, 79, 84, 33024, 34, 59, 32768, 34, 114, 59, 32896, 55349, 56596, 112, 102, 59, 32768, 8474, 99, 114, 59, 32896, 55349, 56492, 3072, 66, 69, 97, 99, 101, 102, 104, 105, 111, 114, 115, 117, 4354, 4360, 4366, 4395, 4417, 4473, 4477, 4481, 4743, 4764, 4776, 4788, 97, 114, 114, 59, 32768, 10512, 71, 33024, 174, 59, 32768, 174, 768, 99, 110, 114, 4373, 4379, 4383, 117, 116, 101, 59, 32768, 340, 103, 59, 32768, 10219, 114, 512, 59, 116, 4389, 4391, 32768, 8608, 108, 59, 32768, 10518, 768, 97, 101, 121, 4402, 4408, 4414, 114, 111, 110, 59, 32768, 344, 100, 105, 108, 59, 32768, 342, 59, 32768, 1056, 512, 59, 118, 4422, 4424, 32768, 8476, 101, 114, 115, 101, 512, 69, 85, 4433, 4458, 512, 108, 113, 4438, 4446, 101, 109, 101, 110, 116, 59, 32768, 8715, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 8651, 112, 69, 113, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 10607, 114, 59, 32768, 8476, 111, 59, 32768, 929, 103, 104, 116, 2048, 65, 67, 68, 70, 84, 85, 86, 97, 4501, 4547, 4556, 4607, 4614, 4671, 4719, 4736, 512, 110, 114, 4506, 4519, 103, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10217, 114, 111, 119, 768, 59, 66, 76, 4529, 4531, 4536, 32768, 8594, 97, 114, 59, 32768, 8677, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8644, 101, 105, 108, 105, 110, 103, 59, 32768, 8969, 111, 838, 4562, 0, 4575, 98, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 32768, 10215, 110, 805, 4580, 0, 4591, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10589, 101, 99, 116, 111, 114, 512, 59, 66, 4600, 4602, 32768, 8642, 97, 114, 59, 32768, 10581, 108, 111, 111, 114, 59, 32768, 8971, 512, 101, 114, 4619, 4644, 101, 768, 59, 65, 86, 4627, 4629, 4636, 32768, 8866, 114, 114, 111, 119, 59, 32768, 8614, 101, 99, 116, 111, 114, 59, 32768, 10587, 105, 97, 110, 103, 108, 101, 768, 59, 66, 69, 4657, 4659, 4664, 32768, 8883, 97, 114, 59, 32768, 10704, 113, 117, 97, 108, 59, 32768, 8885, 112, 768, 68, 84, 86, 4679, 4691, 4702, 111, 119, 110, 86, 101, 99, 116, 111, 114, 59, 32768, 10575, 101, 101, 86, 101, 99, 116, 111, 114, 59, 32768, 10588, 101, 99, 116, 111, 114, 512, 59, 66, 4712, 4714, 32768, 8638, 97, 114, 59, 32768, 10580, 101, 99, 116, 111, 114, 512, 59, 66, 4729, 4731, 32768, 8640, 97, 114, 59, 32768, 10579, 114, 114, 111, 119, 59, 32768, 8658, 512, 112, 117, 4748, 4752, 102, 59, 32768, 8477, 110, 100, 73, 109, 112, 108, 105, 101, 115, 59, 32768, 10608, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8667, 512, 99, 104, 4781, 4785, 114, 59, 32768, 8475, 59, 32768, 8625, 108, 101, 68, 101, 108, 97, 121, 101, 100, 59, 32768, 10740, 3328, 72, 79, 97, 99, 102, 104, 105, 109, 111, 113, 115, 116, 117, 4827, 4842, 4849, 4856, 4889, 4894, 4949, 4955, 4967, 4973, 5059, 5065, 5070, 512, 67, 99, 4832, 4838, 72, 99, 121, 59, 32768, 1065, 121, 59, 32768, 1064, 70, 84, 99, 121, 59, 32768, 1068, 99, 117, 116, 101, 59, 32768, 346, 1280, 59, 97, 101, 105, 121, 4867, 4869, 4875, 4881, 4886, 32768, 10940, 114, 111, 110, 59, 32768, 352, 100, 105, 108, 59, 32768, 350, 114, 99, 59, 32768, 348, 59, 32768, 1057, 114, 59, 32896, 55349, 56598, 111, 114, 116, 1024, 68, 76, 82, 85, 4906, 4917, 4928, 4940, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8595, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8592, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8594, 112, 65, 114, 114, 111, 119, 59, 32768, 8593, 103, 109, 97, 59, 32768, 931, 97, 108, 108, 67, 105, 114, 99, 108, 101, 59, 32768, 8728, 112, 102, 59, 32896, 55349, 56650, 1091, 4979, 0, 0, 4983, 116, 59, 32768, 8730, 97, 114, 101, 1024, 59, 73, 83, 85, 4994, 4996, 5010, 5052, 32768, 9633, 110, 116, 101, 114, 115, 101, 99, 116, 105, 111, 110, 59, 32768, 8851, 117, 512, 98, 112, 5016, 5033, 115, 101, 116, 512, 59, 69, 5024, 5026, 32768, 8847, 113, 117, 97, 108, 59, 32768, 8849, 101, 114, 115, 101, 116, 512, 59, 69, 5043, 5045, 32768, 8848, 113, 117, 97, 108, 59, 32768, 8850, 110, 105, 111, 110, 59, 32768, 8852, 99, 114, 59, 32896, 55349, 56494, 97, 114, 59, 32768, 8902, 1024, 98, 99, 109, 112, 5079, 5102, 5155, 5158, 512, 59, 115, 5084, 5086, 32768, 8912, 101, 116, 512, 59, 69, 5093, 5095, 32768, 8912, 113, 117, 97, 108, 59, 32768, 8838, 512, 99, 104, 5107, 5148, 101, 101, 100, 115, 1024, 59, 69, 83, 84, 5120, 5122, 5129, 5141, 32768, 8827, 113, 117, 97, 108, 59, 32768, 10928, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 32768, 8829, 105, 108, 100, 101, 59, 32768, 8831, 84, 104, 97, 116, 59, 32768, 8715, 59, 32768, 8721, 768, 59, 101, 115, 5165, 5167, 5185, 32768, 8913, 114, 115, 101, 116, 512, 59, 69, 5176, 5178, 32768, 8835, 113, 117, 97, 108, 59, 32768, 8839, 101, 116, 59, 32768, 8913, 2816, 72, 82, 83, 97, 99, 102, 104, 105, 111, 114, 115, 5213, 5221, 5227, 5241, 5252, 5274, 5279, 5323, 5362, 5368, 5378, 79, 82, 78, 33024, 222, 59, 32768, 222, 65, 68, 69, 59, 32768, 8482, 512, 72, 99, 5232, 5237, 99, 121, 59, 32768, 1035, 121, 59, 32768, 1062, 512, 98, 117, 5246, 5249, 59, 32768, 9, 59, 32768, 932, 768, 97, 101, 121, 5259, 5265, 5271, 114, 111, 110, 59, 32768, 356, 100, 105, 108, 59, 32768, 354, 59, 32768, 1058, 114, 59, 32896, 55349, 56599, 512, 101, 105, 5284, 5300, 835, 5289, 0, 5297, 101, 102, 111, 114, 101, 59, 32768, 8756, 97, 59, 32768, 920, 512, 99, 110, 5305, 5315, 107, 83, 112, 97, 99, 101, 59, 32896, 8287, 8202, 83, 112, 97, 99, 101, 59, 32768, 8201, 108, 100, 101, 1024, 59, 69, 70, 84, 5335, 5337, 5344, 5355, 32768, 8764, 113, 117, 97, 108, 59, 32768, 8771, 117, 108, 108, 69, 113, 117, 97, 108, 59, 32768, 8773, 105, 108, 100, 101, 59, 32768, 8776, 112, 102, 59, 32896, 55349, 56651, 105, 112, 108, 101, 68, 111, 116, 59, 32768, 8411, 512, 99, 116, 5383, 5388, 114, 59, 32896, 55349, 56495, 114, 111, 107, 59, 32768, 358, 5426, 5417, 5444, 5458, 5473, 0, 5480, 5485, 0, 0, 0, 0, 0, 5494, 5500, 5564, 5579, 0, 5726, 5732, 5738, 5745, 512, 99, 114, 5421, 5429, 117, 116, 101, 33024, 218, 59, 32768, 218, 114, 512, 59, 111, 5435, 5437, 32768, 8607, 99, 105, 114, 59, 32768, 10569, 114, 820, 5449, 0, 5453, 121, 59, 32768, 1038, 118, 101, 59, 32768, 364, 512, 105, 121, 5462, 5469, 114, 99, 33024, 219, 59, 32768, 219, 59, 32768, 1059, 98, 108, 97, 99, 59, 32768, 368, 114, 59, 32896, 55349, 56600, 114, 97, 118, 101, 33024, 217, 59, 32768, 217, 97, 99, 114, 59, 32768, 362, 512, 100, 105, 5504, 5548, 101, 114, 512, 66, 80, 5511, 5535, 512, 97, 114, 5516, 5520, 114, 59, 32768, 95, 97, 99, 512, 101, 107, 5527, 5530, 59, 32768, 9183, 101, 116, 59, 32768, 9141, 97, 114, 101, 110, 116, 104, 101, 115, 105, 115, 59, 32768, 9181, 111, 110, 512, 59, 80, 5555, 5557, 32768, 8899, 108, 117, 115, 59, 32768, 8846, 512, 103, 112, 5568, 5573, 111, 110, 59, 32768, 370, 102, 59, 32896, 55349, 56652, 2048, 65, 68, 69, 84, 97, 100, 112, 115, 5595, 5624, 5635, 5648, 5664, 5671, 5682, 5712, 114, 114, 111, 119, 768, 59, 66, 68, 5606, 5608, 5613, 32768, 8593, 97, 114, 59, 32768, 10514, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8645, 111, 119, 110, 65, 114, 114, 111, 119, 59, 32768, 8597, 113, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 32768, 10606, 101, 101, 512, 59, 65, 5655, 5657, 32768, 8869, 114, 114, 111, 119, 59, 32768, 8613, 114, 114, 111, 119, 59, 32768, 8657, 111, 119, 110, 97, 114, 114, 111, 119, 59, 32768, 8661, 101, 114, 512, 76, 82, 5689, 5700, 101, 102, 116, 65, 114, 114, 111, 119, 59, 32768, 8598, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 32768, 8599, 105, 512, 59, 108, 5718, 5720, 32768, 978, 111, 110, 59, 32768, 933, 105, 110, 103, 59, 32768, 366, 99, 114, 59, 32896, 55349, 56496, 105, 108, 100, 101, 59, 32768, 360, 109, 108, 33024, 220, 59, 32768, 220, 2304, 68, 98, 99, 100, 101, 102, 111, 115, 118, 5770, 5776, 5781, 5785, 5798, 5878, 5883, 5889, 5895, 97, 115, 104, 59, 32768, 8875, 97, 114, 59, 32768, 10987, 121, 59, 32768, 1042, 97, 115, 104, 512, 59, 108, 5793, 5795, 32768, 8873, 59, 32768, 10982, 512, 101, 114, 5803, 5806, 59, 32768, 8897, 768, 98, 116, 121, 5813, 5818, 5866, 97, 114, 59, 32768, 8214, 512, 59, 105, 5823, 5825, 32768, 8214, 99, 97, 108, 1024, 66, 76, 83, 84, 5837, 5842, 5848, 5859, 97, 114, 59, 32768, 8739, 105, 110, 101, 59, 32768, 124, 101, 112, 97, 114, 97, 116, 111, 114, 59, 32768, 10072, 105, 108, 100, 101, 59, 32768, 8768, 84, 104, 105, 110, 83, 112, 97, 99, 101, 59, 32768, 8202, 114, 59, 32896, 55349, 56601, 112, 102, 59, 32896, 55349, 56653, 99, 114, 59, 32896, 55349, 56497, 100, 97, 115, 104, 59, 32768, 8874, 1280, 99, 101, 102, 111, 115, 5913, 5919, 5925, 5930, 5936, 105, 114, 99, 59, 32768, 372, 100, 103, 101, 59, 32768, 8896, 114, 59, 32896, 55349, 56602, 112, 102, 59, 32896, 55349, 56654, 99, 114, 59, 32896, 55349, 56498, 1024, 102, 105, 111, 115, 5951, 5956, 5959, 5965, 114, 59, 32896, 55349, 56603, 59, 32768, 926, 112, 102, 59, 32896, 55349, 56655, 99, 114, 59, 32896, 55349, 56499, 2304, 65, 73, 85, 97, 99, 102, 111, 115, 117, 5990, 5995, 6000, 6005, 6014, 6027, 6032, 6038, 6044, 99, 121, 59, 32768, 1071, 99, 121, 59, 32768, 1031, 99, 121, 59, 32768, 1070, 99, 117, 116, 101, 33024, 221, 59, 32768, 221, 512, 105, 121, 6019, 6024, 114, 99, 59, 32768, 374, 59, 32768, 1067, 114, 59, 32896, 55349, 56604, 112, 102, 59, 32896, 55349, 56656, 99, 114, 59, 32896, 55349, 56500, 109, 108, 59, 32768, 376, 2048, 72, 97, 99, 100, 101, 102, 111, 115, 6066, 6071, 6078, 6092, 6097, 6119, 6123, 6128, 99, 121, 59, 32768, 1046, 99, 117, 116, 101, 59, 32768, 377, 512, 97, 121, 6083, 6089, 114, 111, 110, 59, 32768, 381, 59, 32768, 1047, 111, 116, 59, 32768, 379, 835, 6102, 0, 6116, 111, 87, 105, 100, 116, 104, 83, 112, 97, 99, 101, 59, 32768, 8203, 97, 59, 32768, 918, 114, 59, 32768, 8488, 112, 102, 59, 32768, 8484, 99, 114, 59, 32896, 55349, 56501, 5938, 6159, 6168, 6175, 0, 6214, 6222, 6233, 0, 0, 0, 0, 6242, 6267, 6290, 6429, 6444, 0, 6495, 6503, 6531, 6540, 0, 6547, 99, 117, 116, 101, 33024, 225, 59, 32768, 225, 114, 101, 118, 101, 59, 32768, 259, 1536, 59, 69, 100, 105, 117, 121, 6187, 6189, 6193, 6196, 6203, 6210, 32768, 8766, 59, 32896, 8766, 819, 59, 32768, 8767, 114, 99, 33024, 226, 59, 32768, 226, 116, 101, 33024, 180, 59, 32768, 180, 59, 32768, 1072, 108, 105, 103, 33024, 230, 59, 32768, 230, 512, 59, 114, 6226, 6228, 32768, 8289, 59, 32896, 55349, 56606, 114, 97, 118, 101, 33024, 224, 59, 32768, 224, 512, 101, 112, 6246, 6261, 512, 102, 112, 6251, 6257, 115, 121, 109, 59, 32768, 8501, 104, 59, 32768, 8501, 104, 97, 59, 32768, 945, 512, 97, 112, 6271, 6284, 512, 99, 108, 6276, 6280, 114, 59, 32768, 257, 103, 59, 32768, 10815, 33024, 38, 59, 32768, 38, 1077, 6295, 0, 0, 6326, 1280, 59, 97, 100, 115, 118, 6305, 6307, 6312, 6315, 6322, 32768, 8743, 110, 100, 59, 32768, 10837, 59, 32768, 10844, 108, 111, 112, 101, 59, 32768, 10840, 59, 32768, 10842, 1792, 59, 101, 108, 109, 114, 115, 122, 6340, 6342, 6345, 6349, 6391, 6410, 6422, 32768, 8736, 59, 32768, 10660, 101, 59, 32768, 8736, 115, 100, 512, 59, 97, 6356, 6358, 32768, 8737, 2098, 6368, 6371, 6374, 6377, 6380, 6383, 6386, 6389, 59, 32768, 10664, 59, 32768, 10665, 59, 32768, 10666, 59, 32768, 10667, 59, 32768, 10668, 59, 32768, 10669, 59, 32768, 10670, 59, 32768, 10671, 116, 512, 59, 118, 6397, 6399, 32768, 8735, 98, 512, 59, 100, 6405, 6407, 32768, 8894, 59, 32768, 10653, 512, 112, 116, 6415, 6419, 104, 59, 32768, 8738, 59, 32768, 197, 97, 114, 114, 59, 32768, 9084, 512, 103, 112, 6433, 6438, 111, 110, 59, 32768, 261, 102, 59, 32896, 55349, 56658, 1792, 59, 69, 97, 101, 105, 111, 112, 6458, 6460, 6463, 6469, 6472, 6476, 6480, 32768, 8776, 59, 32768, 10864, 99, 105, 114, 59, 32768, 10863, 59, 32768, 8778, 100, 59, 32768, 8779, 115, 59, 32768, 39, 114, 111, 120, 512, 59, 101, 6488, 6490, 32768, 8776, 113, 59, 32768, 8778, 105, 110, 103, 33024, 229, 59, 32768, 229, 768, 99, 116, 121, 6509, 6514, 6517, 114, 59, 32896, 55349, 56502, 59, 32768, 42, 109, 112, 512, 59, 101, 6524, 6526, 32768, 8776, 113, 59, 32768, 8781, 105, 108, 100, 101, 33024, 227, 59, 32768, 227, 109, 108, 33024, 228, 59, 32768, 228, 512, 99, 105, 6551, 6559, 111, 110, 105, 110, 116, 59, 32768, 8755, 110, 116, 59, 32768, 10769, 4096, 78, 97, 98, 99, 100, 101, 102, 105, 107, 108, 110, 111, 112, 114, 115, 117, 6597, 6602, 6673, 6688, 6701, 6707, 6768, 6773, 6891, 6898, 6999, 7023, 7309, 7316, 7334, 7383, 111, 116, 59, 32768, 10989, 512, 99, 114, 6607, 6652, 107, 1024, 99, 101, 112, 115, 6617, 6623, 6632, 6639, 111, 110, 103, 59, 32768, 8780, 112, 115, 105, 108, 111, 110, 59, 32768, 1014, 114, 105, 109, 101, 59, 32768, 8245, 105, 109, 512, 59, 101, 6646, 6648, 32768, 8765, 113, 59, 32768, 8909, 583, 6656, 6661, 101, 101, 59, 32768, 8893, 101, 100, 512, 59, 103, 6667, 6669, 32768, 8965, 101, 59, 32768, 8965, 114, 107, 512, 59, 116, 6680, 6682, 32768, 9141, 98, 114, 107, 59, 32768, 9142, 512, 111, 121, 6693, 6698, 110, 103, 59, 32768, 8780, 59, 32768, 1073, 113, 117, 111, 59, 32768, 8222, 1280, 99, 109, 112, 114, 116, 6718, 6731, 6738, 6743, 6749, 97, 117, 115, 512, 59, 101, 6726, 6728, 32768, 8757, 59, 32768, 8757, 112, 116, 121, 118, 59, 32768, 10672, 115, 105, 59, 32768, 1014, 110, 111, 117, 59, 32768, 8492, 768, 97, 104, 119, 6756, 6759, 6762, 59, 32768, 946, 59, 32768, 8502, 101, 101, 110, 59, 32768, 8812, 114, 59, 32896, 55349, 56607, 103, 1792, 99, 111, 115, 116, 117, 118, 119, 6789, 6809, 6834, 6850, 6872, 6879, 6884, 768, 97, 105, 117, 6796, 6800, 6805, 112, 59, 32768, 8898, 114, 99, 59, 32768, 9711, 112, 59, 32768, 8899, 768, 100, 112, 116, 6816, 6821, 6827, 111, 116, 59, 32768, 10752, 108, 117, 115, 59, 32768, 10753, 105, 109, 101, 115, 59, 32768, 10754, 1090, 6840, 0, 0, 6846, 99, 117, 112, 59, 32768, 10758, 97, 114, 59, 32768, 9733, 114, 105, 97, 110, 103, 108, 101, 512, 100, 117, 6862, 6868, 111, 119, 110, 59, 32768, 9661, 112, 59, 32768, 9651, 112, 108, 117, 115, 59, 32768, 10756, 101, 101, 59, 32768, 8897, 101, 100, 103, 101, 59, 32768, 8896, 97, 114, 111, 119, 59, 32768, 10509, 768, 97, 107, 111, 6905, 6976, 6994, 512, 99, 110, 6910, 6972, 107, 768, 108, 115, 116, 6918, 6927, 6935, 111, 122, 101, 110, 103, 101, 59, 32768, 10731, 113, 117, 97, 114, 101, 59, 32768, 9642, 114, 105, 97, 110, 103, 108, 101, 1024, 59, 100, 108, 114, 6951, 6953, 6959, 6965, 32768, 9652, 111, 119, 110, 59, 32768, 9662, 101, 102, 116, 59, 32768, 9666, 105, 103, 104, 116, 59, 32768, 9656, 107, 59, 32768, 9251, 770, 6981, 0, 6991, 771, 6985, 0, 6988, 59, 32768, 9618, 59, 32768, 9617, 52, 59, 32768, 9619, 99, 107, 59, 32768, 9608, 512, 101, 111, 7004, 7019, 512, 59, 113, 7009, 7012, 32896, 61, 8421, 117, 105, 118, 59, 32896, 8801, 8421, 116, 59, 32768, 8976, 1024, 112, 116, 119, 120, 7032, 7037, 7049, 7055, 102, 59, 32896, 55349, 56659, 512, 59, 116, 7042, 7044, 32768, 8869, 111, 109, 59, 32768, 8869, 116, 105, 101, 59, 32768, 8904, 3072, 68, 72, 85, 86, 98, 100, 104, 109, 112, 116, 117, 118, 7080, 7101, 7126, 7147, 7182, 7187, 7208, 7233, 7240, 7246, 7253, 7274, 1024, 76, 82, 108, 114, 7089, 7092, 7095, 7098, 59, 32768, 9559, 59, 32768, 9556, 59, 32768, 9558, 59, 32768, 9555, 1280, 59, 68, 85, 100, 117, 7112, 7114, 7117, 7120, 7123, 32768, 9552, 59, 32768, 9574, 59, 32768, 9577, 59, 32768, 9572, 59, 32768, 9575, 1024, 76, 82, 108, 114, 7135, 7138, 7141, 7144, 59, 32768, 9565, 59, 32768, 9562, 59, 32768, 9564, 59, 32768, 9561, 1792, 59, 72, 76, 82, 104, 108, 114, 7162, 7164, 7167, 7170, 7173, 7176, 7179, 32768, 9553, 59, 32768, 9580, 59, 32768, 9571, 59, 32768, 9568, 59, 32768, 9579, 59, 32768, 9570, 59, 32768, 9567, 111, 120, 59, 32768, 10697, 1024, 76, 82, 108, 114, 7196, 7199, 7202, 7205, 59, 32768, 9557, 59, 32768, 9554, 59, 32768, 9488, 59, 32768, 9484, 1280, 59, 68, 85, 100, 117, 7219, 7221, 7224, 7227, 7230, 32768, 9472, 59, 32768, 9573, 59, 32768, 9576, 59, 32768, 9516, 59, 32768, 9524, 105, 110, 117, 115, 59, 32768, 8863, 108, 117, 115, 59, 32768, 8862, 105, 109, 101, 115, 59, 32768, 8864, 1024, 76, 82, 108, 114, 7262, 7265, 7268, 7271, 59, 32768, 9563, 59, 32768, 9560, 59, 32768, 9496, 59, 32768, 9492, 1792, 59, 72, 76, 82, 104, 108, 114, 7289, 7291, 7294, 7297, 7300, 7303, 7306, 32768, 9474, 59, 32768, 9578, 59, 32768, 9569, 59, 32768, 9566, 59, 32768, 9532, 59, 32768, 9508, 59, 32768, 9500, 114, 105, 109, 101, 59, 32768, 8245, 512, 101, 118, 7321, 7326, 118, 101, 59, 32768, 728, 98, 97, 114, 33024, 166, 59, 32768, 166, 1024, 99, 101, 105, 111, 7343, 7348, 7353, 7364, 114, 59, 32896, 55349, 56503, 109, 105, 59, 32768, 8271, 109, 512, 59, 101, 7359, 7361, 32768, 8765, 59, 32768, 8909, 108, 768, 59, 98, 104, 7372, 7374, 7377, 32768, 92, 59, 32768, 10693, 115, 117, 98, 59, 32768, 10184, 573, 7387, 7399, 108, 512, 59, 101, 7392, 7394, 32768, 8226, 116, 59, 32768, 8226, 112, 768, 59, 69, 101, 7406, 7408, 7411, 32768, 8782, 59, 32768, 10926, 512, 59, 113, 7416, 7418, 32768, 8783, 59, 32768, 8783, 6450, 7448, 0, 7523, 7571, 7576, 7613, 0, 7618, 7647, 0, 0, 7764, 0, 0, 7779, 0, 0, 7899, 7914, 7949, 7955, 0, 8158, 0, 8176, 768, 99, 112, 114, 7454, 7460, 7509, 117, 116, 101, 59, 32768, 263, 1536, 59, 97, 98, 99, 100, 115, 7473, 7475, 7480, 7487, 7500, 7505, 32768, 8745, 110, 100, 59, 32768, 10820, 114, 99, 117, 112, 59, 32768, 10825, 512, 97, 117, 7492, 7496, 112, 59, 32768, 10827, 112, 59, 32768, 10823, 111, 116, 59, 32768, 10816, 59, 32896, 8745, 65024, 512, 101, 111, 7514, 7518, 116, 59, 32768, 8257, 110, 59, 32768, 711, 1024, 97, 101, 105, 117, 7531, 7544, 7552, 7557, 833, 7536, 0, 7540, 115, 59, 32768, 10829, 111, 110, 59, 32768, 269, 100, 105, 108, 33024, 231, 59, 32768, 231, 114, 99, 59, 32768, 265, 112, 115, 512, 59, 115, 7564, 7566, 32768, 10828, 109, 59, 32768, 10832, 111, 116, 59, 32768, 267, 768, 100, 109, 110, 7582, 7589, 7596, 105, 108, 33024, 184, 59, 32768, 184, 112, 116, 121, 118, 59, 32768, 10674, 116, 33280, 162, 59, 101, 7603, 7605, 32768, 162, 114, 100, 111, 116, 59, 32768, 183, 114, 59, 32896, 55349, 56608, 768, 99, 101, 105, 7624, 7628, 7643, 121, 59, 32768, 1095, 99, 107, 512, 59, 109, 7635, 7637, 32768, 10003, 97, 114, 107, 59, 32768, 10003, 59, 32768, 967, 114, 1792, 59, 69, 99, 101, 102, 109, 115, 7662, 7664, 7667, 7742, 7745, 7752, 7757, 32768, 9675, 59, 32768, 10691, 768, 59, 101, 108, 7674, 7676, 7680, 32768, 710, 113, 59, 32768, 8791, 101, 1074, 7687, 0, 0, 7709, 114, 114, 111, 119, 512, 108, 114, 7695, 7701, 101, 102, 116, 59, 32768, 8634, 105, 103, 104, 116, 59, 32768, 8635, 1280, 82, 83, 97, 99, 100, 7719, 7722, 7725, 7730, 7736, 59, 32768, 174, 59, 32768, 9416, 115, 116, 59, 32768, 8859, 105, 114, 99, 59, 32768, 8858, 97, 115, 104, 59, 32768, 8861, 59, 32768, 8791, 110, 105, 110, 116, 59, 32768, 10768, 105, 100, 59, 32768, 10991, 99, 105, 114, 59, 32768, 10690, 117, 98, 115, 512, 59, 117, 7771, 7773, 32768, 9827, 105, 116, 59, 32768, 9827, 1341, 7785, 7804, 7850, 0, 7871, 111, 110, 512, 59, 101, 7791, 7793, 32768, 58, 512, 59, 113, 7798, 7800, 32768, 8788, 59, 32768, 8788, 1086, 7809, 0, 0, 7820, 97, 512, 59, 116, 7814, 7816, 32768, 44, 59, 32768, 64, 768, 59, 102, 108, 7826, 7828, 7832, 32768, 8705, 110, 59, 32768, 8728, 101, 512, 109, 120, 7838, 7844, 101, 110, 116, 59, 32768, 8705, 101, 115, 59, 32768, 8450, 824, 7854, 0, 7866, 512, 59, 100, 7858, 7860, 32768, 8773, 111, 116, 59, 32768, 10861, 110, 116, 59, 32768, 8750, 768, 102, 114, 121, 7877, 7881, 7886, 59, 32896, 55349, 56660, 111, 100, 59, 32768, 8720, 33280, 169, 59, 115, 7892, 7894, 32768, 169, 114, 59, 32768, 8471, 512, 97, 111, 7903, 7908, 114, 114, 59, 32768, 8629, 115, 115, 59, 32768, 10007, 512, 99, 117, 7918, 7923, 114, 59, 32896, 55349, 56504, 512, 98, 112, 7928, 7938, 512, 59, 101, 7933, 7935, 32768, 10959, 59, 32768, 10961, 512, 59, 101, 7943, 7945, 32768, 10960, 59, 32768, 10962, 100, 111, 116, 59, 32768, 8943, 1792, 100, 101, 108, 112, 114, 118, 119, 7969, 7983, 7996, 8009, 8057, 8147, 8152, 97, 114, 114, 512, 108, 114, 7977, 7980, 59, 32768, 10552, 59, 32768, 10549, 1089, 7989, 0, 0, 7993, 114, 59, 32768, 8926, 99, 59, 32768, 8927, 97, 114, 114, 512, 59, 112, 8004, 8006, 32768, 8630, 59, 32768, 10557, 1536, 59, 98, 99, 100, 111, 115, 8022, 8024, 8031, 8044, 8049, 8053, 32768, 8746, 114, 99, 97, 112, 59, 32768, 10824, 512, 97, 117, 8036, 8040, 112, 59, 32768, 10822, 112, 59, 32768, 10826, 111, 116, 59, 32768, 8845, 114, 59, 32768, 10821, 59, 32896, 8746, 65024, 1024, 97, 108, 114, 118, 8066, 8078, 8116, 8123, 114, 114, 512, 59, 109, 8073, 8075, 32768, 8631, 59, 32768, 10556, 121, 768, 101, 118, 119, 8086, 8104, 8109, 113, 1089, 8093, 0, 0, 8099, 114, 101, 99, 59, 32768, 8926, 117, 99, 99, 59, 32768, 8927, 101, 101, 59, 32768, 8910, 101, 100, 103, 101, 59, 32768, 8911, 101, 110, 33024, 164, 59, 32768, 164, 101, 97, 114, 114, 111, 119, 512, 108, 114, 8134, 8140, 101, 102, 116, 59, 32768, 8630, 105, 103, 104, 116, 59, 32768, 8631, 101, 101, 59, 32768, 8910, 101, 100, 59, 32768, 8911, 512, 99, 105, 8162, 8170, 111, 110, 105, 110, 116, 59, 32768, 8754, 110, 116, 59, 32768, 8753, 108, 99, 116, 121, 59, 32768, 9005, 4864, 65, 72, 97, 98, 99, 100, 101, 102, 104, 105, 106, 108, 111, 114, 115, 116, 117, 119, 122, 8221, 8226, 8231, 8267, 8282, 8296, 8327, 8351, 8366, 8379, 8466, 8471, 8487, 8621, 8647, 8676, 8697, 8712, 8720, 114, 114, 59, 32768, 8659, 97, 114, 59, 32768, 10597, 1024, 103, 108, 114, 115, 8240, 8246, 8252, 8256, 103, 101, 114, 59, 32768, 8224, 101, 116, 104, 59, 32768, 8504, 114, 59, 32768, 8595, 104, 512, 59, 118, 8262, 8264, 32768, 8208, 59, 32768, 8867, 572, 8271, 8278, 97, 114, 111, 119, 59, 32768, 10511, 97, 99, 59, 32768, 733, 512, 97, 121, 8287, 8293, 114, 111, 110, 59, 32768, 271, 59, 32768, 1076, 768, 59, 97, 111, 8303, 8305, 8320, 32768, 8518, 512, 103, 114, 8310, 8316, 103, 101, 114, 59, 32768, 8225, 114, 59, 32768, 8650, 116, 115, 101, 113, 59, 32768, 10871, 768, 103, 108, 109, 8334, 8339, 8344, 33024, 176, 59, 32768, 176, 116, 97, 59, 32768, 948, 112, 116, 121, 118, 59, 32768, 10673, 512, 105, 114, 8356, 8362, 115, 104, 116, 59, 32768, 10623, 59, 32896, 55349, 56609, 97, 114, 512, 108, 114, 8373, 8376, 59, 32768, 8643, 59, 32768, 8642, 1280, 97, 101, 103, 115, 118, 8390, 8418, 8421, 8428, 8433, 109, 768, 59, 111, 115, 8398, 8400, 8415, 32768, 8900, 110, 100, 512, 59, 115, 8407, 8409, 32768, 8900, 117, 105, 116, 59, 32768, 9830, 59, 32768, 9830, 59, 32768, 168, 97, 109, 109, 97, 59, 32768, 989, 105, 110, 59, 32768, 8946, 768, 59, 105, 111, 8440, 8442, 8461, 32768, 247, 100, 101, 33280, 247, 59, 111, 8450, 8452, 32768, 247, 110, 116, 105, 109, 101, 115, 59, 32768, 8903, 110, 120, 59, 32768, 8903, 99, 121, 59, 32768, 1106, 99, 1088, 8478, 0, 0, 8483, 114, 110, 59, 32768, 8990, 111, 112, 59, 32768, 8973, 1280, 108, 112, 116, 117, 119, 8498, 8504, 8509, 8556, 8570, 108, 97, 114, 59, 32768, 36, 102, 59, 32896, 55349, 56661, 1280, 59, 101, 109, 112, 115, 8520, 8522, 8535, 8542, 8548, 32768, 729, 113, 512, 59, 100, 8528, 8530, 32768, 8784, 111, 116, 59, 32768, 8785, 105, 110, 117, 115, 59, 32768, 8760, 108, 117, 115, 59, 32768, 8724, 113, 117, 97, 114, 101, 59, 32768, 8865, 98, 108, 101, 98, 97, 114, 119, 101, 100, 103, 101, 59, 32768, 8966, 110, 768, 97, 100, 104, 8578, 8585, 8597, 114, 114, 111, 119, 59, 32768, 8595, 111, 119, 110, 97, 114, 114, 111, 119, 115, 59, 32768, 8650, 97, 114, 112, 111, 111, 110, 512, 108, 114, 8608, 8614, 101, 102, 116, 59, 32768, 8643, 105, 103, 104, 116, 59, 32768, 8642, 563, 8625, 8633, 107, 97, 114, 111, 119, 59, 32768, 10512, 1088, 8638, 0, 0, 8643, 114, 110, 59, 32768, 8991, 111, 112, 59, 32768, 8972, 768, 99, 111, 116, 8654, 8666, 8670, 512, 114, 121, 8659, 8663, 59, 32896, 55349, 56505, 59, 32768, 1109, 108, 59, 32768, 10742, 114, 111, 107, 59, 32768, 273, 512, 100, 114, 8681, 8686, 111, 116, 59, 32768, 8945, 105, 512, 59, 102, 8692, 8694, 32768, 9663, 59, 32768, 9662, 512, 97, 104, 8702, 8707, 114, 114, 59, 32768, 8693, 97, 114, 59, 32768, 10607, 97, 110, 103, 108, 101, 59, 32768, 10662, 512, 99, 105, 8725, 8729, 121, 59, 32768, 1119, 103, 114, 97, 114, 114, 59, 32768, 10239, 4608, 68, 97, 99, 100, 101, 102, 103, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 120, 8774, 8788, 8807, 8844, 8849, 8852, 8866, 8895, 8929, 8977, 8989, 9004, 9046, 9136, 9151, 9171, 9184, 9199, 512, 68, 111, 8779, 8784, 111, 116, 59, 32768, 10871, 116, 59, 32768, 8785, 512, 99, 115, 8793, 8801, 117, 116, 101, 33024, 233, 59, 32768, 233, 116, 101, 114, 59, 32768, 10862, 1024, 97, 105, 111, 121, 8816, 8822, 8835, 8841, 114, 111, 110, 59, 32768, 283, 114, 512, 59, 99, 8828, 8830, 32768, 8790, 33024, 234, 59, 32768, 234, 108, 111, 110, 59, 32768, 8789, 59, 32768, 1101, 111, 116, 59, 32768, 279, 59, 32768, 8519, 512, 68, 114, 8857, 8862, 111, 116, 59, 32768, 8786, 59, 32896, 55349, 56610, 768, 59, 114, 115, 8873, 8875, 8883, 32768, 10906, 97, 118, 101, 33024, 232, 59, 32768, 232, 512, 59, 100, 8888, 8890, 32768, 10902, 111, 116, 59, 32768, 10904, 1024, 59, 105, 108, 115, 8904, 8906, 8914, 8917, 32768, 10905, 110, 116, 101, 114, 115, 59, 32768, 9191, 59, 32768, 8467, 512, 59, 100, 8922, 8924, 32768, 10901, 111, 116, 59, 32768, 10903, 768, 97, 112, 115, 8936, 8941, 8960, 99, 114, 59, 32768, 275, 116, 121, 768, 59, 115, 118, 8950, 8952, 8957, 32768, 8709, 101, 116, 59, 32768, 8709, 59, 32768, 8709, 112, 512, 49, 59, 8966, 8975, 516, 8970, 8973, 59, 32768, 8196, 59, 32768, 8197, 32768, 8195, 512, 103, 115, 8982, 8985, 59, 32768, 331, 112, 59, 32768, 8194, 512, 103, 112, 8994, 8999, 111, 110, 59, 32768, 281, 102, 59, 32896, 55349, 56662, 768, 97, 108, 115, 9011, 9023, 9028, 114, 512, 59, 115, 9017, 9019, 32768, 8917, 108, 59, 32768, 10723, 117, 115, 59, 32768, 10865, 105, 768, 59, 108, 118, 9036, 9038, 9043, 32768, 949, 111, 110, 59, 32768, 949, 59, 32768, 1013, 1024, 99, 115, 117, 118, 9055, 9071, 9099, 9128, 512, 105, 111, 9060, 9065, 114, 99, 59, 32768, 8790, 108, 111, 110, 59, 32768, 8789, 1082, 9077, 0, 0, 9081, 109, 59, 32768, 8770, 97, 110, 116, 512, 103, 108, 9088, 9093, 116, 114, 59, 32768, 10902, 101, 115, 115, 59, 32768, 10901, 768, 97, 101, 105, 9106, 9111, 9116, 108, 115, 59, 32768, 61, 115, 116, 59, 32768, 8799, 118, 512, 59, 68, 9122, 9124, 32768, 8801, 68, 59, 32768, 10872, 112, 97, 114, 115, 108, 59, 32768, 10725, 512, 68, 97, 9141, 9146, 111, 116, 59, 32768, 8787, 114, 114, 59, 32768, 10609, 768, 99, 100, 105, 9158, 9162, 9167, 114, 59, 32768, 8495, 111, 116, 59, 32768, 8784, 109, 59, 32768, 8770, 512, 97, 104, 9176, 9179, 59, 32768, 951, 33024, 240, 59, 32768, 240, 512, 109, 114, 9189, 9195, 108, 33024, 235, 59, 32768, 235, 111, 59, 32768, 8364, 768, 99, 105, 112, 9206, 9210, 9215, 108, 59, 32768, 33, 115, 116, 59, 32768, 8707, 512, 101, 111, 9220, 9230, 99, 116, 97, 116, 105, 111, 110, 59, 32768, 8496, 110, 101, 110, 116, 105, 97, 108, 101, 59, 32768, 8519, 4914, 9262, 0, 9276, 0, 9280, 9287, 0, 0, 9318, 9324, 0, 9331, 0, 9352, 9357, 9386, 0, 9395, 9497, 108, 108, 105, 110, 103, 100, 111, 116, 115, 101, 113, 59, 32768, 8786, 121, 59, 32768, 1092, 109, 97, 108, 101, 59, 32768, 9792, 768, 105, 108, 114, 9293, 9299, 9313, 108, 105, 103, 59, 32768, 64259, 1082, 9305, 0, 0, 9309, 103, 59, 32768, 64256, 105, 103, 59, 32768, 64260, 59, 32896, 55349, 56611, 108, 105, 103, 59, 32768, 64257, 108, 105, 103, 59, 32896, 102, 106, 768, 97, 108, 116, 9337, 9341, 9346, 116, 59, 32768, 9837, 105, 103, 59, 32768, 64258, 110, 115, 59, 32768, 9649, 111, 102, 59, 32768, 402, 833, 9361, 0, 9366, 102, 59, 32896, 55349, 56663, 512, 97, 107, 9370, 9375, 108, 108, 59, 32768, 8704, 512, 59, 118, 9380, 9382, 32768, 8916, 59, 32768, 10969, 97, 114, 116, 105, 110, 116, 59, 32768, 10765, 512, 97, 111, 9399, 9491, 512, 99, 115, 9404, 9487, 1794, 9413, 9443, 9453, 9470, 9474, 0, 9484, 1795, 9421, 9426, 9429, 9434, 9437, 0, 9440, 33024, 189, 59, 32768, 189, 59, 32768, 8531, 33024, 188, 59, 32768, 188, 59, 32768, 8533, 59, 32768, 8537, 59, 32768, 8539, 772, 9447, 0, 9450, 59, 32768, 8532, 59, 32768, 8534, 1285, 9459, 9464, 0, 0, 9467, 33024, 190, 59, 32768, 190, 59, 32768, 8535, 59, 32768, 8540, 53, 59, 32768, 8536, 775, 9478, 0, 9481, 59, 32768, 8538, 59, 32768, 8541, 56, 59, 32768, 8542, 108, 59, 32768, 8260, 119, 110, 59, 32768, 8994, 99, 114, 59, 32896, 55349, 56507, 4352, 69, 97, 98, 99, 100, 101, 102, 103, 105, 106, 108, 110, 111, 114, 115, 116, 118, 9537, 9547, 9575, 9582, 9595, 9600, 9679, 9684, 9694, 9700, 9705, 9725, 9773, 9779, 9785, 9810, 9917, 512, 59, 108, 9542, 9544, 32768, 8807, 59, 32768, 10892, 768, 99, 109, 112, 9554, 9560, 9572, 117, 116, 101, 59, 32768, 501, 109, 97, 512, 59, 100, 9567, 9569, 32768, 947, 59, 32768, 989, 59, 32768, 10886, 114, 101, 118, 101, 59, 32768, 287, 512, 105, 121, 9587, 9592, 114, 99, 59, 32768, 285, 59, 32768, 1075, 111, 116, 59, 32768, 289, 1024, 59, 108, 113, 115, 9609, 9611, 9614, 9633, 32768, 8805, 59, 32768, 8923, 768, 59, 113, 115, 9621, 9623, 9626, 32768, 8805, 59, 32768, 8807, 108, 97, 110, 116, 59, 32768, 10878, 1024, 59, 99, 100, 108, 9642, 9644, 9648, 9667, 32768, 10878, 99, 59, 32768, 10921, 111, 116, 512, 59, 111, 9655, 9657, 32768, 10880, 512, 59, 108, 9662, 9664, 32768, 10882, 59, 32768, 10884, 512, 59, 101, 9672, 9675, 32896, 8923, 65024, 115, 59, 32768, 10900, 114, 59, 32896, 55349, 56612, 512, 59, 103, 9689, 9691, 32768, 8811, 59, 32768, 8921, 109, 101, 108, 59, 32768, 8503, 99, 121, 59, 32768, 1107, 1024, 59, 69, 97, 106, 9714, 9716, 9719, 9722, 32768, 8823, 59, 32768, 10898, 59, 32768, 10917, 59, 32768, 10916, 1024, 69, 97, 101, 115, 9734, 9737, 9751, 9768, 59, 32768, 8809, 112, 512, 59, 112, 9743, 9745, 32768, 10890, 114, 111, 120, 59, 32768, 10890, 512, 59, 113, 9756, 9758, 32768, 10888, 512, 59, 113, 9763, 9765, 32768, 10888, 59, 32768, 8809, 105, 109, 59, 32768, 8935, 112, 102, 59, 32896, 55349, 56664, 97, 118, 101, 59, 32768, 96, 512, 99, 105, 9790, 9794, 114, 59, 32768, 8458, 109, 768, 59, 101, 108, 9802, 9804, 9807, 32768, 8819, 59, 32768, 10894, 59, 32768, 10896, 34304, 62, 59, 99, 100, 108, 113, 114, 9824, 9826, 9838, 9843, 9849, 9856, 32768, 62, 512, 99, 105, 9831, 9834, 59, 32768, 10919, 114, 59, 32768, 10874, 111, 116, 59, 32768, 8919, 80, 97, 114, 59, 32768, 10645, 117, 101, 115, 116, 59, 32768, 10876, 1280, 97, 100, 101, 108, 115, 9867, 9882, 9887, 9906, 9912, 833, 9872, 0, 9879, 112, 114, 111, 120, 59, 32768, 10886, 114, 59, 32768, 10616, 111, 116, 59, 32768, 8919, 113, 512, 108, 113, 9893, 9899, 101, 115, 115, 59, 32768, 8923, 108, 101, 115, 115, 59, 32768, 10892, 101, 115, 115, 59, 32768, 8823, 105, 109, 59, 32768, 8819, 512, 101, 110, 9922, 9932, 114, 116, 110, 101, 113, 113, 59, 32896, 8809, 65024, 69, 59, 32896, 8809, 65024, 2560, 65, 97, 98, 99, 101, 102, 107, 111, 115, 121, 9958, 9963, 10015, 10020, 10026, 10060, 10065, 10085, 10147, 10171, 114, 114, 59, 32768, 8660, 1024, 105, 108, 109, 114, 9972, 9978, 9982, 9988, 114, 115, 112, 59, 32768, 8202, 102, 59, 32768, 189, 105, 108, 116, 59, 32768, 8459, 512, 100, 114, 9993, 9998, 99, 121, 59, 32768, 1098, 768, 59, 99, 119, 10005, 10007, 10012, 32768, 8596, 105, 114, 59, 32768, 10568, 59, 32768, 8621, 97, 114, 59, 32768, 8463, 105, 114, 99, 59, 32768, 293, 768, 97, 108, 114, 10033, 10048, 10054, 114, 116, 115, 512, 59, 117, 10041, 10043, 32768, 9829, 105, 116, 59, 32768, 9829, 108, 105, 112, 59, 32768, 8230, 99, 111, 110, 59, 32768, 8889, 114, 59, 32896, 55349, 56613, 115, 512, 101, 119, 10071, 10078, 97, 114, 111, 119, 59, 32768, 10533, 97, 114, 111, 119, 59, 32768, 10534, 1280, 97, 109, 111, 112, 114, 10096, 10101, 10107, 10136, 10141, 114, 114, 59, 32768, 8703, 116, 104, 116, 59, 32768, 8763, 107, 512, 108, 114, 10113, 10124, 101, 102, 116, 97, 114, 114, 111, 119, 59, 32768, 8617, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8618, 102, 59, 32896, 55349, 56665, 98, 97, 114, 59, 32768, 8213, 768, 99, 108, 116, 10154, 10159, 10165, 114, 59, 32896, 55349, 56509, 97, 115, 104, 59, 32768, 8463, 114, 111, 107, 59, 32768, 295, 512, 98, 112, 10176, 10182, 117, 108, 108, 59, 32768, 8259, 104, 101, 110, 59, 32768, 8208, 5426, 10211, 0, 10220, 0, 10239, 10255, 10267, 0, 10276, 10312, 0, 0, 10318, 10371, 10458, 10485, 10491, 0, 10500, 10545, 10558, 99, 117, 116, 101, 33024, 237, 59, 32768, 237, 768, 59, 105, 121, 10226, 10228, 10235, 32768, 8291, 114, 99, 33024, 238, 59, 32768, 238, 59, 32768, 1080, 512, 99, 120, 10243, 10247, 121, 59, 32768, 1077, 99, 108, 33024, 161, 59, 32768, 161, 512, 102, 114, 10259, 10262, 59, 32768, 8660, 59, 32896, 55349, 56614, 114, 97, 118, 101, 33024, 236, 59, 32768, 236, 1024, 59, 105, 110, 111, 10284, 10286, 10300, 10306, 32768, 8520, 512, 105, 110, 10291, 10296, 110, 116, 59, 32768, 10764, 116, 59, 32768, 8749, 102, 105, 110, 59, 32768, 10716, 116, 97, 59, 32768, 8489, 108, 105, 103, 59, 32768, 307, 768, 97, 111, 112, 10324, 10361, 10365, 768, 99, 103, 116, 10331, 10335, 10357, 114, 59, 32768, 299, 768, 101, 108, 112, 10342, 10345, 10351, 59, 32768, 8465, 105, 110, 101, 59, 32768, 8464, 97, 114, 116, 59, 32768, 8465, 104, 59, 32768, 305, 102, 59, 32768, 8887, 101, 100, 59, 32768, 437, 1280, 59, 99, 102, 111, 116, 10381, 10383, 10389, 10403, 10409, 32768, 8712, 97, 114, 101, 59, 32768, 8453, 105, 110, 512, 59, 116, 10396, 10398, 32768, 8734, 105, 101, 59, 32768, 10717, 100, 111, 116, 59, 32768, 305, 1280, 59, 99, 101, 108, 112, 10420, 10422, 10427, 10444, 10451, 32768, 8747, 97, 108, 59, 32768, 8890, 512, 103, 114, 10432, 10438, 101, 114, 115, 59, 32768, 8484, 99, 97, 108, 59, 32768, 8890, 97, 114, 104, 107, 59, 32768, 10775, 114, 111, 100, 59, 32768, 10812, 1024, 99, 103, 112, 116, 10466, 10470, 10475, 10480, 121, 59, 32768, 1105, 111, 110, 59, 32768, 303, 102, 59, 32896, 55349, 56666, 97, 59, 32768, 953, 114, 111, 100, 59, 32768, 10812, 117, 101, 115, 116, 33024, 191, 59, 32768, 191, 512, 99, 105, 10504, 10509, 114, 59, 32896, 55349, 56510, 110, 1280, 59, 69, 100, 115, 118, 10521, 10523, 10526, 10531, 10541, 32768, 8712, 59, 32768, 8953, 111, 116, 59, 32768, 8949, 512, 59, 118, 10536, 10538, 32768, 8948, 59, 32768, 8947, 59, 32768, 8712, 512, 59, 105, 10549, 10551, 32768, 8290, 108, 100, 101, 59, 32768, 297, 828, 10562, 0, 10567, 99, 121, 59, 32768, 1110, 108, 33024, 239, 59, 32768, 239, 1536, 99, 102, 109, 111, 115, 117, 10585, 10598, 10603, 10609, 10615, 10630, 512, 105, 121, 10590, 10595, 114, 99, 59, 32768, 309, 59, 32768, 1081, 114, 59, 32896, 55349, 56615, 97, 116, 104, 59, 32768, 567, 112, 102, 59, 32896, 55349, 56667, 820, 10620, 0, 10625, 114, 59, 32896, 55349, 56511, 114, 99, 121, 59, 32768, 1112, 107, 99, 121, 59, 32768, 1108, 2048, 97, 99, 102, 103, 104, 106, 111, 115, 10653, 10666, 10680, 10685, 10692, 10697, 10702, 10708, 112, 112, 97, 512, 59, 118, 10661, 10663, 32768, 954, 59, 32768, 1008, 512, 101, 121, 10671, 10677, 100, 105, 108, 59, 32768, 311, 59, 32768, 1082, 114, 59, 32896, 55349, 56616, 114, 101, 101, 110, 59, 32768, 312, 99, 121, 59, 32768, 1093, 99, 121, 59, 32768, 1116, 112, 102, 59, 32896, 55349, 56668, 99, 114, 59, 32896, 55349, 56512, 5888, 65, 66, 69, 72, 97, 98, 99, 100, 101, 102, 103, 104, 106, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 10761, 10783, 10789, 10799, 10804, 10957, 11011, 11047, 11094, 11349, 11372, 11382, 11409, 11414, 11451, 11478, 11526, 11698, 11711, 11755, 11823, 11910, 11929, 768, 97, 114, 116, 10768, 10773, 10777, 114, 114, 59, 32768, 8666, 114, 59, 32768, 8656, 97, 105, 108, 59, 32768, 10523, 97, 114, 114, 59, 32768, 10510, 512, 59, 103, 10794, 10796, 32768, 8806, 59, 32768, 10891, 97, 114, 59, 32768, 10594, 4660, 10824, 0, 10830, 0, 10838, 0, 0, 0, 0, 0, 10844, 10850, 0, 10867, 10870, 10877, 0, 10933, 117, 116, 101, 59, 32768, 314, 109, 112, 116, 121, 118, 59, 32768, 10676, 114, 97, 110, 59, 32768, 8466, 98, 100, 97, 59, 32768, 955, 103, 768, 59, 100, 108, 10857, 10859, 10862, 32768, 10216, 59, 32768, 10641, 101, 59, 32768, 10216, 59, 32768, 10885, 117, 111, 33024, 171, 59, 32768, 171, 114, 2048, 59, 98, 102, 104, 108, 112, 115, 116, 10894, 10896, 10907, 10911, 10915, 10919, 10923, 10928, 32768, 8592, 512, 59, 102, 10901, 10903, 32768, 8676, 115, 59, 32768, 10527, 115, 59, 32768, 10525, 107, 59, 32768, 8617, 112, 59, 32768, 8619, 108, 59, 32768, 10553, 105, 109, 59, 32768, 10611, 108, 59, 32768, 8610, 768, 59, 97, 101, 10939, 10941, 10946, 32768, 10923, 105, 108, 59, 32768, 10521, 512, 59, 115, 10951, 10953, 32768, 10925, 59, 32896, 10925, 65024, 768, 97, 98, 114, 10964, 10969, 10974, 114, 114, 59, 32768, 10508, 114, 107, 59, 32768, 10098, 512, 97, 107, 10979, 10991, 99, 512, 101, 107, 10985, 10988, 59, 32768, 123, 59, 32768, 91, 512, 101, 115, 10996, 10999, 59, 32768, 10635, 108, 512, 100, 117, 11005, 11008, 59, 32768, 10639, 59, 32768, 10637, 1024, 97, 101, 117, 121, 11020, 11026, 11040, 11044, 114, 111, 110, 59, 32768, 318, 512, 100, 105, 11031, 11036, 105, 108, 59, 32768, 316, 108, 59, 32768, 8968, 98, 59, 32768, 123, 59, 32768, 1083, 1024, 99, 113, 114, 115, 11056, 11060, 11072, 11090, 97, 59, 32768, 10550, 117, 111, 512, 59, 114, 11067, 11069, 32768, 8220, 59, 32768, 8222, 512, 100, 117, 11077, 11083, 104, 97, 114, 59, 32768, 10599, 115, 104, 97, 114, 59, 32768, 10571, 104, 59, 32768, 8626, 1280, 59, 102, 103, 113, 115, 11105, 11107, 11228, 11231, 11250, 32768, 8804, 116, 1280, 97, 104, 108, 114, 116, 11119, 11136, 11157, 11169, 11216, 114, 114, 111, 119, 512, 59, 116, 11128, 11130, 32768, 8592, 97, 105, 108, 59, 32768, 8610, 97, 114, 112, 111, 111, 110, 512, 100, 117, 11147, 11153, 111, 119, 110, 59, 32768, 8637, 112, 59, 32768, 8636, 101, 102, 116, 97, 114, 114, 111, 119, 115, 59, 32768, 8647, 105, 103, 104, 116, 768, 97, 104, 115, 11180, 11194, 11204, 114, 114, 111, 119, 512, 59, 115, 11189, 11191, 32768, 8596, 59, 32768, 8646, 97, 114, 112, 111, 111, 110, 115, 59, 32768, 8651, 113, 117, 105, 103, 97, 114, 114, 111, 119, 59, 32768, 8621, 104, 114, 101, 101, 116, 105, 109, 101, 115, 59, 32768, 8907, 59, 32768, 8922, 768, 59, 113, 115, 11238, 11240, 11243, 32768, 8804, 59, 32768, 8806, 108, 97, 110, 116, 59, 32768, 10877, 1280, 59, 99, 100, 103, 115, 11261, 11263, 11267, 11286, 11298, 32768, 10877, 99, 59, 32768, 10920, 111, 116, 512, 59, 111, 11274, 11276, 32768, 10879, 512, 59, 114, 11281, 11283, 32768, 10881, 59, 32768, 10883, 512, 59, 101, 11291, 11294, 32896, 8922, 65024, 115, 59, 32768, 10899, 1280, 97, 100, 101, 103, 115, 11309, 11317, 11322, 11339, 11344, 112, 112, 114, 111, 120, 59, 32768, 10885, 111, 116, 59, 32768, 8918, 113, 512, 103, 113, 11328, 11333, 116, 114, 59, 32768, 8922, 103, 116, 114, 59, 32768, 10891, 116, 114, 59, 32768, 8822, 105, 109, 59, 32768, 8818, 768, 105, 108, 114, 11356, 11362, 11368, 115, 104, 116, 59, 32768, 10620, 111, 111, 114, 59, 32768, 8970, 59, 32896, 55349, 56617, 512, 59, 69, 11377, 11379, 32768, 8822, 59, 32768, 10897, 562, 11386, 11405, 114, 512, 100, 117, 11391, 11394, 59, 32768, 8637, 512, 59, 108, 11399, 11401, 32768, 8636, 59, 32768, 10602, 108, 107, 59, 32768, 9604, 99, 121, 59, 32768, 1113, 1280, 59, 97, 99, 104, 116, 11425, 11427, 11432, 11440, 11446, 32768, 8810, 114, 114, 59, 32768, 8647, 111, 114, 110, 101, 114, 59, 32768, 8990, 97, 114, 100, 59, 32768, 10603, 114, 105, 59, 32768, 9722, 512, 105, 111, 11456, 11462, 100, 111, 116, 59, 32768, 320, 117, 115, 116, 512, 59, 97, 11470, 11472, 32768, 9136, 99, 104, 101, 59, 32768, 9136, 1024, 69, 97, 101, 115, 11487, 11490, 11504, 11521, 59, 32768, 8808, 112, 512, 59, 112, 11496, 11498, 32768, 10889, 114, 111, 120, 59, 32768, 10889, 512, 59, 113, 11509, 11511, 32768, 10887, 512, 59, 113, 11516, 11518, 32768, 10887, 59, 32768, 8808, 105, 109, 59, 32768, 8934, 2048, 97, 98, 110, 111, 112, 116, 119, 122, 11543, 11556, 11561, 11616, 11640, 11660, 11667, 11680, 512, 110, 114, 11548, 11552, 103, 59, 32768, 10220, 114, 59, 32768, 8701, 114, 107, 59, 32768, 10214, 103, 768, 108, 109, 114, 11569, 11596, 11604, 101, 102, 116, 512, 97, 114, 11577, 11584, 114, 114, 111, 119, 59, 32768, 10229, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10231, 97, 112, 115, 116, 111, 59, 32768, 10236, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 10230, 112, 97, 114, 114, 111, 119, 512, 108, 114, 11627, 11633, 101, 102, 116, 59, 32768, 8619, 105, 103, 104, 116, 59, 32768, 8620, 768, 97, 102, 108, 11647, 11651, 11655, 114, 59, 32768, 10629, 59, 32896, 55349, 56669, 117, 115, 59, 32768, 10797, 105, 109, 101, 115, 59, 32768, 10804, 562, 11671, 11676, 115, 116, 59, 32768, 8727, 97, 114, 59, 32768, 95, 768, 59, 101, 102, 11687, 11689, 11695, 32768, 9674, 110, 103, 101, 59, 32768, 9674, 59, 32768, 10731, 97, 114, 512, 59, 108, 11705, 11707, 32768, 40, 116, 59, 32768, 10643, 1280, 97, 99, 104, 109, 116, 11722, 11727, 11735, 11747, 11750, 114, 114, 59, 32768, 8646, 111, 114, 110, 101, 114, 59, 32768, 8991, 97, 114, 512, 59, 100, 11742, 11744, 32768, 8651, 59, 32768, 10605, 59, 32768, 8206, 114, 105, 59, 32768, 8895, 1536, 97, 99, 104, 105, 113, 116, 11768, 11774, 11779, 11782, 11798, 11817, 113, 117, 111, 59, 32768, 8249, 114, 59, 32896, 55349, 56513, 59, 32768, 8624, 109, 768, 59, 101, 103, 11790, 11792, 11795, 32768, 8818, 59, 32768, 10893, 59, 32768, 10895, 512, 98, 117, 11803, 11806, 59, 32768, 91, 111, 512, 59, 114, 11812, 11814, 32768, 8216, 59, 32768, 8218, 114, 111, 107, 59, 32768, 322, 34816, 60, 59, 99, 100, 104, 105, 108, 113, 114, 11841, 11843, 11855, 11860, 11866, 11872, 11878, 11885, 32768, 60, 512, 99, 105, 11848, 11851, 59, 32768, 10918, 114, 59, 32768, 10873, 111, 116, 59, 32768, 8918, 114, 101, 101, 59, 32768, 8907, 109, 101, 115, 59, 32768, 8905, 97, 114, 114, 59, 32768, 10614, 117, 101, 115, 116, 59, 32768, 10875, 512, 80, 105, 11890, 11895, 97, 114, 59, 32768, 10646, 768, 59, 101, 102, 11902, 11904, 11907, 32768, 9667, 59, 32768, 8884, 59, 32768, 9666, 114, 512, 100, 117, 11916, 11923, 115, 104, 97, 114, 59, 32768, 10570, 104, 97, 114, 59, 32768, 10598, 512, 101, 110, 11934, 11944, 114, 116, 110, 101, 113, 113, 59, 32896, 8808, 65024, 69, 59, 32896, 8808, 65024, 3584, 68, 97, 99, 100, 101, 102, 104, 105, 108, 110, 111, 112, 115, 117, 11978, 11984, 12061, 12075, 12081, 12095, 12100, 12104, 12170, 12181, 12188, 12204, 12207, 12223, 68, 111, 116, 59, 32768, 8762, 1024, 99, 108, 112, 114, 11993, 11999, 12019, 12055, 114, 33024, 175, 59, 32768, 175, 512, 101, 116, 12004, 12007, 59, 32768, 9794, 512, 59, 101, 12012, 12014, 32768, 10016, 115, 101, 59, 32768, 10016, 512, 59, 115, 12024, 12026, 32768, 8614, 116, 111, 1024, 59, 100, 108, 117, 12037, 12039, 12045, 12051, 32768, 8614, 111, 119, 110, 59, 32768, 8615, 101, 102, 116, 59, 32768, 8612, 112, 59, 32768, 8613, 107, 101, 114, 59, 32768, 9646, 512, 111, 121, 12066, 12072, 109, 109, 97, 59, 32768, 10793, 59, 32768, 1084, 97, 115, 104, 59, 32768, 8212, 97, 115, 117, 114, 101, 100, 97, 110, 103, 108, 101, 59, 32768, 8737, 114, 59, 32896, 55349, 56618, 111, 59, 32768, 8487, 768, 99, 100, 110, 12111, 12118, 12146, 114, 111, 33024, 181, 59, 32768, 181, 1024, 59, 97, 99, 100, 12127, 12129, 12134, 12139, 32768, 8739, 115, 116, 59, 32768, 42, 105, 114, 59, 32768, 10992, 111, 116, 33024, 183, 59, 32768, 183, 117, 115, 768, 59, 98, 100, 12155, 12157, 12160, 32768, 8722, 59, 32768, 8863, 512, 59, 117, 12165, 12167, 32768, 8760, 59, 32768, 10794, 564, 12174, 12178, 112, 59, 32768, 10971, 114, 59, 32768, 8230, 112, 108, 117, 115, 59, 32768, 8723, 512, 100, 112, 12193, 12199, 101, 108, 115, 59, 32768, 8871, 102, 59, 32896, 55349, 56670, 59, 32768, 8723, 512, 99, 116, 12212, 12217, 114, 59, 32896, 55349, 56514, 112, 111, 115, 59, 32768, 8766, 768, 59, 108, 109, 12230, 12232, 12240, 32768, 956, 116, 105, 109, 97, 112, 59, 32768, 8888, 97, 112, 59, 32768, 8888, 6144, 71, 76, 82, 86, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 111, 112, 114, 115, 116, 117, 118, 119, 12294, 12315, 12364, 12376, 12393, 12472, 12496, 12547, 12553, 12636, 12641, 12703, 12725, 12747, 12752, 12876, 12881, 12957, 13033, 13089, 13294, 13359, 13384, 13499, 512, 103, 116, 12299, 12303, 59, 32896, 8921, 824, 512, 59, 118, 12308, 12311, 32896, 8811, 8402, 59, 32896, 8811, 824, 768, 101, 108, 116, 12322, 12348, 12352, 102, 116, 512, 97, 114, 12329, 12336, 114, 114, 111, 119, 59, 32768, 8653, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8654, 59, 32896, 8920, 824, 512, 59, 118, 12357, 12360, 32896, 8810, 8402, 59, 32896, 8810, 824, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8655, 512, 68, 100, 12381, 12387, 97, 115, 104, 59, 32768, 8879, 97, 115, 104, 59, 32768, 8878, 1280, 98, 99, 110, 112, 116, 12404, 12409, 12415, 12420, 12452, 108, 97, 59, 32768, 8711, 117, 116, 101, 59, 32768, 324, 103, 59, 32896, 8736, 8402, 1280, 59, 69, 105, 111, 112, 12431, 12433, 12437, 12442, 12446, 32768, 8777, 59, 32896, 10864, 824, 100, 59, 32896, 8779, 824, 115, 59, 32768, 329, 114, 111, 120, 59, 32768, 8777, 117, 114, 512, 59, 97, 12459, 12461, 32768, 9838, 108, 512, 59, 115, 12467, 12469, 32768, 9838, 59, 32768, 8469, 836, 12477, 0, 12483, 112, 33024, 160, 59, 32768, 160, 109, 112, 512, 59, 101, 12489, 12492, 32896, 8782, 824, 59, 32896, 8783, 824, 1280, 97, 101, 111, 117, 121, 12507, 12519, 12525, 12540, 12544, 833, 12512, 0, 12515, 59, 32768, 10819, 111, 110, 59, 32768, 328, 100, 105, 108, 59, 32768, 326, 110, 103, 512, 59, 100, 12532, 12534, 32768, 8775, 111, 116, 59, 32896, 10861, 824, 112, 59, 32768, 10818, 59, 32768, 1085, 97, 115, 104, 59, 32768, 8211, 1792, 59, 65, 97, 100, 113, 115, 120, 12568, 12570, 12575, 12596, 12602, 12608, 12623, 32768, 8800, 114, 114, 59, 32768, 8663, 114, 512, 104, 114, 12581, 12585, 107, 59, 32768, 10532, 512, 59, 111, 12590, 12592, 32768, 8599, 119, 59, 32768, 8599, 111, 116, 59, 32896, 8784, 824, 117, 105, 118, 59, 32768, 8802, 512, 101, 105, 12613, 12618, 97, 114, 59, 32768, 10536, 109, 59, 32896, 8770, 824, 105, 115, 116, 512, 59, 115, 12631, 12633, 32768, 8708, 59, 32768, 8708, 114, 59, 32896, 55349, 56619, 1024, 69, 101, 115, 116, 12650, 12654, 12688, 12693, 59, 32896, 8807, 824, 768, 59, 113, 115, 12661, 12663, 12684, 32768, 8817, 768, 59, 113, 115, 12670, 12672, 12676, 32768, 8817, 59, 32896, 8807, 824, 108, 97, 110, 116, 59, 32896, 10878, 824, 59, 32896, 10878, 824, 105, 109, 59, 32768, 8821, 512, 59, 114, 12698, 12700, 32768, 8815, 59, 32768, 8815, 768, 65, 97, 112, 12710, 12715, 12720, 114, 114, 59, 32768, 8654, 114, 114, 59, 32768, 8622, 97, 114, 59, 32768, 10994, 768, 59, 115, 118, 12732, 12734, 12744, 32768, 8715, 512, 59, 100, 12739, 12741, 32768, 8956, 59, 32768, 8954, 59, 32768, 8715, 99, 121, 59, 32768, 1114, 1792, 65, 69, 97, 100, 101, 115, 116, 12767, 12772, 12776, 12781, 12785, 12853, 12858, 114, 114, 59, 32768, 8653, 59, 32896, 8806, 824, 114, 114, 59, 32768, 8602, 114, 59, 32768, 8229, 1024, 59, 102, 113, 115, 12794, 12796, 12821, 12842, 32768, 8816, 116, 512, 97, 114, 12802, 12809, 114, 114, 111, 119, 59, 32768, 8602, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8622, 768, 59, 113, 115, 12828, 12830, 12834, 32768, 8816, 59, 32896, 8806, 824, 108, 97, 110, 116, 59, 32896, 10877, 824, 512, 59, 115, 12847, 12850, 32896, 10877, 824, 59, 32768, 8814, 105, 109, 59, 32768, 8820, 512, 59, 114, 12863, 12865, 32768, 8814, 105, 512, 59, 101, 12871, 12873, 32768, 8938, 59, 32768, 8940, 105, 100, 59, 32768, 8740, 512, 112, 116, 12886, 12891, 102, 59, 32896, 55349, 56671, 33536, 172, 59, 105, 110, 12899, 12901, 12936, 32768, 172, 110, 1024, 59, 69, 100, 118, 12911, 12913, 12917, 12923, 32768, 8713, 59, 32896, 8953, 824, 111, 116, 59, 32896, 8949, 824, 818, 12928, 12931, 12934, 59, 32768, 8713, 59, 32768, 8951, 59, 32768, 8950, 105, 512, 59, 118, 12942, 12944, 32768, 8716, 818, 12949, 12952, 12955, 59, 32768, 8716, 59, 32768, 8958, 59, 32768, 8957, 768, 97, 111, 114, 12964, 12992, 12999, 114, 1024, 59, 97, 115, 116, 12974, 12976, 12983, 12988, 32768, 8742, 108, 108, 101, 108, 59, 32768, 8742, 108, 59, 32896, 11005, 8421, 59, 32896, 8706, 824, 108, 105, 110, 116, 59, 32768, 10772, 768, 59, 99, 101, 13006, 13008, 13013, 32768, 8832, 117, 101, 59, 32768, 8928, 512, 59, 99, 13018, 13021, 32896, 10927, 824, 512, 59, 101, 13026, 13028, 32768, 8832, 113, 59, 32896, 10927, 824, 1024, 65, 97, 105, 116, 13042, 13047, 13066, 13077, 114, 114, 59, 32768, 8655, 114, 114, 768, 59, 99, 119, 13056, 13058, 13062, 32768, 8603, 59, 32896, 10547, 824, 59, 32896, 8605, 824, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8603, 114, 105, 512, 59, 101, 13084, 13086, 32768, 8939, 59, 32768, 8941, 1792, 99, 104, 105, 109, 112, 113, 117, 13104, 13128, 13151, 13169, 13174, 13179, 13194, 1024, 59, 99, 101, 114, 13113, 13115, 13120, 13124, 32768, 8833, 117, 101, 59, 32768, 8929, 59, 32896, 10928, 824, 59, 32896, 55349, 56515, 111, 114, 116, 1086, 13137, 0, 0, 13142, 105, 100, 59, 32768, 8740, 97, 114, 97, 108, 108, 101, 108, 59, 32768, 8742, 109, 512, 59, 101, 13157, 13159, 32768, 8769, 512, 59, 113, 13164, 13166, 32768, 8772, 59, 32768, 8772, 105, 100, 59, 32768, 8740, 97, 114, 59, 32768, 8742, 115, 117, 512, 98, 112, 13186, 13190, 101, 59, 32768, 8930, 101, 59, 32768, 8931, 768, 98, 99, 112, 13201, 13241, 13254, 1024, 59, 69, 101, 115, 13210, 13212, 13216, 13219, 32768, 8836, 59, 32896, 10949, 824, 59, 32768, 8840, 101, 116, 512, 59, 101, 13226, 13229, 32896, 8834, 8402, 113, 512, 59, 113, 13235, 13237, 32768, 8840, 59, 32896, 10949, 824, 99, 512, 59, 101, 13247, 13249, 32768, 8833, 113, 59, 32896, 10928, 824, 1024, 59, 69, 101, 115, 13263, 13265, 13269, 13272, 32768, 8837, 59, 32896, 10950, 824, 59, 32768, 8841, 101, 116, 512, 59, 101, 13279, 13282, 32896, 8835, 8402, 113, 512, 59, 113, 13288, 13290, 32768, 8841, 59, 32896, 10950, 824, 1024, 103, 105, 108, 114, 13303, 13307, 13315, 13319, 108, 59, 32768, 8825, 108, 100, 101, 33024, 241, 59, 32768, 241, 103, 59, 32768, 8824, 105, 97, 110, 103, 108, 101, 512, 108, 114, 13330, 13344, 101, 102, 116, 512, 59, 101, 13338, 13340, 32768, 8938, 113, 59, 32768, 8940, 105, 103, 104, 116, 512, 59, 101, 13353, 13355, 32768, 8939, 113, 59, 32768, 8941, 512, 59, 109, 13364, 13366, 32768, 957, 768, 59, 101, 115, 13373, 13375, 13380, 32768, 35, 114, 111, 59, 32768, 8470, 112, 59, 32768, 8199, 2304, 68, 72, 97, 100, 103, 105, 108, 114, 115, 13403, 13409, 13415, 13420, 13426, 13439, 13446, 13476, 13493, 97, 115, 104, 59, 32768, 8877, 97, 114, 114, 59, 32768, 10500, 112, 59, 32896, 8781, 8402, 97, 115, 104, 59, 32768, 8876, 512, 101, 116, 13431, 13435, 59, 32896, 8805, 8402, 59, 32896, 62, 8402, 110, 102, 105, 110, 59, 32768, 10718, 768, 65, 101, 116, 13453, 13458, 13462, 114, 114, 59, 32768, 10498, 59, 32896, 8804, 8402, 512, 59, 114, 13467, 13470, 32896, 60, 8402, 105, 101, 59, 32896, 8884, 8402, 512, 65, 116, 13481, 13486, 114, 114, 59, 32768, 10499, 114, 105, 101, 59, 32896, 8885, 8402, 105, 109, 59, 32896, 8764, 8402, 768, 65, 97, 110, 13506, 13511, 13532, 114, 114, 59, 32768, 8662, 114, 512, 104, 114, 13517, 13521, 107, 59, 32768, 10531, 512, 59, 111, 13526, 13528, 32768, 8598, 119, 59, 32768, 8598, 101, 97, 114, 59, 32768, 10535, 9252, 13576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13579, 0, 13596, 13617, 13653, 13659, 13673, 13695, 13708, 0, 0, 13713, 13750, 0, 13788, 13794, 0, 13815, 13890, 13913, 13937, 13944, 59, 32768, 9416, 512, 99, 115, 13583, 13591, 117, 116, 101, 33024, 243, 59, 32768, 243, 116, 59, 32768, 8859, 512, 105, 121, 13600, 13613, 114, 512, 59, 99, 13606, 13608, 32768, 8858, 33024, 244, 59, 32768, 244, 59, 32768, 1086, 1280, 97, 98, 105, 111, 115, 13627, 13632, 13638, 13642, 13646, 115, 104, 59, 32768, 8861, 108, 97, 99, 59, 32768, 337, 118, 59, 32768, 10808, 116, 59, 32768, 8857, 111, 108, 100, 59, 32768, 10684, 108, 105, 103, 59, 32768, 339, 512, 99, 114, 13663, 13668, 105, 114, 59, 32768, 10687, 59, 32896, 55349, 56620, 1600, 13680, 0, 0, 13684, 0, 13692, 110, 59, 32768, 731, 97, 118, 101, 33024, 242, 59, 32768, 242, 59, 32768, 10689, 512, 98, 109, 13699, 13704, 97, 114, 59, 32768, 10677, 59, 32768, 937, 110, 116, 59, 32768, 8750, 1024, 97, 99, 105, 116, 13721, 13726, 13741, 13746, 114, 114, 59, 32768, 8634, 512, 105, 114, 13731, 13735, 114, 59, 32768, 10686, 111, 115, 115, 59, 32768, 10683, 110, 101, 59, 32768, 8254, 59, 32768, 10688, 768, 97, 101, 105, 13756, 13761, 13766, 99, 114, 59, 32768, 333, 103, 97, 59, 32768, 969, 768, 99, 100, 110, 13773, 13779, 13782, 114, 111, 110, 59, 32768, 959, 59, 32768, 10678, 117, 115, 59, 32768, 8854, 112, 102, 59, 32896, 55349, 56672, 768, 97, 101, 108, 13800, 13804, 13809, 114, 59, 32768, 10679, 114, 112, 59, 32768, 10681, 117, 115, 59, 32768, 8853, 1792, 59, 97, 100, 105, 111, 115, 118, 13829, 13831, 13836, 13869, 13875, 13879, 13886, 32768, 8744, 114, 114, 59, 32768, 8635, 1024, 59, 101, 102, 109, 13845, 13847, 13859, 13864, 32768, 10845, 114, 512, 59, 111, 13853, 13855, 32768, 8500, 102, 59, 32768, 8500, 33024, 170, 59, 32768, 170, 33024, 186, 59, 32768, 186, 103, 111, 102, 59, 32768, 8886, 114, 59, 32768, 10838, 108, 111, 112, 101, 59, 32768, 10839, 59, 32768, 10843, 768, 99, 108, 111, 13896, 13900, 13908, 114, 59, 32768, 8500, 97, 115, 104, 33024, 248, 59, 32768, 248, 108, 59, 32768, 8856, 105, 573, 13917, 13924, 100, 101, 33024, 245, 59, 32768, 245, 101, 115, 512, 59, 97, 13930, 13932, 32768, 8855, 115, 59, 32768, 10806, 109, 108, 33024, 246, 59, 32768, 246, 98, 97, 114, 59, 32768, 9021, 5426, 13972, 0, 14013, 0, 14017, 14053, 0, 14058, 14086, 0, 0, 14107, 14199, 0, 14202, 0, 0, 14229, 14425, 0, 14438, 114, 1024, 59, 97, 115, 116, 13981, 13983, 13997, 14009, 32768, 8741, 33280, 182, 59, 108, 13989, 13991, 32768, 182, 108, 101, 108, 59, 32768, 8741, 1082, 14003, 0, 0, 14007, 109, 59, 32768, 10995, 59, 32768, 11005, 59, 32768, 8706, 121, 59, 32768, 1087, 114, 1280, 99, 105, 109, 112, 116, 14028, 14033, 14038, 14043, 14046, 110, 116, 59, 32768, 37, 111, 100, 59, 32768, 46, 105, 108, 59, 32768, 8240, 59, 32768, 8869, 101, 110, 107, 59, 32768, 8241, 114, 59, 32896, 55349, 56621, 768, 105, 109, 111, 14064, 14074, 14080, 512, 59, 118, 14069, 14071, 32768, 966, 59, 32768, 981, 109, 97, 116, 59, 32768, 8499, 110, 101, 59, 32768, 9742, 768, 59, 116, 118, 14092, 14094, 14103, 32768, 960, 99, 104, 102, 111, 114, 107, 59, 32768, 8916, 59, 32768, 982, 512, 97, 117, 14111, 14132, 110, 512, 99, 107, 14117, 14128, 107, 512, 59, 104, 14123, 14125, 32768, 8463, 59, 32768, 8462, 118, 59, 32768, 8463, 115, 2304, 59, 97, 98, 99, 100, 101, 109, 115, 116, 14152, 14154, 14160, 14163, 14168, 14179, 14182, 14188, 14193, 32768, 43, 99, 105, 114, 59, 32768, 10787, 59, 32768, 8862, 105, 114, 59, 32768, 10786, 512, 111, 117, 14173, 14176, 59, 32768, 8724, 59, 32768, 10789, 59, 32768, 10866, 110, 33024, 177, 59, 32768, 177, 105, 109, 59, 32768, 10790, 119, 111, 59, 32768, 10791, 59, 32768, 177, 768, 105, 112, 117, 14208, 14216, 14221, 110, 116, 105, 110, 116, 59, 32768, 10773, 102, 59, 32896, 55349, 56673, 110, 100, 33024, 163, 59, 32768, 163, 2560, 59, 69, 97, 99, 101, 105, 110, 111, 115, 117, 14249, 14251, 14254, 14258, 14263, 14336, 14348, 14367, 14413, 14418, 32768, 8826, 59, 32768, 10931, 112, 59, 32768, 10935, 117, 101, 59, 32768, 8828, 512, 59, 99, 14268, 14270, 32768, 10927, 1536, 59, 97, 99, 101, 110, 115, 14283, 14285, 14293, 14302, 14306, 14331, 32768, 8826, 112, 112, 114, 111, 120, 59, 32768, 10935, 117, 114, 108, 121, 101, 113, 59, 32768, 8828, 113, 59, 32768, 10927, 768, 97, 101, 115, 14313, 14321, 14326, 112, 112, 114, 111, 120, 59, 32768, 10937, 113, 113, 59, 32768, 10933, 105, 109, 59, 32768, 8936, 105, 109, 59, 32768, 8830, 109, 101, 512, 59, 115, 14343, 14345, 32768, 8242, 59, 32768, 8473, 768, 69, 97, 115, 14355, 14358, 14362, 59, 32768, 10933, 112, 59, 32768, 10937, 105, 109, 59, 32768, 8936, 768, 100, 102, 112, 14374, 14377, 14402, 59, 32768, 8719, 768, 97, 108, 115, 14384, 14390, 14396, 108, 97, 114, 59, 32768, 9006, 105, 110, 101, 59, 32768, 8978, 117, 114, 102, 59, 32768, 8979, 512, 59, 116, 14407, 14409, 32768, 8733, 111, 59, 32768, 8733, 105, 109, 59, 32768, 8830, 114, 101, 108, 59, 32768, 8880, 512, 99, 105, 14429, 14434, 114, 59, 32896, 55349, 56517, 59, 32768, 968, 110, 99, 115, 112, 59, 32768, 8200, 1536, 102, 105, 111, 112, 115, 117, 14457, 14462, 14467, 14473, 14480, 14486, 114, 59, 32896, 55349, 56622, 110, 116, 59, 32768, 10764, 112, 102, 59, 32896, 55349, 56674, 114, 105, 109, 101, 59, 32768, 8279, 99, 114, 59, 32896, 55349, 56518, 768, 97, 101, 111, 14493, 14513, 14526, 116, 512, 101, 105, 14499, 14508, 114, 110, 105, 111, 110, 115, 59, 32768, 8461, 110, 116, 59, 32768, 10774, 115, 116, 512, 59, 101, 14520, 14522, 32768, 63, 113, 59, 32768, 8799, 116, 33024, 34, 59, 32768, 34, 5376, 65, 66, 72, 97, 98, 99, 100, 101, 102, 104, 105, 108, 109, 110, 111, 112, 114, 115, 116, 117, 120, 14575, 14597, 14603, 14608, 14775, 14829, 14865, 14901, 14943, 14966, 15000, 15139, 15159, 15176, 15182, 15236, 15261, 15267, 15309, 15352, 15360, 768, 97, 114, 116, 14582, 14587, 14591, 114, 114, 59, 32768, 8667, 114, 59, 32768, 8658, 97, 105, 108, 59, 32768, 10524, 97, 114, 114, 59, 32768, 10511, 97, 114, 59, 32768, 10596, 1792, 99, 100, 101, 110, 113, 114, 116, 14623, 14637, 14642, 14650, 14672, 14679, 14751, 512, 101, 117, 14628, 14632, 59, 32896, 8765, 817, 116, 101, 59, 32768, 341, 105, 99, 59, 32768, 8730, 109, 112, 116, 121, 118, 59, 32768, 10675, 103, 1024, 59, 100, 101, 108, 14660, 14662, 14665, 14668, 32768, 10217, 59, 32768, 10642, 59, 32768, 10661, 101, 59, 32768, 10217, 117, 111, 33024, 187, 59, 32768, 187, 114, 2816, 59, 97, 98, 99, 102, 104, 108, 112, 115, 116, 119, 14703, 14705, 14709, 14720, 14723, 14727, 14731, 14735, 14739, 14744, 14748, 32768, 8594, 112, 59, 32768, 10613, 512, 59, 102, 14714, 14716, 32768, 8677, 115, 59, 32768, 10528, 59, 32768, 10547, 115, 59, 32768, 10526, 107, 59, 32768, 8618, 112, 59, 32768, 8620, 108, 59, 32768, 10565, 105, 109, 59, 32768, 10612, 108, 59, 32768, 8611, 59, 32768, 8605, 512, 97, 105, 14756, 14761, 105, 108, 59, 32768, 10522, 111, 512, 59, 110, 14767, 14769, 32768, 8758, 97, 108, 115, 59, 32768, 8474, 768, 97, 98, 114, 14782, 14787, 14792, 114, 114, 59, 32768, 10509, 114, 107, 59, 32768, 10099, 512, 97, 107, 14797, 14809, 99, 512, 101, 107, 14803, 14806, 59, 32768, 125, 59, 32768, 93, 512, 101, 115, 14814, 14817, 59, 32768, 10636, 108, 512, 100, 117, 14823, 14826, 59, 32768, 10638, 59, 32768, 10640, 1024, 97, 101, 117, 121, 14838, 14844, 14858, 14862, 114, 111, 110, 59, 32768, 345, 512, 100, 105, 14849, 14854, 105, 108, 59, 32768, 343, 108, 59, 32768, 8969, 98, 59, 32768, 125, 59, 32768, 1088, 1024, 99, 108, 113, 115, 14874, 14878, 14885, 14897, 97, 59, 32768, 10551, 100, 104, 97, 114, 59, 32768, 10601, 117, 111, 512, 59, 114, 14892, 14894, 32768, 8221, 59, 32768, 8221, 104, 59, 32768, 8627, 768, 97, 99, 103, 14908, 14934, 14938, 108, 1024, 59, 105, 112, 115, 14918, 14920, 14925, 14931, 32768, 8476, 110, 101, 59, 32768, 8475, 97, 114, 116, 59, 32768, 8476, 59, 32768, 8477, 116, 59, 32768, 9645, 33024, 174, 59, 32768, 174, 768, 105, 108, 114, 14950, 14956, 14962, 115, 104, 116, 59, 32768, 10621, 111, 111, 114, 59, 32768, 8971, 59, 32896, 55349, 56623, 512, 97, 111, 14971, 14990, 114, 512, 100, 117, 14977, 14980, 59, 32768, 8641, 512, 59, 108, 14985, 14987, 32768, 8640, 59, 32768, 10604, 512, 59, 118, 14995, 14997, 32768, 961, 59, 32768, 1009, 768, 103, 110, 115, 15007, 15123, 15127, 104, 116, 1536, 97, 104, 108, 114, 115, 116, 15022, 15039, 15060, 15086, 15099, 15111, 114, 114, 111, 119, 512, 59, 116, 15031, 15033, 32768, 8594, 97, 105, 108, 59, 32768, 8611, 97, 114, 112, 111, 111, 110, 512, 100, 117, 15050, 15056, 111, 119, 110, 59, 32768, 8641, 112, 59, 32768, 8640, 101, 102, 116, 512, 97, 104, 15068, 15076, 114, 114, 111, 119, 115, 59, 32768, 8644, 97, 114, 112, 111, 111, 110, 115, 59, 32768, 8652, 105, 103, 104, 116, 97, 114, 114, 111, 119, 115, 59, 32768, 8649, 113, 117, 105, 103, 97, 114, 114, 111, 119, 59, 32768, 8605, 104, 114, 101, 101, 116, 105, 109, 101, 115, 59, 32768, 8908, 103, 59, 32768, 730, 105, 110, 103, 100, 111, 116, 115, 101, 113, 59, 32768, 8787, 768, 97, 104, 109, 15146, 15151, 15156, 114, 114, 59, 32768, 8644, 97, 114, 59, 32768, 8652, 59, 32768, 8207, 111, 117, 115, 116, 512, 59, 97, 15168, 15170, 32768, 9137, 99, 104, 101, 59, 32768, 9137, 109, 105, 100, 59, 32768, 10990, 1024, 97, 98, 112, 116, 15191, 15204, 15209, 15229, 512, 110, 114, 15196, 15200, 103, 59, 32768, 10221, 114, 59, 32768, 8702, 114, 107, 59, 32768, 10215, 768, 97, 102, 108, 15216, 15220, 15224, 114, 59, 32768, 10630, 59, 32896, 55349, 56675, 117, 115, 59, 32768, 10798, 105, 109, 101, 115, 59, 32768, 10805, 512, 97, 112, 15241, 15253, 114, 512, 59, 103, 15247, 15249, 32768, 41, 116, 59, 32768, 10644, 111, 108, 105, 110, 116, 59, 32768, 10770, 97, 114, 114, 59, 32768, 8649, 1024, 97, 99, 104, 113, 15276, 15282, 15287, 15290, 113, 117, 111, 59, 32768, 8250, 114, 59, 32896, 55349, 56519, 59, 32768, 8625, 512, 98, 117, 15295, 15298, 59, 32768, 93, 111, 512, 59, 114, 15304, 15306, 32768, 8217, 59, 32768, 8217, 768, 104, 105, 114, 15316, 15322, 15328, 114, 101, 101, 59, 32768, 8908, 109, 101, 115, 59, 32768, 8906, 105, 1024, 59, 101, 102, 108, 15338, 15340, 15343, 15346, 32768, 9657, 59, 32768, 8885, 59, 32768, 9656, 116, 114, 105, 59, 32768, 10702, 108, 117, 104, 97, 114, 59, 32768, 10600, 59, 32768, 8478, 6706, 15391, 15398, 15404, 15499, 15516, 15592, 0, 15606, 15660, 0, 0, 15752, 15758, 0, 15827, 15863, 15886, 16000, 16006, 16038, 16086, 0, 16467, 0, 0, 16506, 99, 117, 116, 101, 59, 32768, 347, 113, 117, 111, 59, 32768, 8218, 2560, 59, 69, 97, 99, 101, 105, 110, 112, 115, 121, 15424, 15426, 15429, 15441, 15446, 15458, 15463, 15482, 15490, 15495, 32768, 8827, 59, 32768, 10932, 833, 15434, 0, 15437, 59, 32768, 10936, 111, 110, 59, 32768, 353, 117, 101, 59, 32768, 8829, 512, 59, 100, 15451, 15453, 32768, 10928, 105, 108, 59, 32768, 351, 114, 99, 59, 32768, 349, 768, 69, 97, 115, 15470, 15473, 15477, 59, 32768, 10934, 112, 59, 32768, 10938, 105, 109, 59, 32768, 8937, 111, 108, 105, 110, 116, 59, 32768, 10771, 105, 109, 59, 32768, 8831, 59, 32768, 1089, 111, 116, 768, 59, 98, 101, 15507, 15509, 15512, 32768, 8901, 59, 32768, 8865, 59, 32768, 10854, 1792, 65, 97, 99, 109, 115, 116, 120, 15530, 15535, 15556, 15562, 15566, 15572, 15587, 114, 114, 59, 32768, 8664, 114, 512, 104, 114, 15541, 15545, 107, 59, 32768, 10533, 512, 59, 111, 15550, 15552, 32768, 8600, 119, 59, 32768, 8600, 116, 33024, 167, 59, 32768, 167, 105, 59, 32768, 59, 119, 97, 114, 59, 32768, 10537, 109, 512, 105, 110, 15578, 15584, 110, 117, 115, 59, 32768, 8726, 59, 32768, 8726, 116, 59, 32768, 10038, 114, 512, 59, 111, 15597, 15600, 32896, 55349, 56624, 119, 110, 59, 32768, 8994, 1024, 97, 99, 111, 121, 15614, 15619, 15632, 15654, 114, 112, 59, 32768, 9839, 512, 104, 121, 15624, 15629, 99, 121, 59, 32768, 1097, 59, 32768, 1096, 114, 116, 1086, 15640, 0, 0, 15645, 105, 100, 59, 32768, 8739, 97, 114, 97, 108, 108, 101, 108, 59, 32768, 8741, 33024, 173, 59, 32768, 173, 512, 103, 109, 15664, 15681, 109, 97, 768, 59, 102, 118, 15673, 15675, 15678, 32768, 963, 59, 32768, 962, 59, 32768, 962, 2048, 59, 100, 101, 103, 108, 110, 112, 114, 15698, 15700, 15705, 15715, 15725, 15735, 15739, 15745, 32768, 8764, 111, 116, 59, 32768, 10858, 512, 59, 113, 15710, 15712, 32768, 8771, 59, 32768, 8771, 512, 59, 69, 15720, 15722, 32768, 10910, 59, 32768, 10912, 512, 59, 69, 15730, 15732, 32768, 10909, 59, 32768, 10911, 101, 59, 32768, 8774, 108, 117, 115, 59, 32768, 10788, 97, 114, 114, 59, 32768, 10610, 97, 114, 114, 59, 32768, 8592, 1024, 97, 101, 105, 116, 15766, 15788, 15796, 15808, 512, 108, 115, 15771, 15783, 108, 115, 101, 116, 109, 105, 110, 117, 115, 59, 32768, 8726, 104, 112, 59, 32768, 10803, 112, 97, 114, 115, 108, 59, 32768, 10724, 512, 100, 108, 15801, 15804, 59, 32768, 8739, 101, 59, 32768, 8995, 512, 59, 101, 15813, 15815, 32768, 10922, 512, 59, 115, 15820, 15822, 32768, 10924, 59, 32896, 10924, 65024, 768, 102, 108, 112, 15833, 15839, 15857, 116, 99, 121, 59, 32768, 1100, 512, 59, 98, 15844, 15846, 32768, 47, 512, 59, 97, 15851, 15853, 32768, 10692, 114, 59, 32768, 9023, 102, 59, 32896, 55349, 56676, 97, 512, 100, 114, 15868, 15882, 101, 115, 512, 59, 117, 15875, 15877, 32768, 9824, 105, 116, 59, 32768, 9824, 59, 32768, 8741, 768, 99, 115, 117, 15892, 15921, 15977, 512, 97, 117, 15897, 15909, 112, 512, 59, 115, 15903, 15905, 32768, 8851, 59, 32896, 8851, 65024, 112, 512, 59, 115, 15915, 15917, 32768, 8852, 59, 32896, 8852, 65024, 117, 512, 98, 112, 15927, 15952, 768, 59, 101, 115, 15934, 15936, 15939, 32768, 8847, 59, 32768, 8849, 101, 116, 512, 59, 101, 15946, 15948, 32768, 8847, 113, 59, 32768, 8849, 768, 59, 101, 115, 15959, 15961, 15964, 32768, 8848, 59, 32768, 8850, 101, 116, 512, 59, 101, 15971, 15973, 32768, 8848, 113, 59, 32768, 8850, 768, 59, 97, 102, 15984, 15986, 15996, 32768, 9633, 114, 566, 15991, 15994, 59, 32768, 9633, 59, 32768, 9642, 59, 32768, 9642, 97, 114, 114, 59, 32768, 8594, 1024, 99, 101, 109, 116, 16014, 16019, 16025, 16031, 114, 59, 32896, 55349, 56520, 116, 109, 110, 59, 32768, 8726, 105, 108, 101, 59, 32768, 8995, 97, 114, 102, 59, 32768, 8902, 512, 97, 114, 16042, 16053, 114, 512, 59, 102, 16048, 16050, 32768, 9734, 59, 32768, 9733, 512, 97, 110, 16058, 16081, 105, 103, 104, 116, 512, 101, 112, 16067, 16076, 112, 115, 105, 108, 111, 110, 59, 32768, 1013, 104, 105, 59, 32768, 981, 115, 59, 32768, 175, 1280, 98, 99, 109, 110, 112, 16096, 16221, 16288, 16291, 16295, 2304, 59, 69, 100, 101, 109, 110, 112, 114, 115, 16115, 16117, 16120, 16125, 16137, 16143, 16154, 16160, 16166, 32768, 8834, 59, 32768, 10949, 111, 116, 59, 32768, 10941, 512, 59, 100, 16130, 16132, 32768, 8838, 111, 116, 59, 32768, 10947, 117, 108, 116, 59, 32768, 10945, 512, 69, 101, 16148, 16151, 59, 32768, 10955, 59, 32768, 8842, 108, 117, 115, 59, 32768, 10943, 97, 114, 114, 59, 32768, 10617, 768, 101, 105, 117, 16173, 16206, 16210, 116, 768, 59, 101, 110, 16181, 16183, 16194, 32768, 8834, 113, 512, 59, 113, 16189, 16191, 32768, 8838, 59, 32768, 10949, 101, 113, 512, 59, 113, 16201, 16203, 32768, 8842, 59, 32768, 10955, 109, 59, 32768, 10951, 512, 98, 112, 16215, 16218, 59, 32768, 10965, 59, 32768, 10963, 99, 1536, 59, 97, 99, 101, 110, 115, 16235, 16237, 16245, 16254, 16258, 16283, 32768, 8827, 112, 112, 114, 111, 120, 59, 32768, 10936, 117, 114, 108, 121, 101, 113, 59, 32768, 8829, 113, 59, 32768, 10928, 768, 97, 101, 115, 16265, 16273, 16278, 112, 112, 114, 111, 120, 59, 32768, 10938, 113, 113, 59, 32768, 10934, 105, 109, 59, 32768, 8937, 105, 109, 59, 32768, 8831, 59, 32768, 8721, 103, 59, 32768, 9834, 3328, 49, 50, 51, 59, 69, 100, 101, 104, 108, 109, 110, 112, 115, 16322, 16327, 16332, 16337, 16339, 16342, 16356, 16368, 16382, 16388, 16394, 16405, 16411, 33024, 185, 59, 32768, 185, 33024, 178, 59, 32768, 178, 33024, 179, 59, 32768, 179, 32768, 8835, 59, 32768, 10950, 512, 111, 115, 16347, 16351, 116, 59, 32768, 10942, 117, 98, 59, 32768, 10968, 512, 59, 100, 16361, 16363, 32768, 8839, 111, 116, 59, 32768, 10948, 115, 512, 111, 117, 16374, 16378, 108, 59, 32768, 10185, 98, 59, 32768, 10967, 97, 114, 114, 59, 32768, 10619, 117, 108, 116, 59, 32768, 10946, 512, 69, 101, 16399, 16402, 59, 32768, 10956, 59, 32768, 8843, 108, 117, 115, 59, 32768, 10944, 768, 101, 105, 117, 16418, 16451, 16455, 116, 768, 59, 101, 110, 16426, 16428, 16439, 32768, 8835, 113, 512, 59, 113, 16434, 16436, 32768, 8839, 59, 32768, 10950, 101, 113, 512, 59, 113, 16446, 16448, 32768, 8843, 59, 32768, 10956, 109, 59, 32768, 10952, 512, 98, 112, 16460, 16463, 59, 32768, 10964, 59, 32768, 10966, 768, 65, 97, 110, 16473, 16478, 16499, 114, 114, 59, 32768, 8665, 114, 512, 104, 114, 16484, 16488, 107, 59, 32768, 10534, 512, 59, 111, 16493, 16495, 32768, 8601, 119, 59, 32768, 8601, 119, 97, 114, 59, 32768, 10538, 108, 105, 103, 33024, 223, 59, 32768, 223, 5938, 16538, 16552, 16557, 16579, 16584, 16591, 0, 16596, 16692, 0, 0, 0, 0, 0, 16731, 16780, 0, 16787, 16908, 0, 0, 0, 16938, 1091, 16543, 0, 0, 16549, 103, 101, 116, 59, 32768, 8982, 59, 32768, 964, 114, 107, 59, 32768, 9140, 768, 97, 101, 121, 16563, 16569, 16575, 114, 111, 110, 59, 32768, 357, 100, 105, 108, 59, 32768, 355, 59, 32768, 1090, 111, 116, 59, 32768, 8411, 108, 114, 101, 99, 59, 32768, 8981, 114, 59, 32896, 55349, 56625, 1024, 101, 105, 107, 111, 16604, 16641, 16670, 16684, 835, 16609, 0, 16624, 101, 512, 52, 102, 16614, 16617, 59, 32768, 8756, 111, 114, 101, 59, 32768, 8756, 97, 768, 59, 115, 118, 16631, 16633, 16638, 32768, 952, 121, 109, 59, 32768, 977, 59, 32768, 977, 512, 99, 110, 16646, 16665, 107, 512, 97, 115, 16652, 16660, 112, 112, 114, 111, 120, 59, 32768, 8776, 105, 109, 59, 32768, 8764, 115, 112, 59, 32768, 8201, 512, 97, 115, 16675, 16679, 112, 59, 32768, 8776, 105, 109, 59, 32768, 8764, 114, 110, 33024, 254, 59, 32768, 254, 829, 16696, 16701, 16727, 100, 101, 59, 32768, 732, 101, 115, 33536, 215, 59, 98, 100, 16710, 16712, 16723, 32768, 215, 512, 59, 97, 16717, 16719, 32768, 8864, 114, 59, 32768, 10801, 59, 32768, 10800, 116, 59, 32768, 8749, 768, 101, 112, 115, 16737, 16741, 16775, 97, 59, 32768, 10536, 1024, 59, 98, 99, 102, 16750, 16752, 16757, 16762, 32768, 8868, 111, 116, 59, 32768, 9014, 105, 114, 59, 32768, 10993, 512, 59, 111, 16767, 16770, 32896, 55349, 56677, 114, 107, 59, 32768, 10970, 97, 59, 32768, 10537, 114, 105, 109, 101, 59, 32768, 8244, 768, 97, 105, 112, 16793, 16798, 16899, 100, 101, 59, 32768, 8482, 1792, 97, 100, 101, 109, 112, 115, 116, 16813, 16868, 16873, 16876, 16883, 16889, 16893, 110, 103, 108, 101, 1280, 59, 100, 108, 113, 114, 16828, 16830, 16836, 16850, 16853, 32768, 9653, 111, 119, 110, 59, 32768, 9663, 101, 102, 116, 512, 59, 101, 16844, 16846, 32768, 9667, 113, 59, 32768, 8884, 59, 32768, 8796, 105, 103, 104, 116, 512, 59, 101, 16862, 16864, 32768, 9657, 113, 59, 32768, 8885, 111, 116, 59, 32768, 9708, 59, 32768, 8796, 105, 110, 117, 115, 59, 32768, 10810, 108, 117, 115, 59, 32768, 10809, 98, 59, 32768, 10701, 105, 109, 101, 59, 32768, 10811, 101, 122, 105, 117, 109, 59, 32768, 9186, 768, 99, 104, 116, 16914, 16926, 16931, 512, 114, 121, 16919, 16923, 59, 32896, 55349, 56521, 59, 32768, 1094, 99, 121, 59, 32768, 1115, 114, 111, 107, 59, 32768, 359, 512, 105, 111, 16942, 16947, 120, 116, 59, 32768, 8812, 104, 101, 97, 100, 512, 108, 114, 16956, 16967, 101, 102, 116, 97, 114, 114, 111, 119, 59, 32768, 8606, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 32768, 8608, 4608, 65, 72, 97, 98, 99, 100, 102, 103, 104, 108, 109, 111, 112, 114, 115, 116, 117, 119, 17016, 17021, 17026, 17043, 17057, 17072, 17095, 17110, 17119, 17139, 17172, 17187, 17202, 17290, 17330, 17336, 17365, 17381, 114, 114, 59, 32768, 8657, 97, 114, 59, 32768, 10595, 512, 99, 114, 17031, 17039, 117, 116, 101, 33024, 250, 59, 32768, 250, 114, 59, 32768, 8593, 114, 820, 17049, 0, 17053, 121, 59, 32768, 1118, 118, 101, 59, 32768, 365, 512, 105, 121, 17062, 17069, 114, 99, 33024, 251, 59, 32768, 251, 59, 32768, 1091, 768, 97, 98, 104, 17079, 17084, 17090, 114, 114, 59, 32768, 8645, 108, 97, 99, 59, 32768, 369, 97, 114, 59, 32768, 10606, 512, 105, 114, 17100, 17106, 115, 104, 116, 59, 32768, 10622, 59, 32896, 55349, 56626, 114, 97, 118, 101, 33024, 249, 59, 32768, 249, 562, 17123, 17135, 114, 512, 108, 114, 17128, 17131, 59, 32768, 8639, 59, 32768, 8638, 108, 107, 59, 32768, 9600, 512, 99, 116, 17144, 17167, 1088, 17150, 0, 0, 17163, 114, 110, 512, 59, 101, 17156, 17158, 32768, 8988, 114, 59, 32768, 8988, 111, 112, 59, 32768, 8975, 114, 105, 59, 32768, 9720, 512, 97, 108, 17177, 17182, 99, 114, 59, 32768, 363, 33024, 168, 59, 32768, 168, 512, 103, 112, 17192, 17197, 111, 110, 59, 32768, 371, 102, 59, 32896, 55349, 56678, 1536, 97, 100, 104, 108, 115, 117, 17215, 17222, 17233, 17257, 17262, 17280, 114, 114, 111, 119, 59, 32768, 8593, 111, 119, 110, 97, 114, 114, 111, 119, 59, 32768, 8597, 97, 114, 112, 111, 111, 110, 512, 108, 114, 17244, 17250, 101, 102, 116, 59, 32768, 8639, 105, 103, 104, 116, 59, 32768, 8638, 117, 115, 59, 32768, 8846, 105, 768, 59, 104, 108, 17270, 17272, 17275, 32768, 965, 59, 32768, 978, 111, 110, 59, 32768, 965, 112, 97, 114, 114, 111, 119, 115, 59, 32768, 8648, 768, 99, 105, 116, 17297, 17320, 17325, 1088, 17303, 0, 0, 17316, 114, 110, 512, 59, 101, 17309, 17311, 32768, 8989, 114, 59, 32768, 8989, 111, 112, 59, 32768, 8974, 110, 103, 59, 32768, 367, 114, 105, 59, 32768, 9721, 99, 114, 59, 32896, 55349, 56522, 768, 100, 105, 114, 17343, 17348, 17354, 111, 116, 59, 32768, 8944, 108, 100, 101, 59, 32768, 361, 105, 512, 59, 102, 17360, 17362, 32768, 9653, 59, 32768, 9652, 512, 97, 109, 17370, 17375, 114, 114, 59, 32768, 8648, 108, 33024, 252, 59, 32768, 252, 97, 110, 103, 108, 101, 59, 32768, 10663, 3840, 65, 66, 68, 97, 99, 100, 101, 102, 108, 110, 111, 112, 114, 115, 122, 17420, 17425, 17437, 17443, 17613, 17617, 17623, 17667, 17672, 17678, 17693, 17699, 17705, 17711, 17754, 114, 114, 59, 32768, 8661, 97, 114, 512, 59, 118, 17432, 17434, 32768, 10984, 59, 32768, 10985, 97, 115, 104, 59, 32768, 8872, 512, 110, 114, 17448, 17454, 103, 114, 116, 59, 32768, 10652, 1792, 101, 107, 110, 112, 114, 115, 116, 17469, 17478, 17485, 17494, 17515, 17526, 17578, 112, 115, 105, 108, 111, 110, 59, 32768, 1013, 97, 112, 112, 97, 59, 32768, 1008, 111, 116, 104, 105, 110, 103, 59, 32768, 8709, 768, 104, 105, 114, 17501, 17505, 17508, 105, 59, 32768, 981, 59, 32768, 982, 111, 112, 116, 111, 59, 32768, 8733, 512, 59, 104, 17520, 17522, 32768, 8597, 111, 59, 32768, 1009, 512, 105, 117, 17531, 17537, 103, 109, 97, 59, 32768, 962, 512, 98, 112, 17542, 17560, 115, 101, 116, 110, 101, 113, 512, 59, 113, 17553, 17556, 32896, 8842, 65024, 59, 32896, 10955, 65024, 115, 101, 116, 110, 101, 113, 512, 59, 113, 17571, 17574, 32896, 8843, 65024, 59, 32896, 10956, 65024, 512, 104, 114, 17583, 17589, 101, 116, 97, 59, 32768, 977, 105, 97, 110, 103, 108, 101, 512, 108, 114, 17600, 17606, 101, 102, 116, 59, 32768, 8882, 105, 103, 104, 116, 59, 32768, 8883, 121, 59, 32768, 1074, 97, 115, 104, 59, 32768, 8866, 768, 101, 108, 114, 17630, 17648, 17654, 768, 59, 98, 101, 17637, 17639, 17644, 32768, 8744, 97, 114, 59, 32768, 8891, 113, 59, 32768, 8794, 108, 105, 112, 59, 32768, 8942, 512, 98, 116, 17659, 17664, 97, 114, 59, 32768, 124, 59, 32768, 124, 114, 59, 32896, 55349, 56627, 116, 114, 105, 59, 32768, 8882, 115, 117, 512, 98, 112, 17685, 17689, 59, 32896, 8834, 8402, 59, 32896, 8835, 8402, 112, 102, 59, 32896, 55349, 56679, 114, 111, 112, 59, 32768, 8733, 116, 114, 105, 59, 32768, 8883, 512, 99, 117, 17716, 17721, 114, 59, 32896, 55349, 56523, 512, 98, 112, 17726, 17740, 110, 512, 69, 101, 17732, 17736, 59, 32896, 10955, 65024, 59, 32896, 8842, 65024, 110, 512, 69, 101, 17746, 17750, 59, 32896, 10956, 65024, 59, 32896, 8843, 65024, 105, 103, 122, 97, 103, 59, 32768, 10650, 1792, 99, 101, 102, 111, 112, 114, 115, 17777, 17783, 17815, 17820, 17826, 17829, 17842, 105, 114, 99, 59, 32768, 373, 512, 100, 105, 17788, 17809, 512, 98, 103, 17793, 17798, 97, 114, 59, 32768, 10847, 101, 512, 59, 113, 17804, 17806, 32768, 8743, 59, 32768, 8793, 101, 114, 112, 59, 32768, 8472, 114, 59, 32896, 55349, 56628, 112, 102, 59, 32896, 55349, 56680, 59, 32768, 8472, 512, 59, 101, 17834, 17836, 32768, 8768, 97, 116, 104, 59, 32768, 8768, 99, 114, 59, 32896, 55349, 56524, 5428, 17871, 17891, 0, 17897, 0, 17902, 17917, 0, 0, 17920, 17935, 17940, 17945, 0, 0, 17977, 17992, 0, 18008, 18024, 18029, 768, 97, 105, 117, 17877, 17881, 17886, 112, 59, 32768, 8898, 114, 99, 59, 32768, 9711, 112, 59, 32768, 8899, 116, 114, 105, 59, 32768, 9661, 114, 59, 32896, 55349, 56629, 512, 65, 97, 17906, 17911, 114, 114, 59, 32768, 10234, 114, 114, 59, 32768, 10231, 59, 32768, 958, 512, 65, 97, 17924, 17929, 114, 114, 59, 32768, 10232, 114, 114, 59, 32768, 10229, 97, 112, 59, 32768, 10236, 105, 115, 59, 32768, 8955, 768, 100, 112, 116, 17951, 17956, 17970, 111, 116, 59, 32768, 10752, 512, 102, 108, 17961, 17965, 59, 32896, 55349, 56681, 117, 115, 59, 32768, 10753, 105, 109, 101, 59, 32768, 10754, 512, 65, 97, 17981, 17986, 114, 114, 59, 32768, 10233, 114, 114, 59, 32768, 10230, 512, 99, 113, 17996, 18001, 114, 59, 32896, 55349, 56525, 99, 117, 112, 59, 32768, 10758, 512, 112, 116, 18012, 18018, 108, 117, 115, 59, 32768, 10756, 114, 105, 59, 32768, 9651, 101, 101, 59, 32768, 8897, 101, 100, 103, 101, 59, 32768, 8896, 2048, 97, 99, 101, 102, 105, 111, 115, 117, 18052, 18068, 18081, 18087, 18092, 18097, 18103, 18109, 99, 512, 117, 121, 18058, 18065, 116, 101, 33024, 253, 59, 32768, 253, 59, 32768, 1103, 512, 105, 121, 18073, 18078, 114, 99, 59, 32768, 375, 59, 32768, 1099, 110, 33024, 165, 59, 32768, 165, 114, 59, 32896, 55349, 56630, 99, 121, 59, 32768, 1111, 112, 102, 59, 32896, 55349, 56682, 99, 114, 59, 32896, 55349, 56526, 512, 99, 109, 18114, 18118, 121, 59, 32768, 1102, 108, 33024, 255, 59, 32768, 255, 2560, 97, 99, 100, 101, 102, 104, 105, 111, 115, 119, 18145, 18152, 18166, 18171, 18186, 18191, 18196, 18204, 18210, 18216, 99, 117, 116, 101, 59, 32768, 378, 512, 97, 121, 18157, 18163, 114, 111, 110, 59, 32768, 382, 59, 32768, 1079, 111, 116, 59, 32768, 380, 512, 101, 116, 18176, 18182, 116, 114, 102, 59, 32768, 8488, 97, 59, 32768, 950, 114, 59, 32896, 55349, 56631, 99, 121, 59, 32768, 1078, 103, 114, 97, 114, 114, 59, 32768, 8669, 112, 102, 59, 32896, 55349, 56683, 99, 114, 59, 32896, 55349, 56527, 512, 106, 110, 18221, 18224, 59, 32768, 8205, 106, 59, 32768, 8204]); diff --git a/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.d.ts new file mode 100644 index 0000000..4a3f533 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.d.ts @@ -0,0 +1,3 @@ +declare const _default: Uint16Array; +export default _default; +//# sourceMappingURL=decode-data-xml.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.d.ts.map new file mode 100644 index 0000000..9c8ab73 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/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,wBAA4K"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.js b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.js new file mode 100644 index 0000000..73f3317 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/generated/decode-data-xml.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Generated using scripts/write-decode-map.ts +// prettier-ignore +exports.default = new Uint16Array([1024, 97, 103, 108, 113, 9, 23, 27, 31, 1086, 15, 0, 0, 19, 112, 59, 32768, 38, 111, 115, 59, 32768, 39, 116, 59, 32768, 62, 116, 59, 32768, 60, 117, 111, 116, 59, 32768, 34]); diff --git a/node_modules/htmlparser2/node_modules/entities/lib/index.d.ts b/node_modules/htmlparser2/node_modules/entities/lib/index.d.ts new file mode 100644 index 0000000..39d2715 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/index.d.ts @@ -0,0 +1,91 @@ +/** 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 +} +/** Determines whether some entities are allowed to be written without a trailing `;`. */ +export declare enum DecodingMode { + /** Support legacy HTML entities. */ + Legacy = 0, + /** Do not support legacy HTML entities. */ + Strict = 1 +} +export declare enum EncodingMode { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * HTML 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 +} +interface DecodingOptions { + /** + * The level of entities to support. + * @default 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 DecodingMode.Legacy + */ + mode?: DecodingMode; +} +/** + * Decodes a string with entities. + * + * @param data String to decode. + * @param options Decoding options. + */ +export declare function decode(data: string, options?: DecodingOptions | EntityLevel): string; +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param data String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +export declare function decodeStrict(data: string, options?: DecodingOptions | EntityLevel): string; +/** + * Options for `encode`. + */ +export interface EncodingOptions { + /** + * The level of entities to support. + * @default EntityLevel.XML + */ + level?: EntityLevel; + /** + * Output format. + * @default EncodingMode.Extensive + */ + mode?: EncodingMode; +} +/** + * Encodes a string with entities. + * + * @param data String to encode. + * @param options Encoding options. + */ +export declare function encode(data: string, options?: EncodingOptions | EntityLevel): string; +export { encodeXML, encodeHTML, encodeNonAsciiHTML, escape, escapeUTF8, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode"; +export { decodeXML, decodeHTML, decodeHTMLStrict, decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/index.d.ts.map b/node_modules/htmlparser2/node_modules/entities/lib/index.d.ts.map new file mode 100644 index 0000000..618f571 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,wCAAwC;AACxC,oBAAY,WAAW;IACnB,iCAAiC;IACjC,GAAG,IAAI;IACP,mEAAmE;IACnE,IAAI,IAAI;CACX;AAED,yFAAyF;AACzF,oBAAY,YAAY;IACpB,oCAAoC;IACpC,MAAM,IAAI;IACV,2CAA2C;IAC3C,MAAM,IAAI;CACb;AAED,oBAAY,YAAY;IACpB;;;OAGG;IACH,IAAI,IAAA;IACJ;;;;OAIG;IACH,KAAK,IAAA;IACL;;;OAGG;IACH,SAAS,IAAA;CACZ;AAED,UAAU,eAAe;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CAWR;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,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAe,GAAG,WAA6B,GACzD,MAAM,CAgBR;AAED,OAAO,EACH,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,UAAU,EAEV,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,GAC5B,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,SAAS,EACT,UAAU,EACV,gBAAgB,EAEhB,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,EACzB,gBAAgB,IAAI,iBAAiB,EACrC,gBAAgB,IAAI,iBAAiB,EACrC,SAAS,IAAI,eAAe,GAC/B,MAAM,UAAU,CAAC"} \ No newline at end of file diff --git a/node_modules/htmlparser2/node_modules/entities/lib/index.js b/node_modules/htmlparser2/node_modules/entities/lib/index.js new file mode 100644 index 0000000..a972e4e --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/index.js @@ -0,0 +1,118 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = exports.EncodingMode = exports.DecodingMode = exports.EntityLevel = void 0; +var decode_1 = require("./decode"); +var encode_1 = require("./encode"); +/** 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 || (exports.EntityLevel = {})); +/** Determines whether some entities are allowed to be written without a trailing `;`. */ +var DecodingMode; +(function (DecodingMode) { + /** Support legacy HTML entities. */ + DecodingMode[DecodingMode["Legacy"] = 0] = "Legacy"; + /** Do not support legacy HTML entities. */ + DecodingMode[DecodingMode["Strict"] = 1] = "Strict"; +})(DecodingMode = exports.DecodingMode || (exports.DecodingMode = {})); +var EncodingMode; +(function (EncodingMode) { + /** + * The output is UTF-8 encoded. Only characters that need escaping within + * HTML 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"; +})(EncodingMode = exports.EncodingMode || (exports.EncodingMode = {})); +/** + * Decodes a string with entities. + * + * @param data String to decode. + * @param options Decoding options. + */ +function decode(data, options) { + if (options === void 0) { options = EntityLevel.XML; } + var opts = typeof options === "number" ? { level: options } : options; + if (opts.level === EntityLevel.HTML) { + if (opts.mode === DecodingMode.Strict) { + return decode_1.decodeHTMLStrict(data); + } + return decode_1.decodeHTML(data); + } + return decode_1.decodeXML(data); +} +exports.decode = decode; +/** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param data String to decode. + * @param options Decoding options. + * @deprecated Use `decode` with the `mode` set to `Strict`. + */ +function decodeStrict(data, options) { + if (options === void 0) { options = EntityLevel.XML; } + var opts = typeof options === "number" ? { level: options } : options; + if (opts.level === EntityLevel.HTML) { + if (opts.mode === DecodingMode.Legacy) { + return decode_1.decodeHTML(data); + } + return decode_1.decodeHTMLStrict(data); + } + return decode_1.decodeXML(data); +} +exports.decodeStrict = decodeStrict; +/** + * Encodes a string with entities. + * + * @param data String to encode. + * @param options Encoding options. + */ +function encode(data, options) { + if (options === void 0) { options = EntityLevel.XML; } + var opts = typeof options === "number" ? { level: options } : options; + // Mode `UTF8` just escapes XML entities + if (opts.mode === EncodingMode.UTF8) + return encode_1.escapeUTF8(data); + if (opts.level === EntityLevel.HTML) { + if (opts.mode === EncodingMode.ASCII) { + return encode_1.encodeNonAsciiHTML(data); + } + return encode_1.encodeHTML(data); + } + // ASCII and Extensive are equivalent + return encode_1.encodeXML(data); +} +exports.encode = encode; +var encode_2 = require("./encode"); +Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } }); +Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } }); +Object.defineProperty(exports, "encodeNonAsciiHTML", { enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } }); +Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } }); +Object.defineProperty(exports, "escapeUTF8", { enumerable: true, get: function () { return encode_2.escapeUTF8; } }); +// Legacy aliases (deprecated) +Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } }); +Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } }); +var decode_2 = require("./decode"); +Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } }); +Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } }); +Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }); +// Legacy aliases (deprecated) +Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } }); +Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } }); +Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }); +Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }); +Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } }); diff --git a/node_modules/htmlparser2/node_modules/entities/lib/maps/entities.json b/node_modules/htmlparser2/node_modules/entities/lib/maps/entities.json new file mode 100644 index 0000000..c5b1c4e --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/maps/entities.json @@ -0,0 +1 @@ +{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\"","QUOT":"\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"} diff --git a/node_modules/htmlparser2/node_modules/entities/lib/maps/legacy.json b/node_modules/htmlparser2/node_modules/entities/lib/maps/legacy.json new file mode 100644 index 0000000..43dbea6 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/maps/legacy.json @@ -0,0 +1 @@ +{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\"","QUOT":"\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"} diff --git a/node_modules/htmlparser2/node_modules/entities/lib/maps/xml.json b/node_modules/htmlparser2/node_modules/entities/lib/maps/xml.json new file mode 100644 index 0000000..de8db10 --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/lib/maps/xml.json @@ -0,0 +1 @@ +{"amp":"&","apos":"'","gt":">","lt":"<","quot":"\""} diff --git a/node_modules/htmlparser2/node_modules/entities/package.json b/node_modules/htmlparser2/node_modules/entities/package.json new file mode 100644 index 0000000..8d3a43c --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/package.json @@ -0,0 +1,67 @@ +{ + "name": "entities", + "version": "3.0.1", + "description": "Encode & decode XML and HTML entities with ease", + "author": "Felix Boehm ", + "funding": "https://github.com/fb55/entities?sponsor=1", + "sideEffects": false, + "keywords": [ + "entity", + "decoding", + "encoding", + "html", + "xml", + "html entities" + ], + "directories": { + "lib": "lib/" + }, + "main": "lib/index.js", + "types": "lib/index.d.ts", + "files": [ + "lib/**/*" + ], + "engines": { + "node": ">=0.12" + }, + "devDependencies": { + "@types/jest": "^26.0.24", + "@types/node": "^16.4.13", + "@typescript-eslint/eslint-plugin": "^4.29.0", + "@typescript-eslint/parser": "^4.29.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-node": "^11.1.0", + "jest": "^27.0.3", + "prettier": "^2.0.5", + "ts-jest": "^27.0.4", + "typescript": "^4.0.2" + }, + "scripts": { + "test": "npm run test:jest && npm run lint", + "test:jest": "jest", + "lint": "npm run lint:es && npm run lint:prettier", + "lint:es": "eslint .", + "lint:prettier": "npm run prettier -- --check", + "format": "npm run format:es && npm run format:prettier", + "format:es": "npm run lint:es -- --fix", + "format:prettier": "npm run prettier -- --write", + "prettier": "prettier '**/*.{ts,md,json,yml}'", + "build": "tsc && cp -r src/maps lib", + "prepare": "npm run build" + }, + "repository": { + "type": "git", + "url": "git://github.com/fb55/entities.git" + }, + "license": "BSD-2-Clause", + "jest": { + "preset": "ts-jest", + "testEnvironment": "node", + "coverageProvider": "v8" + }, + "prettier": { + "tabWidth": 4, + "proseWrap": "always" + } +} diff --git a/node_modules/htmlparser2/node_modules/entities/readme.md b/node_modules/htmlparser2/node_modules/entities/readme.md new file mode 100644 index 0000000..7c3322d --- /dev/null +++ b/node_modules/htmlparser2/node_modules/entities/readme.md @@ -0,0 +1,74 @@ +# entities [![NPM version](http://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) [![Build Status](http://img.shields.io/travis/fb55/entities.svg)](http://travis-ci.org/fb55/entities) [![Coverage](http://img.shields.io/coveralls/fb55/entities.svg)](https://coveralls.io/r/fb55/entities) + +Encode & decode HTML & XML entities with ease & speed. + +## How to… + +### …install `entities` + + npm install entities + +### …use `entities` + +```javascript +const entities = require("entities"); + +//encoding +entities.escape("&"); // "&#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): + +| Library | `decode` perf | `encode` perf | `escape` perf | Bundle size | +| -------------- | ------------- | ------------- | ------------- | -------------------------------------------------------------------------- | +| entities | 1.418s | 6.786s | 2.196s | ![npm bundle size](https://img.shields.io/bundlephobia/min/entities) | +| html-entities | 2.530s | 6.829s | 2.415s | ![npm bundle size](https://img.shields.io/bundlephobia/min/html-entities) | +| he | 5.800s | 24.237s | 3.624s | ![npm bundle size](https://img.shields.io/bundlephobia/min/he) | +| parse-entities | 9.660s | N/A | N/A | ![npm bundle size](https://img.shields.io/bundlephobia/min/parse-entities) | + +--- + +## Acknowledgements + +This libary 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/htmlparser2/package.json b/node_modules/htmlparser2/package.json new file mode 100644 index 0000000..ab52a8b --- /dev/null +++ b/node_modules/htmlparser2/package.json @@ -0,0 +1,75 @@ +{ + "name": "htmlparser2", + "description": "Fast & forgiving HTML/XML parser", + "version": "7.2.0", + "author": "Felix Boehm ", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "sideEffects": false, + "keywords": [ + "html", + "parser", + "streams", + "xml", + "dom", + "rss", + "feed", + "atom" + ], + "repository": { + "type": "git", + "url": "git://github.com/fb55/htmlparser2.git" + }, + "directories": { + "lib": "lib/" + }, + "main": "lib/index.js", + "types": "lib/index.d.ts", + "files": [ + "lib/**/*" + ], + "scripts": { + "test": "npm run test:jest && npm run lint", + "test:jest": "jest", + "lint": "npm run lint:es && npm run lint:prettier", + "lint:es": "eslint src", + "lint:prettier": "npm run format:prettier:raw -- --check", + "format": "npm run format:es && npm run format:prettier", + "format:es": "npm run lint:es -- --fix", + "format:prettier": "npm run format:prettier:raw -- --write", + "format:prettier:raw": "prettier '**/*.{ts,md,json,yml}'", + "build": "tsc", + "prepare": "npm run build" + }, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + }, + "devDependencies": { + "@types/jest": "^27.0.2", + "@types/node": "^16.11.7", + "@typescript-eslint/eslint-plugin": "^5.3.1", + "@typescript-eslint/parser": "^5.3.1", + "eslint": "^8.2.0", + "eslint-config-prettier": "^8.1.0", + "jest": "^27.3.1", + "prettier": "^2.4.1", + "ts-jest": "^27.0.7", + "typescript": "^4.4.4" + }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node" + }, + "prettier": { + "tabWidth": 4 + } +} diff --git a/node_modules/http-equiv-refresh/README.md b/node_modules/http-equiv-refresh/README.md new file mode 100644 index 0000000..b555d75 --- /dev/null +++ b/node_modules/http-equiv-refresh/README.md @@ -0,0 +1,31 @@ +# http-equiv-refresh [![NPM Version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coverage Status][coveralls-image]][coveralls-url] + +> Parse an HTML [meta refresh value](https://mdn.io/HTML/Element/meta#attr-http-equiv). + + +## Installation + +[Node.js](http://nodejs.org) `>= 6` is required. To install, type this at the command line: +```shell +npm install http-equiv-refresh +``` + + +## Usage +```js +const parseMetaRefresh = require('http-equiv-refresh'); + +parseMetaRefresh('5; url=http://domain.com/'); +//-> { timeout:5, url:'http://domain.com/' } + +parseMetaRefresh('5'); +//-> { timeout:5, url:null } +``` + + +[npm-image]: https://img.shields.io/npm/v/http-equiv-refresh.svg +[npm-url]: https://npmjs.com/package/http-equiv-refresh +[travis-image]: https://img.shields.io/travis/stevenvachon/http-equiv-refresh.svg +[travis-url]: https://travis-ci.org/stevenvachon/http-equiv-refresh +[coveralls-image]: https://img.shields.io/coveralls/stevenvachon/http-equiv-refresh.svg +[coveralls-url]: https://coveralls.io/github/stevenvachon/http-equiv-refresh diff --git a/node_modules/http-equiv-refresh/index-es5.js b/node_modules/http-equiv-refresh/index-es5.js new file mode 100644 index 0000000..a251158 --- /dev/null +++ b/node_modules/http-equiv-refresh/index-es5.js @@ -0,0 +1,30 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; +var PATTERN = /^\s*(\d+)(?:\s*;(?:\s*url\s*=)?\s*(?:["']\s*(.*?)\s*['"]|(.*?)))?\s*$/i; + +var _default = function _default(content) { + content = PATTERN.exec(content); + var timeout, url; + + if (content !== null) { + timeout = parseInt(content[1], 10); + url = content[2] || content[3] || null; // first matching group + } else { + timeout = null; + url = null; + } + + return { + timeout: timeout, + url: url + }; +}; + +exports["default"] = _default; +module.exports = exports.default; + +//# sourceMappingURL=index-es5.js.map \ No newline at end of file diff --git a/node_modules/http-equiv-refresh/index-es5.js.map b/node_modules/http-equiv-refresh/index-es5.js.map new file mode 100644 index 0000000..bf32636 --- /dev/null +++ b/node_modules/http-equiv-refresh/index-es5.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.js"],"names":[],"mappings":";;;;;;AAAA,IAAM,OAAO,GAAG,wEAAhB;;eAIe,kBAAA,OAAO,EACtB;AACC,EAAA,OAAO,GAAG,OAAO,CAAC,IAAR,CAAa,OAAb,CAAV;AAEA,MAAI,OAAJ,EAAa,GAAb;;AAEA,MAAI,OAAO,KAAK,IAAhB,EACA;AACC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAD,CAAR,EAAa,EAAb,CAAlB;AAEA,IAAA,GAAG,GAAG,OAAO,CAAC,CAAD,CAAP,IAAc,OAAO,CAAC,CAAD,CAArB,IAA4B,IAAlC,CAHD,CAGyC;AACxC,GALD,MAOA;AACC,IAAA,OAAO,GAAG,IAAV;AACA,IAAA,GAAG,GAAG,IAAN;AACA;;AAED,SAAO;AAAE,IAAA,OAAO,EAAP,OAAF;AAAW,IAAA,GAAG,EAAH;AAAX,GAAP;AACA,C","file":"index-es5.js","sourcesContent":["const PATTERN = /^\\s*(\\d+)(?:\\s*;(?:\\s*url\\s*=)?\\s*(?:[\"']\\s*(.*?)\\s*['\"]|(.*?)))?\\s*$/i;\n\n\n\nexport default content =>\n{\n\tcontent = PATTERN.exec(content);\n\n\tlet timeout, url;\n\n\tif (content !== null)\n\t{\n\t\ttimeout = parseInt(content[1], 10);\n\n\t\turl = content[2] || content[3] || null; // first matching group\n\t}\n\telse\n\t{\n\t\ttimeout = null;\n\t\turl = null;\n\t}\n\n\treturn { timeout, url };\n};\n"]} \ No newline at end of file diff --git a/node_modules/http-equiv-refresh/index.js b/node_modules/http-equiv-refresh/index.js new file mode 100644 index 0000000..47f3f94 --- /dev/null +++ b/node_modules/http-equiv-refresh/index.js @@ -0,0 +1,24 @@ +const PATTERN = /^\s*(\d+)(?:\s*;(?:\s*url\s*=)?\s*(?:["']\s*(.*?)\s*['"]|(.*?)))?\s*$/i; + + + +export default content => +{ + content = PATTERN.exec(content); + + let timeout, url; + + if (content !== null) + { + timeout = parseInt(content[1], 10); + + url = content[2] || content[3] || null; // first matching group + } + else + { + timeout = null; + url = null; + } + + return { timeout, url }; +}; diff --git a/node_modules/http-equiv-refresh/license b/node_modules/http-equiv-refresh/license new file mode 100644 index 0000000..b760007 --- /dev/null +++ b/node_modules/http-equiv-refresh/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Steven Vachon (svachon.com) + +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/http-equiv-refresh/package.json b/node_modules/http-equiv-refresh/package.json new file mode 100644 index 0000000..14bac1e --- /dev/null +++ b/node_modules/http-equiv-refresh/package.json @@ -0,0 +1,42 @@ +{ + "name": "http-equiv-refresh", + "description": "Parse an HTML meta refresh value.", + "version": "2.0.1", + "license": "MIT", + "author": "Steven Vachon (https://svachon.com)", + "repository": "github:stevenvachon/http-equiv-refresh", + "main": "index-es5.js", + "devDependencies": { + "@babel/cli": "^7.5.0", + "@babel/core": "^7.5.4", + "@babel/preset-env": "^7.5.4", + "babel-plugin-add-module-exports": "^1.0.2", + "chai": "^4.2.0", + "coveralls": "^3.0.5", + "mocha": "^6.1.4", + "nyc": "^14.1.1" + }, + "engines": { + "node": ">= 6" + }, + "scripts": { + "ci": "npm test && nyc report --reporter=text-lcov | coveralls", + "posttest": "nyc report --reporter=text-summary --reporter=html", + "prepublishOnly": "npm test", + "pretest": "babel index.js --out-file=index-es5.js --plugins=babel-plugin-add-module-exports --presets=@babel/env --source-maps", + "test": "nyc --silent mocha test.js --bail --check-leaks" + }, + "files": [ + "index.js", + "index-es5.js", + "index-es5.js.map" + ], + "keywords": [ + "html", + "http-equiv", + "meta", + "metadata", + "parse", + "refresh" + ] +} diff --git a/node_modules/http-errors/HISTORY.md b/node_modules/http-errors/HISTORY.md new file mode 100644 index 0000000..3d81d26 --- /dev/null +++ b/node_modules/http-errors/HISTORY.md @@ -0,0 +1,186 @@ +2.0.1 / 2025-11-20 +================== + + * deps: use tilde notation for dependencies + * deps: update statuses to 2.0.2 + +2.0.0 / 2021-12-17 +================== + + * Drop support for Node.js 0.6 + * Remove `I'mateapot` export; use `ImATeapot` instead + * Remove support for status being non-first argument + * Rename `UnorderedCollection` constructor to `TooEarly` + * deps: depd@2.0.0 + - Replace internal `eval` usage with `Function` constructor + - Use instance methods on `process` to check for listeners + * deps: statuses@2.0.1 + - Fix messaging casing of `418 I'm a Teapot` + - Remove code 306 + - Rename `425 Unordered Collection` to standard `425 Too Early` + +2021-11-14 / 1.8.1 +================== + + * deps: toidentifier@1.0.1 + +2020-06-29 / 1.8.0 +================== + + * Add `isHttpError` export to determine if value is an HTTP error + * deps: setprototypeof@1.2.0 + +2019-06-24 / 1.7.3 +================== + + * deps: inherits@2.0.4 + +2019-02-18 / 1.7.2 +================== + + * deps: setprototypeof@1.1.1 + +2018-09-08 / 1.7.1 +================== + + * Fix error creating objects in some environments + +2018-07-30 / 1.7.0 +================== + + * Set constructor name when possible + * Use `toidentifier` module to make class names + * deps: statuses@'>= 1.5.0 < 2' + +2018-03-29 / 1.6.3 +================== + + * deps: depd@~1.1.2 + - perf: remove argument reassignment + * deps: setprototypeof@1.1.0 + * deps: statuses@'>= 1.4.0 < 2' + +2017-08-04 / 1.6.2 +================== + + * deps: depd@1.1.1 + - Remove unnecessary `Buffer` loading + +2017-02-20 / 1.6.1 +================== + + * deps: setprototypeof@1.0.3 + - Fix shim for old browsers + +2017-02-14 / 1.6.0 +================== + + * Accept custom 4xx and 5xx status codes in factory + * Add deprecation message to `"I'mateapot"` export + * Deprecate passing status code as anything except first argument in factory + * Deprecate using non-error status codes + * Make `message` property enumerable for `HttpError`s + +2016-11-16 / 1.5.1 +================== + + * deps: inherits@2.0.3 + - Fix issue loading in browser + * deps: setprototypeof@1.0.2 + * deps: statuses@'>= 1.3.1 < 2' + +2016-05-18 / 1.5.0 +================== + + * Support new code `421 Misdirected Request` + * Use `setprototypeof` module to replace `__proto__` setting + * deps: statuses@'>= 1.3.0 < 2' + - Add `421 Misdirected Request` + - perf: enable strict mode + * perf: enable strict mode + +2016-01-28 / 1.4.0 +================== + + * Add `HttpError` export, for `err instanceof createError.HttpError` + * deps: inherits@2.0.1 + * deps: statuses@'>= 1.2.1 < 2' + - Fix message for status 451 + - Remove incorrect nginx status code + +2015-02-02 / 1.3.1 +================== + + * Fix regression where status can be overwritten in `createError` `props` + +2015-02-01 / 1.3.0 +================== + + * Construct errors using defined constructors from `createError` + * Fix error names that are not identifiers + - `createError["I'mateapot"]` is now `createError.ImATeapot` + * Set a meaningful `name` property on constructed errors + +2014-12-09 / 1.2.8 +================== + + * Fix stack trace from exported function + * Remove `arguments.callee` usage + +2014-10-14 / 1.2.7 +================== + + * Remove duplicate line + +2014-10-02 / 1.2.6 +================== + + * Fix `expose` to be `true` for `ClientError` constructor + +2014-09-28 / 1.2.5 +================== + + * deps: statuses@1 + +2014-09-21 / 1.2.4 +================== + + * Fix dependency version to work with old `npm`s + +2014-09-21 / 1.2.3 +================== + + * deps: statuses@~1.1.0 + +2014-09-21 / 1.2.2 +================== + + * Fix publish error + +2014-09-21 / 1.2.1 +================== + + * Support Node.js 0.6 + * Use `inherits` instead of `util` + +2014-09-09 / 1.2.0 +================== + + * Fix the way inheriting functions + * Support `expose` being provided in properties argument + +2014-09-08 / 1.1.0 +================== + + * Default status to 500 + * Support provided `error` to extend + +2014-09-08 / 1.0.1 +================== + + * Fix accepting string message + +2014-09-08 / 1.0.0 +================== + + * Initial release diff --git a/node_modules/http-errors/LICENSE b/node_modules/http-errors/LICENSE new file mode 100644 index 0000000..82af4df --- /dev/null +++ b/node_modules/http-errors/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com + +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/http-errors/README.md b/node_modules/http-errors/README.md new file mode 100644 index 0000000..a8b7330 --- /dev/null +++ b/node_modules/http-errors/README.md @@ -0,0 +1,169 @@ +# http-errors + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][node-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +Create HTTP errors for Express, Koa, Connect, etc. with ease. + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```console +$ npm install http-errors +``` + +## Example + +```js +var createError = require('http-errors') +var express = require('express') +var app = express() + +app.use(function (req, res, next) { + if (!req.user) return next(createError(401, 'Please login to view this page.')) + next() +}) +``` + +## API + +This is the current API, currently extracted from Koa and subject to change. + +### Error Properties + +- `expose` - can be used to signal if `message` should be sent to the client, + defaulting to `false` when `status` >= 500 +- `headers` - can be an object of header names to values to be sent to the + client, defaulting to `undefined`. When defined, the key names should all + be lower-cased +- `message` - the traditional error message, which should be kept short and all + single line +- `status` - the status code of the error, mirroring `statusCode` for general + compatibility +- `statusCode` - the status code of the error, defaulting to `500` + +### createError([status], [message], [properties]) + +Create a new error object with the given message `msg`. +The error object inherits from `createError.HttpError`. + +```js +var err = createError(404, 'This video does not exist!') +``` + +- `status: 500` - the status code as a number +- `message` - the message of the error, defaulting to node's text for that status code. +- `properties` - custom properties to attach to the object + +### createError([status], [error], [properties]) + +Extend the given `error` object with `createError.HttpError` +properties. This will not alter the inheritance of the given +`error` object, and the modified `error` object is the +return value. + + + +```js +fs.readFile('foo.txt', function (err, buf) { + if (err) { + if (err.code === 'ENOENT') { + var httpError = createError(404, err, { expose: false }) + } else { + var httpError = createError(500, err) + } + } +}) +``` + +- `status` - the status code as a number +- `error` - the error object to extend +- `properties` - custom properties to attach to the object + +### createError.isHttpError(val) + +Determine if the provided `val` is an `HttpError`. This will return `true` +if the error inherits from the `HttpError` constructor of this module or +matches the "duck type" for an error this module creates. All outputs from +the `createError` factory will return `true` for this function, including +if an non-`HttpError` was passed into the factory. + +### new createError\[code || name\](\[msg]\)) + +Create a new error object with the given message `msg`. +The error object inherits from `createError.HttpError`. + +```js +var err = new createError.NotFound() +``` + +- `code` - the status code as a number +- `name` - the name of the error as a "bumpy case", i.e. `NotFound` or `InternalServerError`. + +#### List of all constructors + +|Status Code|Constructor Name | +|-----------|-----------------------------| +|400 |BadRequest | +|401 |Unauthorized | +|402 |PaymentRequired | +|403 |Forbidden | +|404 |NotFound | +|405 |MethodNotAllowed | +|406 |NotAcceptable | +|407 |ProxyAuthenticationRequired | +|408 |RequestTimeout | +|409 |Conflict | +|410 |Gone | +|411 |LengthRequired | +|412 |PreconditionFailed | +|413 |PayloadTooLarge | +|414 |URITooLong | +|415 |UnsupportedMediaType | +|416 |RangeNotSatisfiable | +|417 |ExpectationFailed | +|418 |ImATeapot | +|421 |MisdirectedRequest | +|422 |UnprocessableEntity | +|423 |Locked | +|424 |FailedDependency | +|425 |TooEarly | +|426 |UpgradeRequired | +|428 |PreconditionRequired | +|429 |TooManyRequests | +|431 |RequestHeaderFieldsTooLarge | +|451 |UnavailableForLegalReasons | +|500 |InternalServerError | +|501 |NotImplemented | +|502 |BadGateway | +|503 |ServiceUnavailable | +|504 |GatewayTimeout | +|505 |HTTPVersionNotSupported | +|506 |VariantAlsoNegotiates | +|507 |InsufficientStorage | +|508 |LoopDetected | +|509 |BandwidthLimitExceeded | +|510 |NotExtended | +|511 |NetworkAuthenticationRequired| + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/http-errors/master?label=ci +[ci-url]: https://github.com/jshttp/http-errors/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/http-errors/master +[coveralls-url]: https://coveralls.io/r/jshttp/http-errors?branch=master +[node-image]: https://badgen.net/npm/node/http-errors +[node-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/http-errors +[npm-url]: https://npmjs.org/package/http-errors +[npm-version-image]: https://badgen.net/npm/v/http-errors +[travis-image]: https://badgen.net/travis/jshttp/http-errors/master +[travis-url]: https://travis-ci.org/jshttp/http-errors diff --git a/node_modules/http-errors/index.js b/node_modules/http-errors/index.js new file mode 100644 index 0000000..82271f6 --- /dev/null +++ b/node_modules/http-errors/index.js @@ -0,0 +1,290 @@ +/*! + * http-errors + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var deprecate = require('depd')('http-errors') +var setPrototypeOf = require('setprototypeof') +var statuses = require('statuses') +var inherits = require('inherits') +var toIdentifier = require('toidentifier') + +/** + * Module exports. + * @public + */ + +module.exports = createError +module.exports.HttpError = createHttpErrorConstructor() +module.exports.isHttpError = createIsHttpErrorFunction(module.exports.HttpError) + +// Populate exports for all constructors +populateConstructorExports(module.exports, statuses.codes, module.exports.HttpError) + +/** + * Get the code class of a status code. + * @private + */ + +function codeClass (status) { + return Number(String(status).charAt(0) + '00') +} + +/** + * Create a new HTTP Error. + * + * @returns {Error} + * @public + */ + +function createError () { + // so much arity going on ~_~ + var err + var msg + var status = 500 + var props = {} + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i] + var type = typeof arg + if (type === 'object' && arg instanceof Error) { + err = arg + status = err.status || err.statusCode || status + } else if (type === 'number' && i === 0) { + status = arg + } else if (type === 'string') { + msg = arg + } else if (type === 'object') { + props = arg + } else { + throw new TypeError('argument #' + (i + 1) + ' unsupported type ' + type) + } + } + + if (typeof status === 'number' && (status < 400 || status >= 600)) { + deprecate('non-error status code; use only 4xx or 5xx status codes') + } + + if (typeof status !== 'number' || + (!statuses.message[status] && (status < 400 || status >= 600))) { + status = 500 + } + + // constructor + var HttpError = createError[status] || createError[codeClass(status)] + + if (!err) { + // create error + err = HttpError + ? new HttpError(msg) + : new Error(msg || statuses.message[status]) + Error.captureStackTrace(err, createError) + } + + if (!HttpError || !(err instanceof HttpError) || err.status !== status) { + // add properties to generic error + err.expose = status < 500 + err.status = err.statusCode = status + } + + for (var key in props) { + if (key !== 'status' && key !== 'statusCode') { + err[key] = props[key] + } + } + + return err +} + +/** + * Create HTTP error abstract base class. + * @private + */ + +function createHttpErrorConstructor () { + function HttpError () { + throw new TypeError('cannot construct abstract class') + } + + inherits(HttpError, Error) + + return HttpError +} + +/** + * Create a constructor for a client error. + * @private + */ + +function createClientErrorConstructor (HttpError, name, code) { + var className = toClassName(name) + + function ClientError (message) { + // create the error object + var msg = message != null ? message : statuses.message[code] + var err = new Error(msg) + + // capture a stack trace to the construction point + Error.captureStackTrace(err, ClientError) + + // adjust the [[Prototype]] + setPrototypeOf(err, ClientError.prototype) + + // redefine the error message + Object.defineProperty(err, 'message', { + enumerable: true, + configurable: true, + value: msg, + writable: true + }) + + // redefine the error name + Object.defineProperty(err, 'name', { + enumerable: false, + configurable: true, + value: className, + writable: true + }) + + return err + } + + inherits(ClientError, HttpError) + nameFunc(ClientError, className) + + ClientError.prototype.status = code + ClientError.prototype.statusCode = code + ClientError.prototype.expose = true + + return ClientError +} + +/** + * Create function to test is a value is a HttpError. + * @private + */ + +function createIsHttpErrorFunction (HttpError) { + return function isHttpError (val) { + if (!val || typeof val !== 'object') { + return false + } + + if (val instanceof HttpError) { + return true + } + + return val instanceof Error && + typeof val.expose === 'boolean' && + typeof val.statusCode === 'number' && val.status === val.statusCode + } +} + +/** + * Create a constructor for a server error. + * @private + */ + +function createServerErrorConstructor (HttpError, name, code) { + var className = toClassName(name) + + function ServerError (message) { + // create the error object + var msg = message != null ? message : statuses.message[code] + var err = new Error(msg) + + // capture a stack trace to the construction point + Error.captureStackTrace(err, ServerError) + + // adjust the [[Prototype]] + setPrototypeOf(err, ServerError.prototype) + + // redefine the error message + Object.defineProperty(err, 'message', { + enumerable: true, + configurable: true, + value: msg, + writable: true + }) + + // redefine the error name + Object.defineProperty(err, 'name', { + enumerable: false, + configurable: true, + value: className, + writable: true + }) + + return err + } + + inherits(ServerError, HttpError) + nameFunc(ServerError, className) + + ServerError.prototype.status = code + ServerError.prototype.statusCode = code + ServerError.prototype.expose = false + + return ServerError +} + +/** + * Set the name of a function, if possible. + * @private + */ + +function nameFunc (func, name) { + var desc = Object.getOwnPropertyDescriptor(func, 'name') + + if (desc && desc.configurable) { + desc.value = name + Object.defineProperty(func, 'name', desc) + } +} + +/** + * Populate the exports object with constructors for every error class. + * @private + */ + +function populateConstructorExports (exports, codes, HttpError) { + codes.forEach(function forEachCode (code) { + var CodeError + var name = toIdentifier(statuses.message[code]) + + switch (codeClass(code)) { + case 400: + CodeError = createClientErrorConstructor(HttpError, name, code) + break + case 500: + CodeError = createServerErrorConstructor(HttpError, name, code) + break + } + + if (CodeError) { + // export the constructor + exports[code] = CodeError + exports[name] = CodeError + } + }) +} + +/** + * Get a class name from a name identifier. + * + * @param {string} name + * @returns {string} + * @private + */ + +function toClassName (name) { + return name.slice(-5) === 'Error' ? name : name + 'Error' +} diff --git a/node_modules/http-errors/node_modules/statuses/HISTORY.md b/node_modules/http-errors/node_modules/statuses/HISTORY.md new file mode 100644 index 0000000..dc549b8 --- /dev/null +++ b/node_modules/http-errors/node_modules/statuses/HISTORY.md @@ -0,0 +1,87 @@ +2.0.2 / 2025-06-06 +================== + + * Migrate to `String.prototype.slice()` + +2.0.1 / 2021-01-03 +================== + + * Fix returning values from `Object.prototype` + +2.0.0 / 2020-04-19 +================== + + * Drop support for Node.js 0.6 + * Fix messaging casing of `418 I'm a Teapot` + * Remove code 306 + * Remove `status[code]` exports; use `status.message[code]` + * Remove `status[msg]` exports; use `status.code[msg]` + * Rename `425 Unordered Collection` to standard `425 Too Early` + * Rename `STATUS_CODES` export to `message` + * Return status message for `statuses(code)` when given code + +1.5.0 / 2018-03-27 +================== + + * Add `103 Early Hints` + +1.4.0 / 2017-10-20 +================== + + * Add `STATUS_CODES` export + +1.3.1 / 2016-11-11 +================== + + * Fix return type in JSDoc + +1.3.0 / 2016-05-17 +================== + + * Add `421 Misdirected Request` + * perf: enable strict mode + +1.2.1 / 2015-02-01 +================== + + * Fix message for status 451 + - `451 Unavailable For Legal Reasons` + +1.2.0 / 2014-09-28 +================== + + * Add `208 Already Repored` + * Add `226 IM Used` + * Add `306 (Unused)` + * Add `415 Unable For Legal Reasons` + * Add `508 Loop Detected` + +1.1.1 / 2014-09-24 +================== + + * Add missing 308 to `codes.json` + +1.1.0 / 2014-09-21 +================== + + * Add `codes.json` for universal support + +1.0.4 / 2014-08-20 +================== + + * Package cleanup + +1.0.3 / 2014-06-08 +================== + + * Add 308 to `.redirect` category + +1.0.2 / 2014-03-13 +================== + + * Add `.retry` category + +1.0.1 / 2014-03-12 +================== + + * Initial release diff --git a/node_modules/http-errors/node_modules/statuses/LICENSE b/node_modules/http-errors/node_modules/statuses/LICENSE new file mode 100644 index 0000000..28a3161 --- /dev/null +++ b/node_modules/http-errors/node_modules/statuses/LICENSE @@ -0,0 +1,23 @@ + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +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/http-errors/node_modules/statuses/README.md b/node_modules/http-errors/node_modules/statuses/README.md new file mode 100644 index 0000000..89d542f --- /dev/null +++ b/node_modules/http-errors/node_modules/statuses/README.md @@ -0,0 +1,139 @@ +# statuses + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Build Status][ci-image]][ci-url] +[![Test Coverage][coveralls-image]][coveralls-url] +[![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] + +HTTP status utility for node. + +This module provides a list of status codes and messages sourced from +a few different projects: + + * The [IANA Status Code Registry](https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml) + * The [Node.js project](https://nodejs.org/) + * The [NGINX project](https://www.nginx.com/) + * The [Apache HTTP Server project](https://httpd.apache.org/) + +## Installation + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install statuses +``` + +## API + + + +```js +var status = require('statuses') +``` + +### status(code) + +Returns the status message string for a known HTTP status code. The code +may be a number or a string. An error is thrown for an unknown status code. + + + +```js +status(403) // => 'Forbidden' +status('403') // => 'Forbidden' +status(306) // throws +``` + +### status(msg) + +Returns the numeric status code for a known HTTP status message. The message +is case-insensitive. An error is thrown for an unknown status message. + + + +```js +status('forbidden') // => 403 +status('Forbidden') // => 403 +status('foo') // throws +``` + +### status.codes + +Returns an array of all the status codes as `Integer`s. + +### status.code[msg] + +Returns the numeric status code for a known status message (in lower-case), +otherwise `undefined`. + + + +```js +status['not found'] // => 404 +``` + +### status.empty[code] + +Returns `true` if a status code expects an empty body. + + + +```js +status.empty[200] // => undefined +status.empty[204] // => true +status.empty[304] // => true +``` + +### status.message[code] + +Returns the string message for a known numeric status code, otherwise +`undefined`. This object is the same format as the +[Node.js http module `http.STATUS_CODES`](https://nodejs.org/dist/latest/docs/api/http.html#http_http_status_codes). + + + +```js +status.message[404] // => 'Not Found' +``` + +### status.redirect[code] + +Returns `true` if a status code is a valid redirect status. + + + +```js +status.redirect[200] // => undefined +status.redirect[301] // => true +``` + +### status.retry[code] + +Returns `true` if you should retry the rest. + + + +```js +status.retry[501] // => undefined +status.retry[503] // => true +``` + +## License + +[MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/jshttp/statuses/master?label=ci +[ci-url]: https://github.com/jshttp/statuses/actions?query=workflow%3Aci +[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/statuses/master +[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master +[node-version-image]: https://badgen.net/npm/node/statuses +[node-version-url]: https://nodejs.org/en/download +[npm-downloads-image]: https://badgen.net/npm/dm/statuses +[npm-url]: https://npmjs.org/package/statuses +[npm-version-image]: https://badgen.net/npm/v/statuses +[ossf-scorecard-badge]: https://api.securityscorecards.dev/projects/github.com/jshttp/statuses/badge +[ossf-scorecard-visualizer]: https://kooltheba.github.io/openssf-scorecard-api-visualizer/#/projects/github.com/jshttp/statuses diff --git a/node_modules/http-errors/node_modules/statuses/codes.json b/node_modules/http-errors/node_modules/statuses/codes.json new file mode 100644 index 0000000..1333ed1 --- /dev/null +++ b/node_modules/http-errors/node_modules/statuses/codes.json @@ -0,0 +1,65 @@ +{ + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a Teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Too Early", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" +} diff --git a/node_modules/http-errors/node_modules/statuses/index.js b/node_modules/http-errors/node_modules/statuses/index.js new file mode 100644 index 0000000..ea351c5 --- /dev/null +++ b/node_modules/http-errors/node_modules/statuses/index.js @@ -0,0 +1,146 @@ +/*! + * statuses + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict' + +/** + * Module dependencies. + * @private + */ + +var codes = require('./codes.json') + +/** + * Module exports. + * @public + */ + +module.exports = status + +// status code to message map +status.message = codes + +// status message (lower-case) to code map +status.code = createMessageToStatusCodeMap(codes) + +// array of status codes +status.codes = createStatusCodeList(codes) + +// status codes for redirects +status.redirect = { + 300: true, + 301: true, + 302: true, + 303: true, + 305: true, + 307: true, + 308: true +} + +// status codes for empty bodies +status.empty = { + 204: true, + 205: true, + 304: true +} + +// status codes for when you should retry the request +status.retry = { + 502: true, + 503: true, + 504: true +} + +/** + * Create a map of message to status code. + * @private + */ + +function createMessageToStatusCodeMap (codes) { + var map = {} + + Object.keys(codes).forEach(function forEachCode (code) { + var message = codes[code] + var status = Number(code) + + // populate map + map[message.toLowerCase()] = status + }) + + return map +} + +/** + * Create a list of all status codes. + * @private + */ + +function createStatusCodeList (codes) { + return Object.keys(codes).map(function mapCode (code) { + return Number(code) + }) +} + +/** + * Get the status code for given message. + * @private + */ + +function getStatusCode (message) { + var msg = message.toLowerCase() + + if (!Object.prototype.hasOwnProperty.call(status.code, msg)) { + throw new Error('invalid status message: "' + message + '"') + } + + return status.code[msg] +} + +/** + * Get the status message for given code. + * @private + */ + +function getStatusMessage (code) { + if (!Object.prototype.hasOwnProperty.call(status.message, code)) { + throw new Error('invalid status code: ' + code) + } + + return status.message[code] +} + +/** + * Get the status code. + * + * Given a number, this will throw if it is not a known status + * code, otherwise the code will be returned. Given a string, + * the string will be parsed for a number and return the code + * if valid, otherwise will lookup the code assuming this is + * the status message. + * + * @param {string|number} code + * @returns {number} + * @public + */ + +function status (code) { + if (typeof code === 'number') { + return getStatusMessage(code) + } + + if (typeof code !== 'string') { + throw new TypeError('code must be a number or string') + } + + // '403' + var n = parseInt(code, 10) + if (!isNaN(n)) { + return getStatusMessage(n) + } + + return getStatusCode(code) +} diff --git a/node_modules/http-errors/node_modules/statuses/package.json b/node_modules/http-errors/node_modules/statuses/package.json new file mode 100644 index 0000000..b5d016e --- /dev/null +++ b/node_modules/http-errors/node_modules/statuses/package.json @@ -0,0 +1,49 @@ +{ + "name": "statuses", + "description": "HTTP status utility", + "version": "2.0.2", + "contributors": [ + "Douglas Christopher Wilson ", + "Jonathan Ong (http://jongleberry.com)" + ], + "repository": "jshttp/statuses", + "license": "MIT", + "keywords": [ + "http", + "status", + "code" + ], + "files": [ + "HISTORY.md", + "index.js", + "codes.json", + "LICENSE" + ], + "devDependencies": { + "csv-parse": "4.16.3", + "eslint": "7.19.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-markdown": "1.0.2", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.3.1", + "eslint-plugin-standard": "4.1.0", + "mocha": "8.4.0", + "nyc": "15.1.0", + "raw-body": "2.5.2", + "stream-to-array": "2.3.0" + }, + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "build": "node scripts/build.js", + "fetch": "node scripts/fetch-apache.js && node scripts/fetch-iana.js && node scripts/fetch-nginx.js && node scripts/fetch-node.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "update": "npm run fetch && npm run build", + "version": "node scripts/version-history.js && git add HISTORY.md" + } +} diff --git a/node_modules/http-errors/package.json b/node_modules/http-errors/package.json new file mode 100644 index 0000000..4b46d62 --- /dev/null +++ b/node_modules/http-errors/package.json @@ -0,0 +1,54 @@ +{ + "name": "http-errors", + "description": "Create HTTP error objects", + "version": "2.0.1", + "author": "Jonathan Ong (http://jongleberry.com)", + "contributors": [ + "Alan Plum ", + "Douglas Christopher Wilson " + ], + "license": "MIT", + "repository": "jshttp/http-errors", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + }, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "devDependencies": { + "eslint": "7.32.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-markdown": "2.2.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "5.2.0", + "eslint-plugin-standard": "4.1.0", + "mocha": "9.1.3", + "nyc": "15.1.0" + }, + "engines": { + "node": ">= 0.8" + }, + "scripts": { + "lint": "eslint . && node ./scripts/lint-readme-list.js", + "test": "mocha --reporter spec", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node scripts/version-history.js && git add HISTORY.md" + }, + "keywords": [ + "http", + "error" + ], + "files": [ + "index.js", + "HISTORY.md", + "LICENSE", + "README.md" + ] +} diff --git a/node_modules/image-size/LICENSE b/node_modules/image-size/LICENSE new file mode 100644 index 0000000..8bdffcf --- /dev/null +++ b/node_modules/image-size/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright © 2013-Present Aditya Yadav, http://netroy.in + +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/image-size/Readme.md b/node_modules/image-size/Readme.md new file mode 100644 index 0000000..b02c008 --- /dev/null +++ b/node_modules/image-size/Readme.md @@ -0,0 +1,184 @@ +# image-size + +[![Build Status](https://circleci.com/gh/image-size/image-size.svg?style=shield)](https://circleci.com/gh/image-size/image-size) +[![Package Version](https://img.shields.io/npm/v/image-size.svg)](https://www.npmjs.com/package/image-size) +[![Downloads](https://img.shields.io/npm/dm/image-size.svg)](http://npm-stat.com/charts.html?package=image-size&author=&from=&to=) + +A [Node](https://nodejs.org/en/) module to get dimensions of any image file + +## Supported formats + +- BMP +- CUR +- DDS +- GIF +- HEIC (HEIF, AVCI, AVIF) +- ICNS +- ICO +- J2C +- JPEG-2000 (JP2) +- JPEG +- JPEG-XL +- KTX (1 and 2) +- PNG +- PNM (PAM, PBM, PFM, PGM, PPM) +- PSD +- SVG +- TGA +- TIFF +- WebP + +## Programmatic Usage + +```shell +npm install image-size --save +``` + +or + +```shell +yarn add image-size +``` + +### Synchronous + +```javascript +const sizeOf = require("image-size") +const dimensions = sizeOf("images/funny-cats.png") +console.log(dimensions.width, dimensions.height) +``` + +### Asynchronous + +```javascript +const sizeOf = require("image-size") +sizeOf("images/funny-cats.png", function (err, dimensions) { + console.log(dimensions.width, dimensions.height) +}) +``` + +NOTE: The asynchronous version doesn't work if the input is a Buffer. Use synchronous version instead. + +Also, the asynchronous functions have a default concurrency limit of **100** +To change this limit, you can call the `setConcurrency` function like this: + +```javascript +const sizeOf = require("image-size") +sizeOf.setConcurrency(123456) +``` + +### Using promises (nodejs 10.x+) + +```javascript +const { promisify } = require("util") +const sizeOf = promisify(require("image-size")) +sizeOf("images/funny-cats.png") + .then((dimensions) => { + console.log(dimensions.width, dimensions.height) + }) + .catch((err) => console.error(err)) +``` + +### Async/Await (Typescript & ES7) + +```javascript +const { promisify } = require("util") +const sizeOf = promisify(require("image-size"))(async () => { + try { + const dimensions = await sizeOf("images/funny-cats.png") + console.log(dimensions.width, dimensions.height) + } catch (err) { + console.error(err) + } +})().then((c) => console.log(c)) +``` + +### Multi-size + +If the target file is an icon (.ico) or a cursor (.cur), the `width` and `height` will be the ones of the first found image. + +An additional `images` array is available and returns the dimensions of all the available images + +```javascript +const sizeOf = require("image-size") +const images = sizeOf("images/multi-size.ico").images +for (const dimensions of images) { + console.log(dimensions.width, dimensions.height) +} +``` + +### Using a URL + +```javascript +const url = require("url") +const http = require("http") + +const sizeOf = require("image-size") + +const imgUrl = "http://my-amazing-website.com/image.jpeg" +const options = url.parse(imgUrl) + +http.get(options, function (response) { + const chunks = [] + response + .on("data", function (chunk) { + chunks.push(chunk) + }) + .on("end", function () { + const buffer = Buffer.concat(chunks) + console.log(sizeOf(buffer)) + }) +}) +``` + +You can optionally check the buffer lengths & stop downloading the image after a few kilobytes. +**You don't need to download the entire image** + +### Disabling certain image types + +```javascript +const imageSize = require("image-size") +imageSize.disableTypes(["tiff", "ico"]) +``` + +### Disabling all file-system reads + +```javascript +const imageSize = require("image-size") +imageSize.disableFS(true) +``` + +### JPEG image orientation + +If the orientation is present in the JPEG EXIF metadata, it will be returned by the function. The orientation value is a [number between 1 and 8](https://exiftool.org/TagNames/EXIF.html#:~:text=0x0112,8%20=%20Rotate%20270%20CW) representing a type of orientation. + +```javascript +const sizeOf = require("image-size") +const dimensions = sizeOf("images/photo.jpeg") +console.log(dimensions.orientation) +``` + +## Command-Line Usage (CLI) + +```shell +npm install image-size --global +``` + +or + +```shell +yarn global add image-size +``` + +followed by + +```shell +image-size image1 [image2] [image3] ... +``` + +## Credits + +not a direct port, but an attempt to have something like +[dabble's imagesize](https://github.com/dabble/imagesize/blob/master/lib/image_size.rb) as a node module. + +## [Contributors](Contributors.md) diff --git a/node_modules/image-size/bin/image-size.js b/node_modules/image-size/bin/image-size.js new file mode 100755 index 0000000..f8ba676 --- /dev/null +++ b/node_modules/image-size/bin/image-size.js @@ -0,0 +1,53 @@ +#!/usr/bin/env node +/* eslint-disable @typescript-eslint/no-var-requires */ +'use strict' + +const fs = require('fs') +const path = require('path') +const { imageSize } = require('..') + +const files = process.argv.slice(2) + +if (!files.length) { + console.error('Usage: image-size image1 [image2] [image3] ...') + process.exit(-1) +} + +const red = ['\x1B[31m', '\x1B[39m'] +// const bold = ['\x1B[1m', '\x1B[22m'] +const grey = ['\x1B[90m', '\x1B[39m'] +const green = ['\x1B[32m', '\x1B[39m'] + +function colorize(text, color) { + return color[0] + text + color[1] +} + +files.forEach(function (image) { + try { + if (fs.existsSync(path.resolve(image))) { + const greyX = colorize('x', grey) + const greyImage = colorize(image, grey) + const size = imageSize(image) + const sizes = size.images || [size] + sizes.forEach((size) => { + let greyType = '' + if (size.type) { + greyType = colorize(' (' + size.type + ')', grey) + } + console.info( + colorize(size.width, green) + + greyX + + colorize(size.height, green) + + ' - ' + + greyImage + + greyType, + ) + }) + } else { + console.error("file doesn't exist - ", image) + } + } catch (e) { + // console.error(e.stack) + console.error(colorize(e.message, red), '-', image) + } +}) diff --git a/node_modules/image-size/dist/detector.d.ts b/node_modules/image-size/dist/detector.d.ts new file mode 100644 index 0000000..d16665d --- /dev/null +++ b/node_modules/image-size/dist/detector.d.ts @@ -0,0 +1,2 @@ +import type { imageType } from './types/index'; +export declare function detector(input: Uint8Array): imageType | undefined; diff --git a/node_modules/image-size/dist/detector.js b/node_modules/image-size/dist/detector.js new file mode 100644 index 0000000..6b9ef6f --- /dev/null +++ b/node_modules/image-size/dist/detector.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.detector = void 0; +const index_1 = require("./types/index"); +const keys = Object.keys(index_1.typeHandlers); +// This map helps avoid validating for every single image type +const firstBytes = { + 0x38: 'psd', + 0x42: 'bmp', + 0x44: 'dds', + 0x47: 'gif', + 0x49: 'tiff', + 0x4d: 'tiff', + 0x52: 'webp', + 0x69: 'icns', + 0x89: 'png', + 0xff: 'jpg', +}; +function detector(input) { + const byte = input[0]; + if (byte in firstBytes) { + const type = firstBytes[byte]; + if (type && index_1.typeHandlers[type].validate(input)) { + return type; + } + } + const finder = (key) => index_1.typeHandlers[key].validate(input); + return keys.find(finder); +} +exports.detector = detector; diff --git a/node_modules/image-size/dist/index.d.ts b/node_modules/image-size/dist/index.d.ts new file mode 100644 index 0000000..091ae25 --- /dev/null +++ b/node_modules/image-size/dist/index.d.ts @@ -0,0 +1,10 @@ +import type { imageType } from './types/index'; +import type { ISizeCalculationResult } from './types/interface'; +type CallbackFn = (e: Error | null, r?: ISizeCalculationResult) => void; +export default imageSize; +export declare function imageSize(input: Uint8Array | string): ISizeCalculationResult; +export declare function imageSize(input: string, callback: CallbackFn): void; +export declare const disableFS: (v: boolean) => void; +export declare const disableTypes: (types: imageType[]) => void; +export declare const setConcurrency: (c: number) => void; +export declare const types: string[]; diff --git a/node_modules/image-size/dist/index.js b/node_modules/image-size/dist/index.js new file mode 100644 index 0000000..6b0ca64 --- /dev/null +++ b/node_modules/image-size/dist/index.js @@ -0,0 +1,129 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.types = exports.setConcurrency = exports.disableTypes = exports.disableFS = exports.imageSize = void 0; +const fs = require("fs"); +const path = require("path"); +const queue_1 = require("queue"); +const index_1 = require("./types/index"); +const detector_1 = require("./detector"); +// Maximum input size, with a default of 512 kilobytes. +// TO-DO: make this adaptive based on the initial signature of the image +const MaxInputSize = 512 * 1024; +// This queue is for async `fs` operations, to avoid reaching file-descriptor limits +const queue = new queue_1.default({ concurrency: 100, autostart: true }); +const globalOptions = { + disabledFS: false, + disabledTypes: [], +}; +/** + * Return size information based on an Uint8Array + * + * @param {Uint8Array} input + * @param {String} filepath + * @returns {Object} + */ +function lookup(input, filepath) { + // detect the file type.. don't rely on the extension + const type = (0, detector_1.detector)(input); + if (typeof type !== 'undefined') { + if (globalOptions.disabledTypes.indexOf(type) > -1) { + throw new TypeError('disabled file type: ' + type); + } + // find an appropriate handler for this file type + if (type in index_1.typeHandlers) { + const size = index_1.typeHandlers[type].calculate(input, filepath); + if (size !== undefined) { + size.type = size.type ?? type; + return size; + } + } + } + // throw up, if we don't understand the file + throw new TypeError('unsupported file type: ' + type + ' (file: ' + filepath + ')'); +} +/** + * Reads a file into an Uint8Array. + * @param {String} filepath + * @returns {Promise} + */ +async function readFileAsync(filepath) { + const handle = await fs.promises.open(filepath, 'r'); + try { + const { size } = await handle.stat(); + if (size <= 0) { + throw new Error('Empty file'); + } + const inputSize = Math.min(size, MaxInputSize); + const input = new Uint8Array(inputSize); + await handle.read(input, 0, inputSize, 0); + return input; + } + finally { + await handle.close(); + } +} +/** + * Synchronously reads a file into an Uint8Array, blocking the nodejs process. + * + * @param {String} filepath + * @returns {Uint8Array} + */ +function readFileSync(filepath) { + // read from the file, synchronously + const descriptor = fs.openSync(filepath, 'r'); + try { + const { size } = fs.fstatSync(descriptor); + if (size <= 0) { + throw new Error('Empty file'); + } + const inputSize = Math.min(size, MaxInputSize); + const input = new Uint8Array(inputSize); + fs.readSync(descriptor, input, 0, inputSize, 0); + return input; + } + finally { + fs.closeSync(descriptor); + } +} +// eslint-disable-next-line @typescript-eslint/no-use-before-define +module.exports = exports = imageSize; // backwards compatibility +exports.default = imageSize; +/** + * @param {Uint8Array|string} input - Uint8Array or relative/absolute path of the image file + * @param {Function=} [callback] - optional function for async detection + */ +function imageSize(input, callback) { + // Handle Uint8Array input + if (input instanceof Uint8Array) { + return lookup(input); + } + // input should be a string at this point + if (typeof input !== 'string' || globalOptions.disabledFS) { + throw new TypeError('invalid invocation. input should be a Uint8Array'); + } + // resolve the file path + const filepath = path.resolve(input); + if (typeof callback === 'function') { + queue.push(() => readFileAsync(filepath) + .then((input) => process.nextTick(callback, null, lookup(input, filepath))) + .catch(callback)); + } + else { + const input = readFileSync(filepath); + return lookup(input, filepath); + } +} +exports.imageSize = imageSize; +const disableFS = (v) => { + globalOptions.disabledFS = v; +}; +exports.disableFS = disableFS; +const disableTypes = (types) => { + globalOptions.disabledTypes = types; +}; +exports.disableTypes = disableTypes; +const setConcurrency = (c) => { + queue.concurrency = c; +}; +exports.setConcurrency = setConcurrency; +exports.types = Object.keys(index_1.typeHandlers); diff --git a/node_modules/image-size/dist/types/bmp.d.ts b/node_modules/image-size/dist/types/bmp.d.ts new file mode 100644 index 0000000..be1d22e --- /dev/null +++ b/node_modules/image-size/dist/types/bmp.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const BMP: IImage; diff --git a/node_modules/image-size/dist/types/bmp.js b/node_modules/image-size/dist/types/bmp.js new file mode 100644 index 0000000..6f53b50 --- /dev/null +++ b/node_modules/image-size/dist/types/bmp.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BMP = void 0; +const utils_1 = require("./utils"); +exports.BMP = { + validate: (input) => (0, utils_1.toUTF8String)(input, 0, 2) === 'BM', + calculate: (input) => ({ + height: Math.abs((0, utils_1.readInt32LE)(input, 22)), + width: (0, utils_1.readUInt32LE)(input, 18), + }), +}; diff --git a/node_modules/image-size/dist/types/cur.d.ts b/node_modules/image-size/dist/types/cur.d.ts new file mode 100644 index 0000000..fc0dada --- /dev/null +++ b/node_modules/image-size/dist/types/cur.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const CUR: IImage; diff --git a/node_modules/image-size/dist/types/cur.js b/node_modules/image-size/dist/types/cur.js new file mode 100644 index 0000000..7bcc512 --- /dev/null +++ b/node_modules/image-size/dist/types/cur.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CUR = void 0; +const ico_1 = require("./ico"); +const utils_1 = require("./utils"); +const TYPE_CURSOR = 2; +exports.CUR = { + validate(input) { + const reserved = (0, utils_1.readUInt16LE)(input, 0); + const imageCount = (0, utils_1.readUInt16LE)(input, 4); + if (reserved !== 0 || imageCount === 0) + return false; + const imageType = (0, utils_1.readUInt16LE)(input, 2); + return imageType === TYPE_CURSOR; + }, + calculate: (input) => ico_1.ICO.calculate(input), +}; diff --git a/node_modules/image-size/dist/types/dds.d.ts b/node_modules/image-size/dist/types/dds.d.ts new file mode 100644 index 0000000..46e9246 --- /dev/null +++ b/node_modules/image-size/dist/types/dds.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const DDS: IImage; diff --git a/node_modules/image-size/dist/types/dds.js b/node_modules/image-size/dist/types/dds.js new file mode 100644 index 0000000..67f0b79 --- /dev/null +++ b/node_modules/image-size/dist/types/dds.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DDS = void 0; +const utils_1 = require("./utils"); +exports.DDS = { + validate: (input) => (0, utils_1.readUInt32LE)(input, 0) === 0x20534444, + calculate: (input) => ({ + height: (0, utils_1.readUInt32LE)(input, 12), + width: (0, utils_1.readUInt32LE)(input, 16), + }), +}; diff --git a/node_modules/image-size/dist/types/gif.d.ts b/node_modules/image-size/dist/types/gif.d.ts new file mode 100644 index 0000000..6844598 --- /dev/null +++ b/node_modules/image-size/dist/types/gif.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const GIF: IImage; diff --git a/node_modules/image-size/dist/types/gif.js b/node_modules/image-size/dist/types/gif.js new file mode 100644 index 0000000..d826c5c --- /dev/null +++ b/node_modules/image-size/dist/types/gif.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GIF = void 0; +const utils_1 = require("./utils"); +const gifRegexp = /^GIF8[79]a/; +exports.GIF = { + validate: (input) => gifRegexp.test((0, utils_1.toUTF8String)(input, 0, 6)), + calculate: (input) => ({ + height: (0, utils_1.readUInt16LE)(input, 8), + width: (0, utils_1.readUInt16LE)(input, 6), + }), +}; diff --git a/node_modules/image-size/dist/types/heif.d.ts b/node_modules/image-size/dist/types/heif.d.ts new file mode 100644 index 0000000..3d88937 --- /dev/null +++ b/node_modules/image-size/dist/types/heif.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const HEIF: IImage; diff --git a/node_modules/image-size/dist/types/heif.js b/node_modules/image-size/dist/types/heif.js new file mode 100644 index 0000000..7997d3f --- /dev/null +++ b/node_modules/image-size/dist/types/heif.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HEIF = void 0; +const utils_1 = require("./utils"); +const brandMap = { + avif: 'avif', + mif1: 'heif', + msf1: 'heif', // heif-sequence + heic: 'heic', + heix: 'heic', + hevc: 'heic', // heic-sequence + hevx: 'heic', // heic-sequence +}; +exports.HEIF = { + validate(input) { + const boxType = (0, utils_1.toUTF8String)(input, 4, 8); + if (boxType !== 'ftyp') + return false; + const ftypBox = (0, utils_1.findBox)(input, 'ftyp', 0); + if (!ftypBox) + return false; + const brand = (0, utils_1.toUTF8String)(input, ftypBox.offset + 8, ftypBox.offset + 12); + return brand in brandMap; + }, + calculate(input) { + // Based on https://nokiatech.github.io/heif/technical.html + const metaBox = (0, utils_1.findBox)(input, 'meta', 0); + const iprpBox = metaBox && (0, utils_1.findBox)(input, 'iprp', metaBox.offset + 12); + const ipcoBox = iprpBox && (0, utils_1.findBox)(input, 'ipco', iprpBox.offset + 8); + const ispeBox = ipcoBox && (0, utils_1.findBox)(input, 'ispe', ipcoBox.offset + 8); + if (ispeBox) { + return { + height: (0, utils_1.readUInt32BE)(input, ispeBox.offset + 16), + width: (0, utils_1.readUInt32BE)(input, ispeBox.offset + 12), + type: (0, utils_1.toUTF8String)(input, 8, 12), + }; + } + throw new TypeError('Invalid HEIF, no size found'); + }, +}; diff --git a/node_modules/image-size/dist/types/icns.d.ts b/node_modules/image-size/dist/types/icns.d.ts new file mode 100644 index 0000000..40701d4 --- /dev/null +++ b/node_modules/image-size/dist/types/icns.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const ICNS: IImage; diff --git a/node_modules/image-size/dist/types/icns.js b/node_modules/image-size/dist/types/icns.js new file mode 100644 index 0000000..f2bfafe --- /dev/null +++ b/node_modules/image-size/dist/types/icns.js @@ -0,0 +1,101 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ICNS = void 0; +const utils_1 = require("./utils"); +/** + * ICNS Header + * + * | Offset | Size | Purpose | + * | 0 | 4 | Magic literal, must be "icns" (0x69, 0x63, 0x6e, 0x73) | + * | 4 | 4 | Length of file, in bytes, msb first. | + * + */ +const SIZE_HEADER = 4 + 4; // 8 +const FILE_LENGTH_OFFSET = 4; // MSB => BIG ENDIAN +/** + * Image Entry + * + * | Offset | Size | Purpose | + * | 0 | 4 | Icon type, see OSType below. | + * | 4 | 4 | Length of data, in bytes (including type and length), msb first. | + * | 8 | n | Icon data | + */ +const ENTRY_LENGTH_OFFSET = 4; // MSB => BIG ENDIAN +const ICON_TYPE_SIZE = { + ICON: 32, + 'ICN#': 32, + // m => 16 x 16 + 'icm#': 16, + icm4: 16, + icm8: 16, + // s => 16 x 16 + 'ics#': 16, + ics4: 16, + ics8: 16, + is32: 16, + s8mk: 16, + icp4: 16, + // l => 32 x 32 + icl4: 32, + icl8: 32, + il32: 32, + l8mk: 32, + icp5: 32, + ic11: 32, + // h => 48 x 48 + ich4: 48, + ich8: 48, + ih32: 48, + h8mk: 48, + // . => 64 x 64 + icp6: 64, + ic12: 32, + // t => 128 x 128 + it32: 128, + t8mk: 128, + ic07: 128, + // . => 256 x 256 + ic08: 256, + ic13: 256, + // . => 512 x 512 + ic09: 512, + ic14: 512, + // . => 1024 x 1024 + ic10: 1024, +}; +function readImageHeader(input, imageOffset) { + const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET; + return [ + (0, utils_1.toUTF8String)(input, imageOffset, imageLengthOffset), + (0, utils_1.readUInt32BE)(input, imageLengthOffset), + ]; +} +function getImageSize(type) { + const size = ICON_TYPE_SIZE[type]; + return { width: size, height: size, type }; +} +exports.ICNS = { + validate: (input) => (0, utils_1.toUTF8String)(input, 0, 4) === 'icns', + calculate(input) { + const inputLength = input.length; + const fileLength = (0, utils_1.readUInt32BE)(input, FILE_LENGTH_OFFSET); + let imageOffset = SIZE_HEADER; + let imageHeader = readImageHeader(input, imageOffset); + let imageSize = getImageSize(imageHeader[0]); + imageOffset += imageHeader[1]; + if (imageOffset === fileLength) + return imageSize; + const result = { + height: imageSize.height, + images: [imageSize], + width: imageSize.width, + }; + while (imageOffset < fileLength && imageOffset < inputLength) { + imageHeader = readImageHeader(input, imageOffset); + imageSize = getImageSize(imageHeader[0]); + imageOffset += imageHeader[1]; + result.images.push(imageSize); + } + return result; + }, +}; diff --git a/node_modules/image-size/dist/types/ico.d.ts b/node_modules/image-size/dist/types/ico.d.ts new file mode 100644 index 0000000..a378b82 --- /dev/null +++ b/node_modules/image-size/dist/types/ico.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const ICO: IImage; diff --git a/node_modules/image-size/dist/types/ico.js b/node_modules/image-size/dist/types/ico.js new file mode 100644 index 0000000..0c630a0 --- /dev/null +++ b/node_modules/image-size/dist/types/ico.js @@ -0,0 +1,68 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ICO = void 0; +const utils_1 = require("./utils"); +const TYPE_ICON = 1; +/** + * ICON Header + * + * | Offset | Size | Purpose | + * | 0 | 2 | Reserved. Must always be 0. | + * | 2 | 2 | Image type: 1 for icon (.ICO) image, 2 for cursor (.CUR) image. Other values are invalid. | + * | 4 | 2 | Number of images in the file. | + * + */ +const SIZE_HEADER = 2 + 2 + 2; // 6 +/** + * Image Entry + * + * | Offset | Size | Purpose | + * | 0 | 1 | Image width in pixels. Can be any number between 0 and 255. Value 0 means width is 256 pixels. | + * | 1 | 1 | Image height in pixels. Can be any number between 0 and 255. Value 0 means height is 256 pixels. | + * | 2 | 1 | Number of colors in the color palette. Should be 0 if the image does not use a color palette. | + * | 3 | 1 | Reserved. Should be 0. | + * | 4 | 2 | ICO format: Color planes. Should be 0 or 1. | + * | | | CUR format: The horizontal coordinates of the hotspot in number of pixels from the left. | + * | 6 | 2 | ICO format: Bits per pixel. | + * | | | CUR format: The vertical coordinates of the hotspot in number of pixels from the top. | + * | 8 | 4 | The size of the image's data in bytes | + * | 12 | 4 | The offset of BMP or PNG data from the beginning of the ICO/CUR file | + * + */ +const SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4; // 16 +function getSizeFromOffset(input, offset) { + const value = input[offset]; + return value === 0 ? 256 : value; +} +function getImageSize(input, imageIndex) { + const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY; + return { + height: getSizeFromOffset(input, offset + 1), + width: getSizeFromOffset(input, offset), + }; +} +exports.ICO = { + validate(input) { + const reserved = (0, utils_1.readUInt16LE)(input, 0); + const imageCount = (0, utils_1.readUInt16LE)(input, 4); + if (reserved !== 0 || imageCount === 0) + return false; + const imageType = (0, utils_1.readUInt16LE)(input, 2); + return imageType === TYPE_ICON; + }, + calculate(input) { + const nbImages = (0, utils_1.readUInt16LE)(input, 4); + const imageSize = getImageSize(input, 0); + if (nbImages === 1) + return imageSize; + const imgs = [imageSize]; + for (let imageIndex = 1; imageIndex < nbImages; imageIndex += 1) { + imgs.push(getImageSize(input, imageIndex)); + } + return { + height: imageSize.height, + images: imgs, + width: imageSize.width, + }; + }, +}; diff --git a/node_modules/image-size/dist/types/index.d.ts b/node_modules/image-size/dist/types/index.d.ts new file mode 100644 index 0000000..e338d1f --- /dev/null +++ b/node_modules/image-size/dist/types/index.d.ts @@ -0,0 +1,23 @@ +export declare const typeHandlers: { + bmp: import("./interface").IImage; + cur: import("./interface").IImage; + dds: import("./interface").IImage; + gif: import("./interface").IImage; + heif: import("./interface").IImage; + icns: import("./interface").IImage; + ico: import("./interface").IImage; + j2c: import("./interface").IImage; + jp2: import("./interface").IImage; + jpg: import("./interface").IImage; + jxl: import("./interface").IImage; + 'jxl-stream': import("./interface").IImage; + ktx: import("./interface").IImage; + png: import("./interface").IImage; + pnm: import("./interface").IImage; + psd: import("./interface").IImage; + svg: import("./interface").IImage; + tga: import("./interface").IImage; + tiff: import("./interface").IImage; + webp: import("./interface").IImage; +}; +export type imageType = keyof typeof typeHandlers; diff --git a/node_modules/image-size/dist/types/index.js b/node_modules/image-size/dist/types/index.js new file mode 100644 index 0000000..f7cce83 --- /dev/null +++ b/node_modules/image-size/dist/types/index.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.typeHandlers = void 0; +// load all available handlers explicitly for browserify support +const bmp_1 = require("./bmp"); +const cur_1 = require("./cur"); +const dds_1 = require("./dds"); +const gif_1 = require("./gif"); +const heif_1 = require("./heif"); +const icns_1 = require("./icns"); +const ico_1 = require("./ico"); +const j2c_1 = require("./j2c"); +const jp2_1 = require("./jp2"); +const jpg_1 = require("./jpg"); +const jxl_1 = require("./jxl"); +const jxl_stream_1 = require("./jxl-stream"); +const ktx_1 = require("./ktx"); +const png_1 = require("./png"); +const pnm_1 = require("./pnm"); +const psd_1 = require("./psd"); +const svg_1 = require("./svg"); +const tga_1 = require("./tga"); +const tiff_1 = require("./tiff"); +const webp_1 = require("./webp"); +exports.typeHandlers = { + bmp: bmp_1.BMP, + cur: cur_1.CUR, + dds: dds_1.DDS, + gif: gif_1.GIF, + heif: heif_1.HEIF, + icns: icns_1.ICNS, + ico: ico_1.ICO, + j2c: j2c_1.J2C, + jp2: jp2_1.JP2, + jpg: jpg_1.JPG, + jxl: jxl_1.JXL, + 'jxl-stream': jxl_stream_1.JXLStream, + ktx: ktx_1.KTX, + png: png_1.PNG, + pnm: pnm_1.PNM, + psd: psd_1.PSD, + svg: svg_1.SVG, + tga: tga_1.TGA, + tiff: tiff_1.TIFF, + webp: webp_1.WEBP, +}; diff --git a/node_modules/image-size/dist/types/interface.d.ts b/node_modules/image-size/dist/types/interface.d.ts new file mode 100644 index 0000000..96dc89b --- /dev/null +++ b/node_modules/image-size/dist/types/interface.d.ts @@ -0,0 +1,13 @@ +export interface ISize { + width: number | undefined; + height: number | undefined; + orientation?: number; + type?: string; +} +export type ISizeCalculationResult = { + images?: ISize[]; +} & ISize; +export interface IImage { + validate: (input: Uint8Array) => boolean; + calculate: (input: Uint8Array, filepath?: string) => ISizeCalculationResult; +} diff --git a/node_modules/image-size/dist/types/interface.js b/node_modules/image-size/dist/types/interface.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/node_modules/image-size/dist/types/interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node_modules/image-size/dist/types/j2c.d.ts b/node_modules/image-size/dist/types/j2c.d.ts new file mode 100644 index 0000000..f745c7b --- /dev/null +++ b/node_modules/image-size/dist/types/j2c.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const J2C: IImage; diff --git a/node_modules/image-size/dist/types/j2c.js b/node_modules/image-size/dist/types/j2c.js new file mode 100644 index 0000000..fba00fc --- /dev/null +++ b/node_modules/image-size/dist/types/j2c.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.J2C = void 0; +const utils_1 = require("./utils"); +exports.J2C = { + // TODO: this doesn't seem right. SIZ marker doesn't have to be right after the SOC + validate: (input) => (0, utils_1.readUInt32BE)(input, 0) === 0xff4fff51, + calculate: (input) => ({ + height: (0, utils_1.readUInt32BE)(input, 12), + width: (0, utils_1.readUInt32BE)(input, 8), + }), +}; diff --git a/node_modules/image-size/dist/types/jp2.d.ts b/node_modules/image-size/dist/types/jp2.d.ts new file mode 100644 index 0000000..ce53bb3 --- /dev/null +++ b/node_modules/image-size/dist/types/jp2.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const JP2: IImage; diff --git a/node_modules/image-size/dist/types/jp2.js b/node_modules/image-size/dist/types/jp2.js new file mode 100644 index 0000000..8af3f77 --- /dev/null +++ b/node_modules/image-size/dist/types/jp2.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JP2 = void 0; +const utils_1 = require("./utils"); +exports.JP2 = { + validate(input) { + const boxType = (0, utils_1.toUTF8String)(input, 4, 8); + if (boxType !== 'jP ') + return false; + const ftypBox = (0, utils_1.findBox)(input, 'ftyp', 0); + if (!ftypBox) + return false; + const brand = (0, utils_1.toUTF8String)(input, ftypBox.offset + 8, ftypBox.offset + 12); + return brand === 'jp2 '; + }, + calculate(input) { + const jp2hBox = (0, utils_1.findBox)(input, 'jp2h', 0); + const ihdrBox = jp2hBox && (0, utils_1.findBox)(input, 'ihdr', jp2hBox.offset + 8); + if (ihdrBox) { + return { + height: (0, utils_1.readUInt32BE)(input, ihdrBox.offset + 8), + width: (0, utils_1.readUInt32BE)(input, ihdrBox.offset + 12), + }; + } + throw new TypeError('Unsupported JPEG 2000 format'); + }, +}; diff --git a/node_modules/image-size/dist/types/jpg.d.ts b/node_modules/image-size/dist/types/jpg.d.ts new file mode 100644 index 0000000..68fc201 --- /dev/null +++ b/node_modules/image-size/dist/types/jpg.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const JPG: IImage; diff --git a/node_modules/image-size/dist/types/jpg.js b/node_modules/image-size/dist/types/jpg.js new file mode 100644 index 0000000..e6f0ece --- /dev/null +++ b/node_modules/image-size/dist/types/jpg.js @@ -0,0 +1,123 @@ +"use strict"; +// NOTE: we only support baseline and progressive JPGs here +// due to the structure of the loader class, we only get a buffer +// with a maximum size of 4096 bytes. so if the SOF marker is outside +// if this range we can't detect the file size correctly. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JPG = void 0; +const utils_1 = require("./utils"); +const EXIF_MARKER = '45786966'; +const APP1_DATA_SIZE_BYTES = 2; +const EXIF_HEADER_BYTES = 6; +const TIFF_BYTE_ALIGN_BYTES = 2; +const BIG_ENDIAN_BYTE_ALIGN = '4d4d'; +const LITTLE_ENDIAN_BYTE_ALIGN = '4949'; +// Each entry is exactly 12 bytes +const IDF_ENTRY_BYTES = 12; +const NUM_DIRECTORY_ENTRIES_BYTES = 2; +function isEXIF(input) { + return (0, utils_1.toHexString)(input, 2, 6) === EXIF_MARKER; +} +function extractSize(input, index) { + return { + height: (0, utils_1.readUInt16BE)(input, index), + width: (0, utils_1.readUInt16BE)(input, index + 2), + }; +} +function extractOrientation(exifBlock, isBigEndian) { + // TODO: assert that this contains 0x002A + // let STATIC_MOTOROLA_TIFF_HEADER_BYTES = 2 + // let TIFF_IMAGE_FILE_DIRECTORY_BYTES = 4 + // TODO: derive from TIFF_IMAGE_FILE_DIRECTORY_BYTES + const idfOffset = 8; + // IDF osset works from right after the header bytes + // (so the offset includes the tiff byte align) + const offset = EXIF_HEADER_BYTES + idfOffset; + const idfDirectoryEntries = (0, utils_1.readUInt)(exifBlock, 16, offset, isBigEndian); + for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) { + const start = offset + + NUM_DIRECTORY_ENTRIES_BYTES + + directoryEntryNumber * IDF_ENTRY_BYTES; + const end = start + IDF_ENTRY_BYTES; + // Skip on corrupt EXIF blocks + if (start > exifBlock.length) { + return; + } + const block = exifBlock.slice(start, end); + const tagNumber = (0, utils_1.readUInt)(block, 16, 0, isBigEndian); + // 0x0112 (decimal: 274) is the `orientation` tag ID + if (tagNumber === 274) { + const dataFormat = (0, utils_1.readUInt)(block, 16, 2, isBigEndian); + if (dataFormat !== 3) { + return; + } + // unsinged int has 2 bytes per component + // if there would more than 4 bytes in total it's a pointer + const numberOfComponents = (0, utils_1.readUInt)(block, 32, 4, isBigEndian); + if (numberOfComponents !== 1) { + return; + } + return (0, utils_1.readUInt)(block, 16, 8, isBigEndian); + } + } +} +function validateExifBlock(input, index) { + // Skip APP1 Data Size + const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index); + // Consider byte alignment + const byteAlign = (0, utils_1.toHexString)(exifBlock, EXIF_HEADER_BYTES, EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES); + // Ignore Empty EXIF. Validate byte alignment + const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN; + const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN; + if (isBigEndian || isLittleEndian) { + return extractOrientation(exifBlock, isBigEndian); + } +} +function validateInput(input, index) { + // index should be within buffer limits + if (index > input.length) { + throw new TypeError('Corrupt JPG, exceeded buffer limits'); + } +} +exports.JPG = { + validate: (input) => (0, utils_1.toHexString)(input, 0, 2) === 'ffd8', + calculate(input) { + // Skip 4 chars, they are for signature + input = input.slice(4); + let orientation; + let next; + while (input.length) { + // read length of the next block + const i = (0, utils_1.readUInt16BE)(input, 0); + // Every JPEG block must begin with a 0xFF + if (input[i] !== 0xff) { + input = input.slice(1); + continue; + } + if (isEXIF(input)) { + orientation = validateExifBlock(input, i); + } + // ensure correct format + validateInput(input, i); + // 0xFFC0 is baseline standard(SOF) + // 0xFFC1 is baseline optimized(SOF) + // 0xFFC2 is progressive(SOF2) + next = input[i + 1]; + if (next === 0xc0 || next === 0xc1 || next === 0xc2) { + const size = extractSize(input, i + 5); + // TODO: is orientation=0 a valid answer here? + if (!orientation) { + return size; + } + return { + height: size.height, + orientation, + width: size.width, + }; + } + // move to the next block + input = input.slice(i + 2); + } + throw new TypeError('Invalid JPG, no size found'); + }, +}; diff --git a/node_modules/image-size/dist/types/jxl-stream.d.ts b/node_modules/image-size/dist/types/jxl-stream.d.ts new file mode 100644 index 0000000..1c502bb --- /dev/null +++ b/node_modules/image-size/dist/types/jxl-stream.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const JXLStream: IImage; diff --git a/node_modules/image-size/dist/types/jxl-stream.js b/node_modules/image-size/dist/types/jxl-stream.js new file mode 100644 index 0000000..e73316b --- /dev/null +++ b/node_modules/image-size/dist/types/jxl-stream.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JXLStream = void 0; +const utils_1 = require("./utils"); +const bit_reader_1 = require("../utils/bit-reader"); +function calculateImageDimension(reader, isSmallImage) { + if (isSmallImage) { + // Small images are multiples of 8 pixels, up to 256 pixels + return 8 * (1 + reader.getBits(5)); + } + else { + // Larger images use a variable bit-length encoding + const sizeClass = reader.getBits(2); + const extraBits = [9, 13, 18, 30][sizeClass]; + return 1 + reader.getBits(extraBits); + } +} +function calculateImageWidth(reader, isSmallImage, widthMode, height) { + if (isSmallImage && widthMode === 0) { + // Small square images + return 8 * (1 + reader.getBits(5)); + } + else if (widthMode === 0) { + // Non-small images with explicitly coded width + return calculateImageDimension(reader, false); + } + else { + // Images with width derived from height and aspect ratio + const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2]; + return Math.floor(height * aspectRatios[widthMode - 1]); + } +} +exports.JXLStream = { + validate: (input) => { + return (0, utils_1.toHexString)(input, 0, 2) === 'ff0a'; + }, + calculate(input) { + const reader = new bit_reader_1.BitReader(input, 'little-endian'); + const isSmallImage = reader.getBits(1) === 1; + const height = calculateImageDimension(reader, isSmallImage); + const widthMode = reader.getBits(3); + const width = calculateImageWidth(reader, isSmallImage, widthMode, height); + return { width, height }; + }, +}; diff --git a/node_modules/image-size/dist/types/jxl.d.ts b/node_modules/image-size/dist/types/jxl.d.ts new file mode 100644 index 0000000..cdec897 --- /dev/null +++ b/node_modules/image-size/dist/types/jxl.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const JXL: IImage; diff --git a/node_modules/image-size/dist/types/jxl.js b/node_modules/image-size/dist/types/jxl.js new file mode 100644 index 0000000..f557b0a --- /dev/null +++ b/node_modules/image-size/dist/types/jxl.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JXL = void 0; +const utils_1 = require("./utils"); +const jxl_stream_1 = require("./jxl-stream"); +/** Extracts the codestream from a containerized JPEG XL image */ +function extractCodestream(input) { + const jxlcBox = (0, utils_1.findBox)(input, 'jxlc', 0); + if (jxlcBox) { + return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size); + } + const partialStreams = extractPartialStreams(input); + if (partialStreams.length > 0) { + return concatenateCodestreams(partialStreams); + } + return undefined; +} +/** Extracts partial codestreams from jxlp boxes */ +function extractPartialStreams(input) { + const partialStreams = []; + let offset = 0; + while (offset < input.length) { + const jxlpBox = (0, utils_1.findBox)(input, 'jxlp', offset); + if (!jxlpBox) + break; + partialStreams.push(input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size)); + offset = jxlpBox.offset + jxlpBox.size; + } + return partialStreams; +} +/** Concatenates partial codestreams into a single codestream */ +function concatenateCodestreams(partialCodestreams) { + const totalLength = partialCodestreams.reduce((acc, curr) => acc + curr.length, 0); + const codestream = new Uint8Array(totalLength); + let position = 0; + for (const partial of partialCodestreams) { + codestream.set(partial, position); + position += partial.length; + } + return codestream; +} +exports.JXL = { + validate: (input) => { + const boxType = (0, utils_1.toUTF8String)(input, 4, 8); + if (boxType !== 'JXL ') + return false; + const ftypBox = (0, utils_1.findBox)(input, 'ftyp', 0); + if (!ftypBox) + return false; + const brand = (0, utils_1.toUTF8String)(input, ftypBox.offset + 8, ftypBox.offset + 12); + return brand === 'jxl '; + }, + calculate(input) { + const codestream = extractCodestream(input); + if (codestream) + return jxl_stream_1.JXLStream.calculate(codestream); + throw new Error('No codestream found in JXL container'); + }, +}; diff --git a/node_modules/image-size/dist/types/ktx.d.ts b/node_modules/image-size/dist/types/ktx.d.ts new file mode 100644 index 0000000..48fb6c9 --- /dev/null +++ b/node_modules/image-size/dist/types/ktx.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const KTX: IImage; diff --git a/node_modules/image-size/dist/types/ktx.js b/node_modules/image-size/dist/types/ktx.js new file mode 100644 index 0000000..e3f6381 --- /dev/null +++ b/node_modules/image-size/dist/types/ktx.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.KTX = void 0; +const utils_1 = require("./utils"); +exports.KTX = { + validate: (input) => { + const signature = (0, utils_1.toUTF8String)(input, 1, 7); + return ['KTX 11', 'KTX 20'].includes(signature); + }, + calculate: (input) => { + const type = input[5] === 0x31 ? 'ktx' : 'ktx2'; + const offset = type === 'ktx' ? 36 : 20; + return { + height: (0, utils_1.readUInt32LE)(input, offset + 4), + width: (0, utils_1.readUInt32LE)(input, offset), + type, + }; + }, +}; diff --git a/node_modules/image-size/dist/types/png.d.ts b/node_modules/image-size/dist/types/png.d.ts new file mode 100644 index 0000000..53415c0 --- /dev/null +++ b/node_modules/image-size/dist/types/png.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const PNG: IImage; diff --git a/node_modules/image-size/dist/types/png.js b/node_modules/image-size/dist/types/png.js new file mode 100644 index 0000000..b8aff59 --- /dev/null +++ b/node_modules/image-size/dist/types/png.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PNG = void 0; +const utils_1 = require("./utils"); +const pngSignature = 'PNG\r\n\x1a\n'; +const pngImageHeaderChunkName = 'IHDR'; +// Used to detect "fried" png's: http://www.jongware.com/pngdefry.html +const pngFriedChunkName = 'CgBI'; +exports.PNG = { + validate(input) { + if (pngSignature === (0, utils_1.toUTF8String)(input, 1, 8)) { + let chunkName = (0, utils_1.toUTF8String)(input, 12, 16); + if (chunkName === pngFriedChunkName) { + chunkName = (0, utils_1.toUTF8String)(input, 28, 32); + } + if (chunkName !== pngImageHeaderChunkName) { + throw new TypeError('Invalid PNG'); + } + return true; + } + return false; + }, + calculate(input) { + if ((0, utils_1.toUTF8String)(input, 12, 16) === pngFriedChunkName) { + return { + height: (0, utils_1.readUInt32BE)(input, 36), + width: (0, utils_1.readUInt32BE)(input, 32), + }; + } + return { + height: (0, utils_1.readUInt32BE)(input, 20), + width: (0, utils_1.readUInt32BE)(input, 16), + }; + }, +}; diff --git a/node_modules/image-size/dist/types/pnm.d.ts b/node_modules/image-size/dist/types/pnm.d.ts new file mode 100644 index 0000000..13950cb --- /dev/null +++ b/node_modules/image-size/dist/types/pnm.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const PNM: IImage; diff --git a/node_modules/image-size/dist/types/pnm.js b/node_modules/image-size/dist/types/pnm.js new file mode 100644 index 0000000..d61295a --- /dev/null +++ b/node_modules/image-size/dist/types/pnm.js @@ -0,0 +1,72 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PNM = void 0; +const utils_1 = require("./utils"); +const PNMTypes = { + P1: 'pbm/ascii', + P2: 'pgm/ascii', + P3: 'ppm/ascii', + P4: 'pbm', + P5: 'pgm', + P6: 'ppm', + P7: 'pam', + PF: 'pfm', +}; +const handlers = { + default: (lines) => { + let dimensions = []; + while (lines.length > 0) { + const line = lines.shift(); + if (line[0] === '#') { + continue; + } + dimensions = line.split(' '); + break; + } + if (dimensions.length === 2) { + return { + height: parseInt(dimensions[1], 10), + width: parseInt(dimensions[0], 10), + }; + } + else { + throw new TypeError('Invalid PNM'); + } + }, + pam: (lines) => { + const size = {}; + while (lines.length > 0) { + const line = lines.shift(); + if (line.length > 16 || line.charCodeAt(0) > 128) { + continue; + } + const [key, value] = line.split(' '); + if (key && value) { + size[key.toLowerCase()] = parseInt(value, 10); + } + if (size.height && size.width) { + break; + } + } + if (size.height && size.width) { + return { + height: size.height, + width: size.width, + }; + } + else { + throw new TypeError('Invalid PAM'); + } + }, +}; +exports.PNM = { + validate: (input) => (0, utils_1.toUTF8String)(input, 0, 2) in PNMTypes, + calculate(input) { + const signature = (0, utils_1.toUTF8String)(input, 0, 2); + const type = PNMTypes[signature]; + // TODO: this probably generates garbage. move to a stream based parser + const lines = (0, utils_1.toUTF8String)(input, 3).split(/[\r\n]+/); + const handler = handlers[type] || handlers.default; + return handler(lines); + }, +}; diff --git a/node_modules/image-size/dist/types/psd.d.ts b/node_modules/image-size/dist/types/psd.d.ts new file mode 100644 index 0000000..5f5c141 --- /dev/null +++ b/node_modules/image-size/dist/types/psd.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const PSD: IImage; diff --git a/node_modules/image-size/dist/types/psd.js b/node_modules/image-size/dist/types/psd.js new file mode 100644 index 0000000..6b32856 --- /dev/null +++ b/node_modules/image-size/dist/types/psd.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PSD = void 0; +const utils_1 = require("./utils"); +exports.PSD = { + validate: (input) => (0, utils_1.toUTF8String)(input, 0, 4) === '8BPS', + calculate: (input) => ({ + height: (0, utils_1.readUInt32BE)(input, 14), + width: (0, utils_1.readUInt32BE)(input, 18), + }), +}; diff --git a/node_modules/image-size/dist/types/svg.d.ts b/node_modules/image-size/dist/types/svg.d.ts new file mode 100644 index 0000000..0a10be8 --- /dev/null +++ b/node_modules/image-size/dist/types/svg.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const SVG: IImage; diff --git a/node_modules/image-size/dist/types/svg.js b/node_modules/image-size/dist/types/svg.js new file mode 100644 index 0000000..fb80a97 --- /dev/null +++ b/node_modules/image-size/dist/types/svg.js @@ -0,0 +1,90 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SVG = void 0; +const utils_1 = require("./utils"); +const svgReg = /"']|"[^"]*"|'[^']*')*>/; +const extractorRegExps = { + height: /\sheight=(['"])([^%]+?)\1/, + root: svgReg, + viewbox: /\sviewBox=(['"])(.+?)\1/i, + width: /\swidth=(['"])([^%]+?)\1/, +}; +const INCH_CM = 2.54; +const units = { + in: 96, + cm: 96 / INCH_CM, + em: 16, + ex: 8, + m: (96 / INCH_CM) * 100, + mm: 96 / INCH_CM / 10, + pc: 96 / 72 / 12, + pt: 96 / 72, + px: 1, +}; +const unitsReg = new RegExp(`^([0-9.]+(?:e\\d+)?)(${Object.keys(units).join('|')})?$`); +function parseLength(len) { + const m = unitsReg.exec(len); + if (!m) { + return undefined; + } + return Math.round(Number(m[1]) * (units[m[2]] || 1)); +} +function parseViewbox(viewbox) { + const bounds = viewbox.split(' '); + return { + height: parseLength(bounds[3]), + width: parseLength(bounds[2]), + }; +} +function parseAttributes(root) { + const width = root.match(extractorRegExps.width); + const height = root.match(extractorRegExps.height); + const viewbox = root.match(extractorRegExps.viewbox); + return { + height: height && parseLength(height[2]), + viewbox: viewbox && parseViewbox(viewbox[2]), + width: width && parseLength(width[2]), + }; +} +function calculateByDimensions(attrs) { + return { + height: attrs.height, + width: attrs.width, + }; +} +function calculateByViewbox(attrs, viewbox) { + const ratio = viewbox.width / viewbox.height; + if (attrs.width) { + return { + height: Math.floor(attrs.width / ratio), + width: attrs.width, + }; + } + if (attrs.height) { + return { + height: attrs.height, + width: Math.floor(attrs.height * ratio), + }; + } + return { + height: viewbox.height, + width: viewbox.width, + }; +} +exports.SVG = { + // Scan only the first kilo-byte to speed up the check on larger files + validate: (input) => svgReg.test((0, utils_1.toUTF8String)(input, 0, 1000)), + calculate(input) { + const root = (0, utils_1.toUTF8String)(input).match(extractorRegExps.root); + if (root) { + const attrs = parseAttributes(root[0]); + if (attrs.width && attrs.height) { + return calculateByDimensions(attrs); + } + if (attrs.viewbox) { + return calculateByViewbox(attrs, attrs.viewbox); + } + } + throw new TypeError('Invalid SVG'); + }, +}; diff --git a/node_modules/image-size/dist/types/tga.d.ts b/node_modules/image-size/dist/types/tga.d.ts new file mode 100644 index 0000000..4494963 --- /dev/null +++ b/node_modules/image-size/dist/types/tga.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const TGA: IImage; diff --git a/node_modules/image-size/dist/types/tga.js b/node_modules/image-size/dist/types/tga.js new file mode 100644 index 0000000..ea371dc --- /dev/null +++ b/node_modules/image-size/dist/types/tga.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TGA = void 0; +const utils_1 = require("./utils"); +exports.TGA = { + validate(input) { + return (0, utils_1.readUInt16LE)(input, 0) === 0 && (0, utils_1.readUInt16LE)(input, 4) === 0; + }, + calculate(input) { + return { + height: (0, utils_1.readUInt16LE)(input, 14), + width: (0, utils_1.readUInt16LE)(input, 12), + }; + }, +}; diff --git a/node_modules/image-size/dist/types/tiff.d.ts b/node_modules/image-size/dist/types/tiff.d.ts new file mode 100644 index 0000000..4d6ecbc --- /dev/null +++ b/node_modules/image-size/dist/types/tiff.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const TIFF: IImage; diff --git a/node_modules/image-size/dist/types/tiff.js b/node_modules/image-size/dist/types/tiff.js new file mode 100644 index 0000000..cf1564c --- /dev/null +++ b/node_modules/image-size/dist/types/tiff.js @@ -0,0 +1,95 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TIFF = void 0; +// based on http://www.compix.com/fileformattif.htm +// TO-DO: support big-endian as well +const fs = require("fs"); +const utils_1 = require("./utils"); +// Read IFD (image-file-directory) into a buffer +function readIFD(input, filepath, isBigEndian) { + const ifdOffset = (0, utils_1.readUInt)(input, 32, 4, isBigEndian); + // read only till the end of the file + let bufferSize = 1024; + const fileSize = fs.statSync(filepath).size; + if (ifdOffset + bufferSize > fileSize) { + bufferSize = fileSize - ifdOffset - 10; + } + // populate the buffer + const endBuffer = new Uint8Array(bufferSize); + const descriptor = fs.openSync(filepath, 'r'); + fs.readSync(descriptor, endBuffer, 0, bufferSize, ifdOffset); + fs.closeSync(descriptor); + return endBuffer.slice(2); +} +// TIFF values seem to be messed up on Big-Endian, this helps +function readValue(input, isBigEndian) { + const low = (0, utils_1.readUInt)(input, 16, 8, isBigEndian); + const high = (0, utils_1.readUInt)(input, 16, 10, isBigEndian); + return (high << 16) + low; +} +// move to the next tag +function nextTag(input) { + if (input.length > 24) { + return input.slice(12); + } +} +// Extract IFD tags from TIFF metadata +function extractTags(input, isBigEndian) { + const tags = {}; + let temp = input; + while (temp && temp.length) { + const code = (0, utils_1.readUInt)(temp, 16, 0, isBigEndian); + const type = (0, utils_1.readUInt)(temp, 16, 2, isBigEndian); + const length = (0, utils_1.readUInt)(temp, 32, 4, isBigEndian); + // 0 means end of IFD + if (code === 0) { + break; + } + else { + // 256 is width, 257 is height + // if (code === 256 || code === 257) { + if (length === 1 && (type === 3 || type === 4)) { + tags[code] = readValue(temp, isBigEndian); + } + // move to the next tag + temp = nextTag(temp); + } + } + return tags; +} +// Test if the TIFF is Big Endian or Little Endian +function determineEndianness(input) { + const signature = (0, utils_1.toUTF8String)(input, 0, 2); + if ('II' === signature) { + return 'LE'; + } + else if ('MM' === signature) { + return 'BE'; + } +} +const signatures = [ + // '492049', // currently not supported + '49492a00', // Little endian + '4d4d002a', // Big Endian + // '4d4d002a', // BigTIFF > 4GB. currently not supported +]; +exports.TIFF = { + validate: (input) => signatures.includes((0, utils_1.toHexString)(input, 0, 4)), + calculate(input, filepath) { + if (!filepath) { + throw new TypeError("Tiff doesn't support buffer"); + } + // Determine BE/LE + const isBigEndian = determineEndianness(input) === 'BE'; + // read the IFD + const ifdBuffer = readIFD(input, filepath, isBigEndian); + // extract the tags from the IFD + const tags = extractTags(ifdBuffer, isBigEndian); + const width = tags[256]; + const height = tags[257]; + if (!width || !height) { + throw new TypeError('Invalid Tiff. Missing tags'); + } + return { height, width }; + }, +}; diff --git a/node_modules/image-size/dist/types/utils.d.ts b/node_modules/image-size/dist/types/utils.d.ts new file mode 100644 index 0000000..7c79ca8 --- /dev/null +++ b/node_modules/image-size/dist/types/utils.d.ts @@ -0,0 +1,15 @@ +export declare const toUTF8String: (input: Uint8Array, start?: number, end?: number) => string; +export declare const toHexString: (input: Uint8Array, start?: number, end?: number) => string; +export declare const readInt16LE: (input: Uint8Array, offset?: number) => number; +export declare const readUInt16BE: (input: Uint8Array, offset?: number) => number; +export declare const readUInt16LE: (input: Uint8Array, offset?: number) => number; +export declare const readUInt24LE: (input: Uint8Array, offset?: number) => number; +export declare const readInt32LE: (input: Uint8Array, offset?: number) => number; +export declare const readUInt32BE: (input: Uint8Array, offset?: number) => number; +export declare const readUInt32LE: (input: Uint8Array, offset?: number) => number; +export declare function readUInt(input: Uint8Array, bits: 16 | 32, offset: number, isBigEndian: boolean): number; +export declare function findBox(input: Uint8Array, boxName: string, offset: number): { + name: string; + offset: number; + size: number; +} | undefined; diff --git a/node_modules/image-size/dist/types/utils.js b/node_modules/image-size/dist/types/utils.js new file mode 100644 index 0000000..5224bba --- /dev/null +++ b/node_modules/image-size/dist/types/utils.js @@ -0,0 +1,75 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.findBox = exports.readUInt = exports.readUInt32LE = exports.readUInt32BE = exports.readInt32LE = exports.readUInt24LE = exports.readUInt16LE = exports.readUInt16BE = exports.readInt16LE = exports.toHexString = exports.toUTF8String = void 0; +const decoder = new TextDecoder(); +const toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end)); +exports.toUTF8String = toUTF8String; +const toHexString = (input, start = 0, end = input.length) => input + .slice(start, end) + .reduce((memo, i) => memo + ('0' + i.toString(16)).slice(-2), ''); +exports.toHexString = toHexString; +const readInt16LE = (input, offset = 0) => { + const val = input[offset] + input[offset + 1] * 2 ** 8; + return val | ((val & (2 ** 15)) * 0x1fffe); +}; +exports.readInt16LE = readInt16LE; +const readUInt16BE = (input, offset = 0) => input[offset] * 2 ** 8 + input[offset + 1]; +exports.readUInt16BE = readUInt16BE; +const readUInt16LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8; +exports.readUInt16LE = readUInt16LE; +const readUInt24LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16; +exports.readUInt24LE = readUInt24LE; +const readInt32LE = (input, offset = 0) => input[offset] + + input[offset + 1] * 2 ** 8 + + input[offset + 2] * 2 ** 16 + + (input[offset + 3] << 24); +exports.readInt32LE = readInt32LE; +const readUInt32BE = (input, offset = 0) => input[offset] * 2 ** 24 + + input[offset + 1] * 2 ** 16 + + input[offset + 2] * 2 ** 8 + + input[offset + 3]; +exports.readUInt32BE = readUInt32BE; +const readUInt32LE = (input, offset = 0) => input[offset] + + input[offset + 1] * 2 ** 8 + + input[offset + 2] * 2 ** 16 + + input[offset + 3] * 2 ** 24; +exports.readUInt32LE = readUInt32LE; +// Abstract reading multi-byte unsigned integers +const methods = { + readUInt16BE: exports.readUInt16BE, + readUInt16LE: exports.readUInt16LE, + readUInt32BE: exports.readUInt32BE, + readUInt32LE: exports.readUInt32LE, +}; +function readUInt(input, bits, offset, isBigEndian) { + offset = offset || 0; + const endian = isBigEndian ? 'BE' : 'LE'; + const methodName = ('readUInt' + bits + endian); + return methods[methodName](input, offset); +} +exports.readUInt = readUInt; +function readBox(input, offset) { + if (input.length - offset < 4) + return; + const boxSize = (0, exports.readUInt32BE)(input, offset); + if (input.length - offset < boxSize) + return; + return { + name: (0, exports.toUTF8String)(input, 4 + offset, 8 + offset), + offset, + size: boxSize, + }; +} +function findBox(input, boxName, offset) { + while (offset < input.length) { + const box = readBox(input, offset); + if (!box) + break; + if (box.name === boxName) + return box; + // Fix the infinite loop by ensuring offset always increases + // If box.size is 0, advance by at least 8 bytes (the size of the box header) + offset += box.size > 0 ? box.size : 8; + } +} +exports.findBox = findBox; diff --git a/node_modules/image-size/dist/types/webp.d.ts b/node_modules/image-size/dist/types/webp.d.ts new file mode 100644 index 0000000..5012ead --- /dev/null +++ b/node_modules/image-size/dist/types/webp.d.ts @@ -0,0 +1,2 @@ +import type { IImage } from './interface'; +export declare const WEBP: IImage; diff --git a/node_modules/image-size/dist/types/webp.js b/node_modules/image-size/dist/types/webp.js new file mode 100644 index 0000000..d1186e1 --- /dev/null +++ b/node_modules/image-size/dist/types/webp.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WEBP = void 0; +const utils_1 = require("./utils"); +function calculateExtended(input) { + return { + height: 1 + (0, utils_1.readUInt24LE)(input, 7), + width: 1 + (0, utils_1.readUInt24LE)(input, 4), + }; +} +function calculateLossless(input) { + return { + height: 1 + + (((input[4] & 0xf) << 10) | (input[3] << 2) | ((input[2] & 0xc0) >> 6)), + width: 1 + (((input[2] & 0x3f) << 8) | input[1]), + }; +} +function calculateLossy(input) { + // `& 0x3fff` returns the last 14 bits + // TO-DO: include webp scaling in the calculations + return { + height: (0, utils_1.readInt16LE)(input, 8) & 0x3fff, + width: (0, utils_1.readInt16LE)(input, 6) & 0x3fff, + }; +} +exports.WEBP = { + validate(input) { + const riffHeader = 'RIFF' === (0, utils_1.toUTF8String)(input, 0, 4); + const webpHeader = 'WEBP' === (0, utils_1.toUTF8String)(input, 8, 12); + const vp8Header = 'VP8' === (0, utils_1.toUTF8String)(input, 12, 15); + return riffHeader && webpHeader && vp8Header; + }, + calculate(input) { + const chunkHeader = (0, utils_1.toUTF8String)(input, 12, 16); + input = input.slice(20, 30); + // Extended webp stream signature + if (chunkHeader === 'VP8X') { + const extendedHeader = input[0]; + const validStart = (extendedHeader & 0xc0) === 0; + const validEnd = (extendedHeader & 0x01) === 0; + if (validStart && validEnd) { + return calculateExtended(input); + } + else { + // TODO: breaking change + throw new TypeError('Invalid WebP'); + } + } + // Lossless webp stream signature + if (chunkHeader === 'VP8 ' && input[0] !== 0x2f) { + return calculateLossy(input); + } + // Lossy webp stream signature + const signature = (0, utils_1.toHexString)(input, 3, 6); + if (chunkHeader === 'VP8L' && signature !== '9d012a') { + return calculateLossless(input); + } + throw new TypeError('Invalid WebP'); + }, +}; diff --git a/node_modules/image-size/dist/utils/bit-reader.d.ts b/node_modules/image-size/dist/utils/bit-reader.d.ts new file mode 100644 index 0000000..4e59226 --- /dev/null +++ b/node_modules/image-size/dist/utils/bit-reader.d.ts @@ -0,0 +1,10 @@ +/** This class helps read Uint8Array bit-by-bit */ +export declare class BitReader { + private readonly input; + private readonly endianness; + private byteOffset; + private bitOffset; + constructor(input: Uint8Array, endianness: 'big-endian' | 'little-endian'); + /** Reads a specified number of bits, and move the offset */ + getBits(length?: number): number; +} diff --git a/node_modules/image-size/dist/utils/bit-reader.js b/node_modules/image-size/dist/utils/bit-reader.js new file mode 100644 index 0000000..3546348 --- /dev/null +++ b/node_modules/image-size/dist/utils/bit-reader.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BitReader = void 0; +/** This class helps read Uint8Array bit-by-bit */ +class BitReader { + constructor(input, endianness) { + this.input = input; + this.endianness = endianness; + // Skip the first 16 bits (2 bytes) of signature + this.byteOffset = 2; + this.bitOffset = 0; + } + /** Reads a specified number of bits, and move the offset */ + getBits(length = 1) { + let result = 0; + let bitsRead = 0; + while (bitsRead < length) { + if (this.byteOffset >= this.input.length) { + throw new Error('Reached end of input'); + } + const currentByte = this.input[this.byteOffset]; + const bitsLeft = 8 - this.bitOffset; + const bitsToRead = Math.min(length - bitsRead, bitsLeft); + if (this.endianness === 'little-endian') { + const mask = (1 << bitsToRead) - 1; + const bits = (currentByte >> this.bitOffset) & mask; + result |= bits << bitsRead; + } + else { + const mask = ((1 << bitsToRead) - 1) << (8 - this.bitOffset - bitsToRead); + const bits = (currentByte & mask) >> (8 - this.bitOffset - bitsToRead); + result = (result << bitsToRead) | bits; + } + bitsRead += bitsToRead; + this.bitOffset += bitsToRead; + if (this.bitOffset === 8) { + this.byteOffset++; + this.bitOffset = 0; + } + } + return result; + } +} +exports.BitReader = BitReader; diff --git a/node_modules/image-size/package.json b/node_modules/image-size/package.json new file mode 100644 index 0000000..c241dd1 --- /dev/null +++ b/node_modules/image-size/package.json @@ -0,0 +1,81 @@ +{ + "name": "image-size", + "version": "1.2.1", + "description": "get dimensions of any image file", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist", + "bin/image-size.js" + ], + "engines": { + "node": ">=16.x" + }, + "packageManager": "yarn@4.0.2", + "bin": "bin/image-size.js", + "scripts": { + "lint": "eslint bin lib specs", + "format": "prettier --write lib specs eslint.config.mjs", + "test": "nyc mocha", + "clean": "rm -rf dist docs", + "generate-docs": "typedoc", + "build": "tsc", + "prepack": "yarn clean && yarn build" + }, + "keywords": [ + "image", + "size", + "dimensions", + "resolution", + "width", + "height", + "avif", + "bmp", + "cur", + "gif", + "heic", + "heif", + "icns", + "ico", + "jpeg", + "jxl", + "png", + "psd", + "svg", + "tga", + "tiff", + "webp" + ], + "repository": "git://github.com/image-size/image-size.git", + "author": "netroy (http://netroy.in/)", + "license": "MIT", + "devDependencies": { + "@eslint/js": "9.5.0", + "@types/chai": "4.3.16", + "@types/eslint__js": "8.42.3", + "@types/glob": "8.1.0", + "@types/mocha": "10.0.7", + "@types/node": "18.19.39", + "@types/sinon": "17.0.3", + "chai": "4.4.1", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-prettier": "5.1.3", + "glob": "10.4.2", + "mocha": "10.2.0", + "nyc": "15.1.0", + "prettier": "3.3.2", + "sinon": "17.0.1", + "ts-node": "10.9.2", + "typedoc": "0.25.13", + "typescript": "5.4.5", + "typescript-eslint": "7.13.1" + }, + "nyc": { + "include": "lib", + "exclude": "specs/*.spec.ts" + }, + "dependencies": { + "queue": "6.0.2" + } +} diff --git a/node_modules/inherits/LICENSE b/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +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/inherits/README.md b/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/inherits/inherits.js b/node_modules/inherits/inherits.js new file mode 100644 index 0000000..f71f2d9 --- /dev/null +++ b/node_modules/inherits/inherits.js @@ -0,0 +1,9 @@ +try { + var util = require('util'); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = require('./inherits_browser.js'); +} diff --git a/node_modules/inherits/inherits_browser.js b/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..86bbb3d --- /dev/null +++ b/node_modules/inherits/inherits_browser.js @@ -0,0 +1,27 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} diff --git a/node_modules/inherits/package.json b/node_modules/inherits/package.json new file mode 100644 index 0000000..37b4366 --- /dev/null +++ b/node_modules/inherits/package.json @@ -0,0 +1,29 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.4", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": "git://github.com/isaacs/inherits", + "license": "ISC", + "scripts": { + "test": "tap" + }, + "devDependencies": { + "tap": "^14.2.4" + }, + "files": [ + "inherits.js", + "inherits_browser.js" + ] +} diff --git a/node_modules/is-alphabetical/index.d.ts b/node_modules/is-alphabetical/index.d.ts new file mode 100644 index 0000000..ceee1c6 --- /dev/null +++ b/node_modules/is-alphabetical/index.d.ts @@ -0,0 +1,8 @@ +/** + * Check if the given character code, or the character code at the first + * character, is alphabetical. + * + * @param {string|number} character + * @returns {boolean} Whether `character` is alphabetical. + */ +export function isAlphabetical(character: string | number): boolean diff --git a/node_modules/is-alphabetical/index.js b/node_modules/is-alphabetical/index.js new file mode 100644 index 0000000..f71156a --- /dev/null +++ b/node_modules/is-alphabetical/index.js @@ -0,0 +1,16 @@ +/** + * Check if the given character code, or the character code at the first + * character, is alphabetical. + * + * @param {string|number} character + * @returns {boolean} Whether `character` is alphabetical. + */ +export function isAlphabetical(character) { + const code = + typeof character === 'string' ? character.charCodeAt(0) : character + + return ( + (code >= 97 && code <= 122) /* a-z */ || + (code >= 65 && code <= 90) /* A-Z */ + ) +} diff --git a/node_modules/is-alphabetical/license b/node_modules/is-alphabetical/license new file mode 100644 index 0000000..8d8660d --- /dev/null +++ b/node_modules/is-alphabetical/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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/is-alphabetical/package.json b/node_modules/is-alphabetical/package.json new file mode 100644 index 0000000..c274f30 --- /dev/null +++ b/node_modules/is-alphabetical/package.json @@ -0,0 +1,73 @@ +{ + "name": "is-alphabetical", + "version": "2.0.1", + "description": "Check if a character is alphabetical", + "license": "MIT", + "keywords": [ + "string", + "character", + "char", + "code", + "alphabetical" + ], + "repository": "wooorm/is-alphabetical", + "bugs": "https://github.com/wooorm/is-alphabetical/issues", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + }, + "author": "Titus Wormer (https://wooorm.com)", + "contributors": [ + "Titus Wormer (https://wooorm.com)" + ], + "sideEffects": false, + "type": "module", + "main": "index.js", + "types": "index.d.ts", + "files": [ + "index.d.ts", + "index.js" + ], + "devDependencies": { + "@types/tape": "^4.0.0", + "c8": "^7.0.0", + "prettier": "^2.0.0", + "remark-cli": "^10.0.0", + "remark-preset-wooorm": "^9.0.0", + "rimraf": "^3.0.0", + "tape": "^5.0.0", + "type-coverage": "^2.0.0", + "typescript": "^4.0.0", + "xo": "^0.46.0" + }, + "scripts": { + "prepublishOnly": "npm run build && npm run format", + "build": "rimraf \"*.d.ts\" && tsc && type-coverage", + "format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix", + "test-api": "node --conditions development test.js", + "test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov npm run test-api", + "test": "npm run build && npm run format && npm run test-coverage" + }, + "prettier": { + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "bracketSpacing": false, + "semi": false, + "trailingComma": "none" + }, + "xo": { + "prettier": true + }, + "remarkConfig": { + "plugins": [ + "preset-wooorm" + ] + }, + "typeCoverage": { + "atLeast": 100, + "detail": true, + "strict": true, + "ignoreCatch": true + } +} diff --git a/node_modules/is-alphabetical/readme.md b/node_modules/is-alphabetical/readme.md new file mode 100644 index 0000000..8c83eb6 --- /dev/null +++ b/node_modules/is-alphabetical/readme.md @@ -0,0 +1,141 @@ +# is-alphabetical + +[![Build][build-badge]][build] +[![Coverage][coverage-badge]][coverage] +[![Downloads][downloads-badge]][downloads] +[![Size][size-badge]][size] + +Check if a character is alphabetical. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`isAlphabetical(character|code)`](#isalphabeticalcharactercode) +* [Types](#types) +* [Compatibility](#compatibility) +* [Security](#security) +* [Related](#related) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This is a function that checks if a given character is ASCII alphabetical: +matching `[a-z]`, case insensitive. + +## When should I use this? + +Not often, as it’s relatively simple to do yourself. +This package exists because it’s needed in several related packages, at which +point it becomes useful to defer to one shared function. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install is-alphabetical +``` + +In Deno with [Skypack][]: + +```js +import {isAlphabetical} from 'https://cdn.skypack.dev/is-alphabetical@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +```js +import {isAlphabetical} from 'is-alphabetical' + +isAlphabetical('a') // => true +isAlphabetical('B') // => true +isAlphabetical('0') // => false +isAlphabetical('💩') // => false +``` + +## API + +This package exports the following identifier: `isAlphabetical`. +There is no default export. + +### `isAlphabetical(character|code)` + +Check whether the given character code (`number`), or the character code at the +first position (`string`), is alphabetical. + +## Types + +This package is fully typed with [TypeScript][]. + +## Compatibility + +This package is at least compatible with all maintained versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +It also works in Deno and modern browsers. + +## Security + +This package is safe. + +## Related + +* [`wooorm/is-decimal`](https://github.com/wooorm/is-decimal) +* [`wooorm/is-hexadecimal`](https://github.com/wooorm/is-hexadecimal) +* [`wooorm/is-alphanumerical`](https://github.com/wooorm/is-alphanumerical) +* [`wooorm/is-whitespace-character`](https://github.com/wooorm/is-whitespace-character) +* [`wooorm/is-word-character`](https://github.com/wooorm/is-word-character) + +## Contribute + +Yes please! +See [How to Contribute to Open Source][contribute]. + +## License + +[MIT][license] © [Titus Wormer][author] + + + +[build-badge]: https://github.com/wooorm/is-alphabetical/workflows/main/badge.svg + +[build]: https://github.com/wooorm/is-alphabetical/actions + +[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/is-alphabetical.svg + +[coverage]: https://codecov.io/github/wooorm/is-alphabetical + +[downloads-badge]: https://img.shields.io/npm/dm/is-alphabetical.svg + +[downloads]: https://www.npmjs.com/package/is-alphabetical + +[size-badge]: https://img.shields.io/bundlephobia/minzip/is-alphabetical.svg + +[size]: https://bundlephobia.com/result?p=is-alphabetical + +[npm]: https://docs.npmjs.com/cli/install + +[skypack]: https://www.skypack.dev + +[license]: license + +[author]: https://wooorm.com + +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[typescript]: https://www.typescriptlang.org + +[contribute]: https://opensource.guide/how-to-contribute/ diff --git a/node_modules/is-alphanumerical/index.d.ts b/node_modules/is-alphanumerical/index.d.ts new file mode 100644 index 0000000..3fed2bd --- /dev/null +++ b/node_modules/is-alphanumerical/index.d.ts @@ -0,0 +1,8 @@ +/** + * Check if the given character code, or the character code at the first + * character, is alphanumerical. + * + * @param {string|number} character + * @returns {boolean} Whether `character` is alphanumerical. + */ +export function isAlphanumerical(character: string | number): boolean diff --git a/node_modules/is-alphanumerical/index.js b/node_modules/is-alphanumerical/index.js new file mode 100644 index 0000000..10188f3 --- /dev/null +++ b/node_modules/is-alphanumerical/index.js @@ -0,0 +1,13 @@ +import {isAlphabetical} from 'is-alphabetical' +import {isDecimal} from 'is-decimal' + +/** + * Check if the given character code, or the character code at the first + * character, is alphanumerical. + * + * @param {string|number} character + * @returns {boolean} Whether `character` is alphanumerical. + */ +export function isAlphanumerical(character) { + return isAlphabetical(character) || isDecimal(character) +} diff --git a/node_modules/is-alphanumerical/license b/node_modules/is-alphanumerical/license new file mode 100644 index 0000000..8d8660d --- /dev/null +++ b/node_modules/is-alphanumerical/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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/is-alphanumerical/package.json b/node_modules/is-alphanumerical/package.json new file mode 100644 index 0000000..2689af5 --- /dev/null +++ b/node_modules/is-alphanumerical/package.json @@ -0,0 +1,79 @@ +{ + "name": "is-alphanumerical", + "version": "2.0.1", + "description": "Check if a character is alphanumerical", + "license": "MIT", + "keywords": [ + "string", + "character", + "char", + "code", + "alphabetical", + "numerical", + "alphanumerical" + ], + "repository": "wooorm/is-alphanumerical", + "bugs": "https://github.com/wooorm/is-alphanumerical/issues", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + }, + "author": "Titus Wormer (https://wooorm.com)", + "contributors": [ + "Titus Wormer (https://wooorm.com)" + ], + "sideEffects": false, + "type": "module", + "main": "index.js", + "types": "index.d.ts", + "files": [ + "index.d.ts", + "index.js" + ], + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "devDependencies": { + "@types/tape": "^4.0.0", + "c8": "^7.0.0", + "prettier": "^2.0.0", + "remark-cli": "^10.0.0", + "remark-preset-wooorm": "^9.0.0", + "rimraf": "^3.0.0", + "tape": "^5.0.0", + "type-coverage": "^2.0.0", + "typescript": "^4.0.0", + "xo": "^0.46.0" + }, + "scripts": { + "prepublishOnly": "npm run build && npm run format", + "build": "rimraf \"*.d.ts\" && tsc && type-coverage", + "format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix", + "test-api": "node --conditions development test.js", + "test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov npm run test-api", + "test": "npm run build && npm run format && npm run test-coverage" + }, + "prettier": { + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "bracketSpacing": false, + "semi": false, + "trailingComma": "none" + }, + "xo": { + "prettier": true + }, + "remarkConfig": { + "plugins": [ + "preset-wooorm" + ] + }, + "typeCoverage": { + "atLeast": 100, + "detail": true, + "strict": true, + "ignoreCatch": true + } +} diff --git a/node_modules/is-alphanumerical/readme.md b/node_modules/is-alphanumerical/readme.md new file mode 100644 index 0000000..cacd9a6 --- /dev/null +++ b/node_modules/is-alphanumerical/readme.md @@ -0,0 +1,142 @@ +# is-alphanumerical + +[![Build][build-badge]][build] +[![Coverage][coverage-badge]][coverage] +[![Downloads][downloads-badge]][downloads] +[![Size][size-badge]][size] + +Check if a character is alphanumerical. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`isAlphanumerical(character)`](#isalphanumericalcharacter) +* [Types](#types) +* [Compatibility](#compatibility) +* [Security](#security) +* [Related](#related) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This is a function that checks if a given character is ASCII alphanumerical: +it matches `[a-zA-Z0-9]`. + +## When should I use this? + +Not often, as it’s relatively simple to do yourself. +This package exists because it’s needed in several related packages, at which +point it becomes useful to defer to one shared function. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install is-alphanumerical +``` + +In Deno with [Skypack][]: + +```js +import {isAlphanumerical} from 'https://cdn.skypack.dev/is-alphanumerical@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +```js +import {isAlphanumerical} from 'is-alphanumerical' + +isAlphanumerical('a') // => true +isAlphanumerical('Z') // => true +isAlphanumerical('0') // => true +isAlphanumerical(' ') // => false +isAlphanumerical('💩') // => false +``` + +## API + +This package exports the following identifier: `isAlphanumerical`. +There is no default export. + +### `isAlphanumerical(character)` + +Check whether the given character code (`number`), or the character code at the +first position (`string`), is alphanumerical. + +## Types + +This package is fully typed with [TypeScript][]. + +## Compatibility + +This package is at least compatible with all maintained versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +It also works in Deno and modern browsers. + +## Security + +This package is safe. + +## Related + +* [`wooorm/is-alphabetical`](https://github.com/wooorm/is-alphabetical) +* [`wooorm/is-decimal`](https://github.com/wooorm/is-decimal) +* [`wooorm/is-hexadecimal`](https://github.com/wooorm/is-hexadecimal) +* [`wooorm/is-whitespace-character`](https://github.com/wooorm/is-whitespace-character) +* [`wooorm/is-word-character`](https://github.com/wooorm/is-word-character) + +## Contribute + +Yes please! +See [How to Contribute to Open Source][contribute]. + +## License + +[MIT][license] © [Titus Wormer][author] + + + +[build-badge]: https://github.com/wooorm/is-alphanumerical/workflows/main/badge.svg + +[build]: https://github.com/wooorm/is-alphanumerical/actions + +[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/is-alphanumerical.svg + +[coverage]: https://codecov.io/github/wooorm/is-alphanumerical + +[downloads-badge]: https://img.shields.io/npm/dm/is-alphanumerical.svg + +[downloads]: https://www.npmjs.com/package/is-alphanumerical + +[size-badge]: https://img.shields.io/bundlephobia/minzip/is-alphanumerical.svg + +[size]: https://bundlephobia.com/result?p=is-alphanumerical + +[npm]: https://docs.npmjs.com/cli/install + +[skypack]: https://www.skypack.dev + +[license]: license + +[author]: https://wooorm.com + +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[typescript]: https://www.typescriptlang.org + +[contribute]: https://opensource.guide/how-to-contribute/ diff --git a/node_modules/is-arrayish/LICENSE b/node_modules/is-arrayish/LICENSE new file mode 100644 index 0000000..0a5f461 --- /dev/null +++ b/node_modules/is-arrayish/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 JD Ballard + +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/is-arrayish/README.md b/node_modules/is-arrayish/README.md new file mode 100644 index 0000000..7d36072 --- /dev/null +++ b/node_modules/is-arrayish/README.md @@ -0,0 +1,16 @@ +# node-is-arrayish [![Travis-CI.org Build Status](https://img.shields.io/travis/Qix-/node-is-arrayish.svg?style=flat-square)](https://travis-ci.org/Qix-/node-is-arrayish) [![Coveralls.io Coverage Rating](https://img.shields.io/coveralls/Qix-/node-is-arrayish.svg?style=flat-square)](https://coveralls.io/r/Qix-/node-is-arrayish) +> Determines if an object can be used like an Array + +## Example +```javascript +var isArrayish = require('is-arrayish'); + +isArrayish([]); // true +isArrayish({__proto__: []}); // true +isArrayish({}); // false +isArrayish({length:10}); // false +``` + +## License +Licensed under the [MIT License](http://opensource.org/licenses/MIT). +You can find a copy of it in [LICENSE](LICENSE). diff --git a/node_modules/is-arrayish/index.js b/node_modules/is-arrayish/index.js new file mode 100644 index 0000000..729ca40 --- /dev/null +++ b/node_modules/is-arrayish/index.js @@ -0,0 +1,9 @@ +module.exports = function isArrayish(obj) { + if (!obj || typeof obj === 'string') { + return false; + } + + return obj instanceof Array || Array.isArray(obj) || + (obj.length >= 0 && (obj.splice instanceof Function || + (Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String'))); +}; diff --git a/node_modules/is-arrayish/package.json b/node_modules/is-arrayish/package.json new file mode 100644 index 0000000..8a54e33 --- /dev/null +++ b/node_modules/is-arrayish/package.json @@ -0,0 +1,45 @@ +{ + "name": "is-arrayish", + "description": "Determines if an object can be used as an array", + "version": "0.3.2", + "author": "Qix (http://github.com/qix-)", + "keywords": [ + "is", + "array", + "duck", + "type", + "arrayish", + "similar", + "proto", + "prototype", + "type" + ], + "license": "MIT", + "scripts": { + "test": "mocha --require coffeescript/register ./test/**/*.coffee", + "lint": "zeit-eslint --ext .jsx,.js .", + "lint-staged": "git diff --diff-filter=ACMRT --cached --name-only '*.js' '*.jsx' | xargs zeit-eslint" + }, + "repository": { + "type": "git", + "url": "https://github.com/qix-/node-is-arrayish.git" + }, + "devDependencies": { + "@zeit/eslint-config-node": "^0.3.0", + "@zeit/git-hooks": "^0.1.4", + "coffeescript": "^2.3.1", + "coveralls": "^3.0.1", + "eslint": "^4.19.1", + "istanbul": "^0.4.5", + "mocha": "^5.2.0", + "should": "^13.2.1" + }, + "eslintConfig": { + "extends": [ + "@zeit/eslint-config-node" + ] + }, + "git": { + "pre-commit": "lint-staged" + } +} diff --git a/node_modules/is-arrayish/yarn-error.log b/node_modules/is-arrayish/yarn-error.log new file mode 100644 index 0000000..d3dcf37 --- /dev/null +++ b/node_modules/is-arrayish/yarn-error.log @@ -0,0 +1,1443 @@ +Arguments: + /Users/junon/n/bin/node /Users/junon/.yarn/bin/yarn.js test + +PATH: + /Users/junon/.yarn/bin:/Users/junon/.config/yarn/global/node_modules/.bin:/Users/junon/perl5/bin:/Users/junon/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/junon/bin:/Users/junon/.local/bin:/src/.go/bin:/src/llvm/llvm/build/bin:/Users/junon/Library/Android/sdk/platform-tools:/Users/junon/n/bin:/usr/local/texlive/2017/bin/x86_64-darwin/ + +Yarn version: + 1.5.1 + +Node version: + 9.6.1 + +Platform: + darwin x64 + +npm manifest: + { + "name": "is-arrayish", + "description": "Determines if an object can be used as an array", + "version": "0.3.1", + "author": "Qix (http://github.com/qix-)", + "keywords": [ + "is", + "array", + "duck", + "type", + "arrayish", + "similar", + "proto", + "prototype", + "type" + ], + "license": "MIT", + "scripts": { + "test": "mocha --require coffeescript/register", + "lint": "zeit-eslint --ext .jsx,.js .", + "lint-staged": "git diff --diff-filter=ACMRT --cached --name-only '*.js' '*.jsx' | xargs zeit-eslint" + }, + "repository": { + "type": "git", + "url": "https://github.com/qix-/node-is-arrayish.git" + }, + "devDependencies": { + "@zeit/eslint-config-node": "^0.3.0", + "@zeit/git-hooks": "^0.1.4", + "coffeescript": "^2.3.1", + "coveralls": "^3.0.1", + "eslint": "^4.19.1", + "istanbul": "^0.4.5", + "mocha": "^5.2.0", + "should": "^13.2.1" + }, + "eslintConfig": { + "extends": [ + "@zeit/eslint-config-node" + ] + }, + "git": { + "pre-commit": "lint-staged" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@zeit/eslint-config-base@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@zeit/eslint-config-base/-/eslint-config-base-0.3.0.tgz#32a58c3e52eca4025604758cb4591f3d28e22fb4" + dependencies: + arg "^1.0.0" + chalk "^2.3.0" + + "@zeit/eslint-config-node@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@zeit/eslint-config-node/-/eslint-config-node-0.3.0.tgz#6e328328f366f66c2a0549a69131bbcd9735f098" + dependencies: + "@zeit/eslint-config-base" "0.3.0" + + "@zeit/git-hooks@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@zeit/git-hooks/-/git-hooks-0.1.4.tgz#70583db5dd69726a62c7963520e67f2c3a33cc5f" + + abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + + abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + + acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + + acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + + acorn@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + + ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + + ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + + align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + + amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + + ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + + ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + + ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + + ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + + ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + + arg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.1.tgz#892a26d841bd5a64880bbc8f73dd64a705910ca3" + + argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + + array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + + array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + + arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + + asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + + assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + + async@1.x, async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + + asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + + aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + + aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + + babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + + balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + + bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + + brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + + browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + + buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + + caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + + callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + + camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + + caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + + center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + + chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + + chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + + chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + + circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + + cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + + cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + + cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + + co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + + coffeescript@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-2.3.1.tgz#a25f69c251d25805c9842e57fc94bfc453ef6aed" + + color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + + color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + + combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + + commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + + concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + + concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + + core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + + coveralls@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.1.tgz#12e15914eaa29204e56869a5ece7b9e1492d2ae2" + dependencies: + js-yaml "^3.6.1" + lcov-parse "^0.0.10" + log-driver "^1.2.5" + minimist "^1.2.0" + request "^2.79.0" + + cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + + dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + + debug@3.1.0, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + + decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + + deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + + del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + + delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + + diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + + doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + + ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + + escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + + eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + + eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + + eslint@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + + espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + + esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + + esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + + esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + + esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + + estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + + estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + + esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + + extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + + external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + + extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + + extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + + fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + + fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + + fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + + figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + + file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + + flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + + forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + + form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + + fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + + functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + + getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + + glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + + glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + + globals@^11.0.1: + version "11.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" + + globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + + graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + + growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + + handlebars@^4.0.1: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + + har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + + har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + + has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + + has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + + has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + + he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + + http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + + iconv-lite@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + + ignore@^3.3.3: + version "3.3.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + + imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + + inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + + inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + + is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + + is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + + is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + + is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + + is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + + is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + + is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + + is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + + isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + + isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + + isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + + istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + + js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + + js-yaml@3.x, js-yaml@^3.6.1, js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + + jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + + json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + + json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + + json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + + json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + + jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + + kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + + lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + + lcov-parse@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + + levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + + lodash@^4.17.4, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + + log-driver@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + + longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + + lru-cache@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + + mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + + mime-types@^2.1.12, mime-types@~2.1.17: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + + mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + + "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + + minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + + minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + + minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + + mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + + mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + + ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + + mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + + natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + + nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + + oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + + object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + + once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + + onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + + optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + + optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + + os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + + path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + + path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + + performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + + pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + + pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + + pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + + pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + + prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + + process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + + progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + + pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + + punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + + qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + + readable-stream@^2.2.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + + regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + + repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + + request@^2.79.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + + require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + + resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + + resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + + restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + + right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + + rimraf@^2.2.8: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + + run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + + rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + + rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + + safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + + semver@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + + shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + + shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + + should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + dependencies: + should-type "^1.4.0" + + should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + + should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + + should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + + should-util@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.0.tgz#c98cda374aa6b190df8ba87c9889c2b4db620063" + + should@^13.2.1: + version "13.2.1" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.1.tgz#84e6ebfbb145c79e0ae42307b25b3f62dcaf574e" + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + + signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + + slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + + source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + + source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + + source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + + sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + + sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + + string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + + string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + + strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + + strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + + strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + + supports-color@5.4.0, supports-color@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + + supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + + supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + + table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + + text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + + through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + + tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + + tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + + tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + + tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + + type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + + typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + + uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + + uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + + util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + + uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + + verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + + which@^1.1.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + + window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + + wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + + wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + + wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + + wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + + write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + + yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + + yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +Trace: + Error: Command failed. + Exit code: 1 + Command: sh + Arguments: -c mocha --require coffeescript/register + Directory: /src/qix-/node-is-arrayish + Output: + + at ProcessTermError.MessageError (/Users/junon/.yarn/lib/cli.js:186:110) + at new ProcessTermError (/Users/junon/.yarn/lib/cli.js:226:113) + at ChildProcess. (/Users/junon/.yarn/lib/cli.js:30281:17) + at ChildProcess.emit (events.js:127:13) + at maybeClose (internal/child_process.js:933:16) + at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5) diff --git a/node_modules/is-binary-path/index.d.ts b/node_modules/is-binary-path/index.d.ts new file mode 100644 index 0000000..19dcd43 --- /dev/null +++ b/node_modules/is-binary-path/index.d.ts @@ -0,0 +1,17 @@ +/** +Check if a file path is a binary file. + +@example +``` +import isBinaryPath = require('is-binary-path'); + +isBinaryPath('source/unicorn.png'); +//=> true + +isBinaryPath('source/unicorn.txt'); +//=> false +``` +*/ +declare function isBinaryPath(filePath: string): boolean; + +export = isBinaryPath; diff --git a/node_modules/is-binary-path/index.js b/node_modules/is-binary-path/index.js new file mode 100644 index 0000000..ef7548c --- /dev/null +++ b/node_modules/is-binary-path/index.js @@ -0,0 +1,7 @@ +'use strict'; +const path = require('path'); +const binaryExtensions = require('binary-extensions'); + +const extensions = new Set(binaryExtensions); + +module.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase()); diff --git a/node_modules/is-binary-path/license b/node_modules/is-binary-path/license new file mode 100644 index 0000000..401b1c7 --- /dev/null +++ b/node_modules/is-binary-path/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) + +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/is-binary-path/package.json b/node_modules/is-binary-path/package.json new file mode 100644 index 0000000..a8d005a --- /dev/null +++ b/node_modules/is-binary-path/package.json @@ -0,0 +1,40 @@ +{ + "name": "is-binary-path", + "version": "2.1.0", + "description": "Check if a file path is a binary file", + "license": "MIT", + "repository": "sindresorhus/is-binary-path", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "path", + "check", + "detect", + "is" + ], + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node_modules/is-binary-path/readme.md b/node_modules/is-binary-path/readme.md new file mode 100644 index 0000000..b4ab025 --- /dev/null +++ b/node_modules/is-binary-path/readme.md @@ -0,0 +1,34 @@ +# is-binary-path [![Build Status](https://travis-ci.org/sindresorhus/is-binary-path.svg?branch=master)](https://travis-ci.org/sindresorhus/is-binary-path) + +> Check if a file path is a binary file + + +## Install + +``` +$ npm install is-binary-path +``` + + +## Usage + +```js +const isBinaryPath = require('is-binary-path'); + +isBinaryPath('source/unicorn.png'); +//=> true + +isBinaryPath('source/unicorn.txt'); +//=> false +``` + + +## Related + +- [binary-extensions](https://github.com/sindresorhus/binary-extensions) - List of binary file extensions +- [is-text-path](https://github.com/sindresorhus/is-text-path) - Check if a filepath is a text file + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com) diff --git a/node_modules/is-decimal/index.d.ts b/node_modules/is-decimal/index.d.ts new file mode 100644 index 0000000..5f162a7 --- /dev/null +++ b/node_modules/is-decimal/index.d.ts @@ -0,0 +1,8 @@ +/** + * Check if the given character code, or the character code at the first + * character, is decimal. + * + * @param {string|number} character + * @returns {boolean} Whether `character` is a decimal + */ +export function isDecimal(character: string | number): boolean diff --git a/node_modules/is-decimal/index.js b/node_modules/is-decimal/index.js new file mode 100644 index 0000000..4fe00ff --- /dev/null +++ b/node_modules/is-decimal/index.js @@ -0,0 +1,13 @@ +/** + * Check if the given character code, or the character code at the first + * character, is decimal. + * + * @param {string|number} character + * @returns {boolean} Whether `character` is a decimal + */ +export function isDecimal(character) { + const code = + typeof character === 'string' ? character.charCodeAt(0) : character + + return code >= 48 && code <= 57 /* 0-9 */ +} diff --git a/node_modules/is-decimal/license b/node_modules/is-decimal/license new file mode 100644 index 0000000..8d8660d --- /dev/null +++ b/node_modules/is-decimal/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2016 Titus Wormer + +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/is-decimal/package.json b/node_modules/is-decimal/package.json new file mode 100644 index 0000000..c0a5939 --- /dev/null +++ b/node_modules/is-decimal/package.json @@ -0,0 +1,73 @@ +{ + "name": "is-decimal", + "version": "2.0.1", + "description": "Check if a character is decimal", + "license": "MIT", + "keywords": [ + "string", + "character", + "char", + "code", + "decimal" + ], + "repository": "wooorm/is-decimal", + "bugs": "https://github.com/wooorm/is-decimal/issues", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + }, + "author": "Titus Wormer (https://wooorm.com)", + "contributors": [ + "Titus Wormer (https://wooorm.com)" + ], + "sideEffects": false, + "type": "module", + "main": "index.js", + "types": "index.d.ts", + "files": [ + "index.d.ts", + "index.js" + ], + "devDependencies": { + "@types/tape": "^4.0.0", + "c8": "^7.0.0", + "prettier": "^2.0.0", + "remark-cli": "^10.0.0", + "remark-preset-wooorm": "^9.0.0", + "rimraf": "^3.0.0", + "tape": "^5.0.0", + "type-coverage": "^2.0.0", + "typescript": "^4.0.0", + "xo": "^0.46.0" + }, + "scripts": { + "prepublishOnly": "npm run build && npm run format", + "build": "rimraf \"*.d.ts\" && tsc && type-coverage", + "format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix", + "test-api": "node --conditions development test.js", + "test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov npm run test-api", + "test": "npm run build && npm run format && npm run test-coverage" + }, + "prettier": { + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "bracketSpacing": false, + "semi": false, + "trailingComma": "none" + }, + "xo": { + "prettier": true + }, + "remarkConfig": { + "plugins": [ + "preset-wooorm" + ] + }, + "typeCoverage": { + "atLeast": 100, + "detail": true, + "strict": true, + "ignoreCatch": true + } +} diff --git a/node_modules/is-decimal/readme.md b/node_modules/is-decimal/readme.md new file mode 100644 index 0000000..1595537 --- /dev/null +++ b/node_modules/is-decimal/readme.md @@ -0,0 +1,139 @@ +# is-decimal + +[![Build][build-badge]][build] +[![Coverage][coverage-badge]][coverage] +[![Downloads][downloads-badge]][downloads] +[![Size][size-badge]][size] + +Check if a character is a decimal. + +## Contents + +* [What is this?](#what-is-this) +* [When should I use this?](#when-should-i-use-this) +* [Install](#install) +* [Use](#use) +* [API](#api) + * [`isDecimal(character|code)`](#isdecimalcharactercode) +* [Types](#types) +* [Compatibility](#compatibility) +* [Security](#security) +* [Related](#related) +* [Contribute](#contribute) +* [License](#license) + +## What is this? + +This is a function that checks if a given character is an ASCII decimal. + +## When should I use this? + +Not often, as it’s relatively simple to do yourself. +This package exists because it’s needed in several related packages, at which +point it becomes useful to defer to one shared function. + +## Install + +This package is [ESM only][esm]. +In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: + +```sh +npm install is-decimal +``` + +In Deno with [Skypack][]: + +```js +import {isDecimal} from 'https://cdn.skypack.dev/is-decimal@2?dts' +``` + +In browsers with [Skypack][]: + +```html + +``` + +## Use + +```js +import {isDecimal} from 'is-decimal' + +isDecimal('0') // => true +isDecimal('9') // => true +isDecimal('a') // => false +isDecimal('💩') // => false +``` + +## API + +This package exports the following identifiers: `isDecimal`. +There is no default export. + +### `isDecimal(character|code)` + +Check whether the given character code (`number`), or the character code at the +first position (`string`), is decimal. + +## Types + +This package is fully typed with [TypeScript][]. + +## Compatibility + +This package is at least compatible with all maintained versions of Node.js. +As of now, that is Node.js 12.20+, 14.14+, and 16.0+. +It also works in Deno and modern browsers. + +## Security + +This package is safe. + +## Related + +* [`wooorm/is-alphabetical`](https://github.com/wooorm/is-alphabetical) +* [`wooorm/is-hexadecimal`](https://github.com/wooorm/is-hexadecimal) +* [`wooorm/is-whitespace-character`](https://github.com/wooorm/is-whitespace-character) +* [`wooorm/is-word-character`](https://github.com/wooorm/is-word-character) + +## Contribute + +Yes please! +See [How to Contribute to Open Source][contribute]. + +## License + +[MIT][license] © [Titus Wormer][author] + + + +[build-badge]: https://github.com/wooorm/is-decimal/workflows/main/badge.svg + +[build]: https://github.com/wooorm/is-decimal/actions + +[coverage-badge]: https://img.shields.io/codecov/c/github/wooorm/is-decimal.svg + +[coverage]: https://codecov.io/github/wooorm/is-decimal + +[downloads-badge]: https://img.shields.io/npm/dm/is-decimal.svg + +[downloads]: https://www.npmjs.com/package/is-decimal + +[size-badge]: https://img.shields.io/bundlephobia/minzip/is-decimal.svg + +[size]: https://bundlephobia.com/result?p=is-decimal + +[npm]: https://docs.npmjs.com/cli/install + +[skypack]: https://www.skypack.dev + +[license]: license + +[author]: https://wooorm.com + +[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + +[typescript]: https://www.typescriptlang.org + +[contribute]: https://opensource.guide/how-to-contribute/ diff --git a/node_modules/is-extendable/LICENSE b/node_modules/is-extendable/LICENSE new file mode 100644 index 0000000..65f90ac --- /dev/null +++ b/node_modules/is-extendable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015, 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/is-extendable/README.md b/node_modules/is-extendable/README.md new file mode 100644 index 0000000..e4cfaeb --- /dev/null +++ b/node_modules/is-extendable/README.md @@ -0,0 +1,72 @@ +# is-extendable [![NPM version](https://badge.fury.io/js/is-extendable.svg)](http://badge.fury.io/js/is-extendable) + +> Returns true if a value is any of the object types: array, regexp, plain object, function or date. This is useful for determining if a value can be extended, e.g. "can the value have keys?" + +## Install + +Install with [npm](https://www.npmjs.com/) + +```sh +$ npm i is-extendable --save +``` + +## Usage + +```js +var isExtendable = require('is-extendable'); +``` + +Returns true if the value is any of the following: + +* `array` +* `regexp` +* `plain object` +* `function` +* `date` +* `error` + +## Notes + +All objects in JavaScript can have keys, but it's a pain to check for this, since we ether need to verify that the value is not `null` or `undefined` and: + +* the value is not a primitive, or +* that the object is an `object`, `function` + +Also note that an `extendable` object is not the same as an [extensible object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible), which is one that (in es6) is not sealed, frozen, or marked as non-extensible using `preventExtensions`. + +## Related projects + +* [assign-deep](https://github.com/jonschlinkert/assign-deep): Deeply assign the enumerable properties of source objects to a destination object. +* [extend-shallow](https://github.com/jonschlinkert/extend-shallow): Extend an object with the properties of additional objects. node.js/javascript util. +* [isobject](https://github.com/jonschlinkert/isobject): Returns true if the value is an object and not an array or null. +* [is-plain-object](https://github.com/jonschlinkert/is-plain-object): Returns true if an object was created by the `Object` constructor. +* [is-equal-shallow](https://github.com/jonschlinkert/is-equal-shallow): Does a shallow comparison of two objects, returning false if the keys or values differ. +* [kind-of](https://github.com/jonschlinkert/kind-of): Get the native type of a value. + +## Running tests + +Install dev dependencies: + +```sh +$ npm i -d && npm test +``` + +## Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](https://github.com/jonschlinkert/is-extendable/issues/new) + +## Author + +**Jon Schlinkert** + ++ [github/jonschlinkert](https://github.com/jonschlinkert) ++ [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +## License + +Copyright © 2015 Jon Schlinkert +Released under the MIT license. + +*** + +_This file was generated by [verb-cli](https://github.com/assemble/verb-cli) on July 04, 2015._ \ No newline at end of file diff --git a/node_modules/is-extendable/index.js b/node_modules/is-extendable/index.js new file mode 100644 index 0000000..4ee71a4 --- /dev/null +++ b/node_modules/is-extendable/index.js @@ -0,0 +1,13 @@ +/*! + * is-extendable + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +module.exports = function isExtendable(val) { + return typeof val !== 'undefined' && val !== null + && (typeof val === 'object' || typeof val === 'function'); +}; diff --git a/node_modules/is-extendable/package.json b/node_modules/is-extendable/package.json new file mode 100644 index 0000000..5dd006e --- /dev/null +++ b/node_modules/is-extendable/package.json @@ -0,0 +1,51 @@ +{ + "name": "is-extendable", + "description": "Returns true if a value is any of the object types: array, regexp, plain object, function or date. This is useful for determining if a value can be extended, e.g. \"can the value have keys?\"", + "version": "0.1.1", + "homepage": "https://github.com/jonschlinkert/is-extendable", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/is-extendable", + "bugs": { + "url": "https://github.com/jonschlinkert/is-extendable/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "*" + }, + "keywords": [ + "array", + "assign", + "check", + "date", + "extend", + "extensible", + "function", + "is", + "object", + "regex", + "test" + ], + "verbiage": { + "related": { + "list": [ + "isobject", + "is-plain-object", + "kind-of", + "is-extendable", + "is-equal-shallow", + "extend-shallow", + "assign-deep" + ] + } + } +} diff --git a/node_modules/is-extglob/LICENSE b/node_modules/is-extglob/LICENSE new file mode 100644 index 0000000..842218c --- /dev/null +++ b/node_modules/is-extglob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, 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/is-extglob/README.md b/node_modules/is-extglob/README.md new file mode 100644 index 0000000..0416af5 --- /dev/null +++ b/node_modules/is-extglob/README.md @@ -0,0 +1,107 @@ +# is-extglob [![NPM version](https://img.shields.io/npm/v/is-extglob.svg?style=flat)](https://www.npmjs.com/package/is-extglob) [![NPM downloads](https://img.shields.io/npm/dm/is-extglob.svg?style=flat)](https://npmjs.org/package/is-extglob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-extglob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-extglob) + +> Returns true if a string has an extglob. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-extglob +``` + +## Usage + +```js +var isExtglob = require('is-extglob'); +``` + +**True** + +```js +isExtglob('?(abc)'); +isExtglob('@(abc)'); +isExtglob('!(abc)'); +isExtglob('*(abc)'); +isExtglob('+(abc)'); +``` + +**False** + +Escaped extglobs: + +```js +isExtglob('\\?(abc)'); +isExtglob('\\@(abc)'); +isExtglob('\\!(abc)'); +isExtglob('\\*(abc)'); +isExtglob('\\+(abc)'); +``` + +Everything else... + +```js +isExtglob('foo.js'); +isExtglob('!foo.js'); +isExtglob('*.js'); +isExtglob('**/abc.js'); +isExtglob('abc/*.js'); +isExtglob('abc/(aaa|bbb).js'); +isExtglob('abc/[a-z].js'); +isExtglob('abc/{a,b}.js'); +isExtglob('abc/?.js'); +isExtglob('abc.js'); +isExtglob('abc/def/ghi.js'); +``` + +## History + +**v2.0** + +Adds support for escaping. Escaped exglobs no longer return true. + +## About + +### Related projects + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 12, 2016._ \ No newline at end of file diff --git a/node_modules/is-extglob/index.js b/node_modules/is-extglob/index.js new file mode 100644 index 0000000..c1d986f --- /dev/null +++ b/node_modules/is-extglob/index.js @@ -0,0 +1,20 @@ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function isExtglob(str) { + if (typeof str !== 'string' || str === '') { + return false; + } + + var match; + while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { + if (match[2]) return true; + str = str.slice(match.index + match[0].length); + } + + return false; +}; diff --git a/node_modules/is-extglob/package.json b/node_modules/is-extglob/package.json new file mode 100644 index 0000000..7a90836 --- /dev/null +++ b/node_modules/is-extglob/package.json @@ -0,0 +1,69 @@ +{ + "name": "is-extglob", + "description": "Returns true if a string has an extglob.", + "version": "2.1.1", + "homepage": "https://github.com/jonschlinkert/is-extglob", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/is-extglob", + "bugs": { + "url": "https://github.com/jonschlinkert/is-extglob/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "gulp-format-md": "^0.1.10", + "mocha": "^3.0.2" + }, + "keywords": [ + "bash", + "braces", + "check", + "exec", + "expression", + "extglob", + "glob", + "globbing", + "globstar", + "is", + "match", + "matches", + "pattern", + "regex", + "regular", + "string", + "test" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "has-glob", + "is-glob", + "micromatch" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/is-glob/LICENSE b/node_modules/is-glob/LICENSE new file mode 100644 index 0000000..3f2eca1 --- /dev/null +++ b/node_modules/is-glob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, 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/is-glob/README.md b/node_modules/is-glob/README.md new file mode 100644 index 0000000..740724b --- /dev/null +++ b/node_modules/is-glob/README.md @@ -0,0 +1,206 @@ +# is-glob [![NPM version](https://img.shields.io/npm/v/is-glob.svg?style=flat)](https://www.npmjs.com/package/is-glob) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![NPM total downloads](https://img.shields.io/npm/dt/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![Build Status](https://img.shields.io/github/workflow/status/micromatch/is-glob/dev)](https://github.com/micromatch/is-glob/actions) + +> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-glob +``` + +You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob). + +## Usage + +```js +var isGlob = require('is-glob'); +``` + +### Default behavior + +**True** + +Patterns that have glob characters or regex patterns will return `true`: + +```js +isGlob('!foo.js'); +isGlob('*.js'); +isGlob('**/abc.js'); +isGlob('abc/*.js'); +isGlob('abc/(aaa|bbb).js'); +isGlob('abc/[a-z].js'); +isGlob('abc/{a,b}.js'); +//=> true +``` + +Extglobs + +```js +isGlob('abc/@(a).js'); +isGlob('abc/!(a).js'); +isGlob('abc/+(a).js'); +isGlob('abc/*(a).js'); +isGlob('abc/?(a).js'); +//=> true +``` + +**False** + +Escaped globs or extglobs return `false`: + +```js +isGlob('abc/\\@(a).js'); +isGlob('abc/\\!(a).js'); +isGlob('abc/\\+(a).js'); +isGlob('abc/\\*(a).js'); +isGlob('abc/\\?(a).js'); +isGlob('\\!foo.js'); +isGlob('\\*.js'); +isGlob('\\*\\*/abc.js'); +isGlob('abc/\\*.js'); +isGlob('abc/\\(aaa|bbb).js'); +isGlob('abc/\\[a-z].js'); +isGlob('abc/\\{a,b}.js'); +//=> false +``` + +Patterns that do not have glob patterns return `false`: + +```js +isGlob('abc.js'); +isGlob('abc/def/ghi.js'); +isGlob('foo.js'); +isGlob('abc/@.js'); +isGlob('abc/+.js'); +isGlob('abc/?.js'); +isGlob(); +isGlob(null); +//=> false +``` + +Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)): + +```js +isGlob(['**/*.js']); +isGlob(['foo.js']); +//=> false +``` + +### Option strict + +When `options.strict === false` the behavior is less strict in determining if a pattern is a glob. Meaning that +some patterns that would return `false` may return `true`. This is done so that matching libraries like [micromatch](https://github.com/micromatch/micromatch) have a chance at determining if the pattern is a glob or not. + +**True** + +Patterns that have glob characters or regex patterns will return `true`: + +```js +isGlob('!foo.js', {strict: false}); +isGlob('*.js', {strict: false}); +isGlob('**/abc.js', {strict: false}); +isGlob('abc/*.js', {strict: false}); +isGlob('abc/(aaa|bbb).js', {strict: false}); +isGlob('abc/[a-z].js', {strict: false}); +isGlob('abc/{a,b}.js', {strict: false}); +//=> true +``` + +Extglobs + +```js +isGlob('abc/@(a).js', {strict: false}); +isGlob('abc/!(a).js', {strict: false}); +isGlob('abc/+(a).js', {strict: false}); +isGlob('abc/*(a).js', {strict: false}); +isGlob('abc/?(a).js', {strict: false}); +//=> true +``` + +**False** + +Escaped globs or extglobs return `false`: + +```js +isGlob('\\!foo.js', {strict: false}); +isGlob('\\*.js', {strict: false}); +isGlob('\\*\\*/abc.js', {strict: false}); +isGlob('abc/\\*.js', {strict: false}); +isGlob('abc/\\(aaa|bbb).js', {strict: false}); +isGlob('abc/\\[a-z].js', {strict: false}); +isGlob('abc/\\{a,b}.js', {strict: false}); +//=> false +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +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 +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit") +* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks") +* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.") +* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 47 | [jonschlinkert](https://github.com/jonschlinkert) | +| 5 | [doowb](https://github.com/doowb) | +| 1 | [phated](https://github.com/phated) | +| 1 | [danhper](https://github.com/danhper) | +| 1 | [paulmillr](https://github.com/paulmillr) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on March 27, 2019._ \ No newline at end of file diff --git a/node_modules/is-glob/index.js b/node_modules/is-glob/index.js new file mode 100644 index 0000000..620f563 --- /dev/null +++ b/node_modules/is-glob/index.js @@ -0,0 +1,150 @@ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +var isExtglob = require('is-extglob'); +var chars = { '{': '}', '(': ')', '[': ']'}; +var strictCheck = function(str) { + if (str[0] === '!') { + return true; + } + var index = 0; + var pipeIndex = -2; + var closeSquareIndex = -2; + var closeCurlyIndex = -2; + var closeParenIndex = -2; + var backSlashIndex = -2; + while (index < str.length) { + if (str[index] === '*') { + return true; + } + + if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) { + return true; + } + + if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') { + if (closeSquareIndex < index) { + closeSquareIndex = str.indexOf(']', index); + } + if (closeSquareIndex > index) { + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + } + } + + if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') { + closeCurlyIndex = str.indexOf('}', index); + if (closeCurlyIndex > index) { + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { + return true; + } + } + } + + if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') { + closeParenIndex = str.indexOf(')', index); + if (closeParenIndex > index) { + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + + if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') { + if (pipeIndex < index) { + pipeIndex = str.indexOf('|', index); + } + if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') { + closeParenIndex = str.indexOf(')', pipeIndex); + if (closeParenIndex > pipeIndex) { + backSlashIndex = str.indexOf('\\', pipeIndex); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + } + + if (str[index] === '\\') { + var open = str[index + 1]; + index += 2; + var close = chars[open]; + + if (close) { + var n = str.indexOf(close, index); + if (n !== -1) { + index = n + 1; + } + } + + if (str[index] === '!') { + return true; + } + } else { + index++; + } + } + return false; +}; + +var relaxedCheck = function(str) { + if (str[0] === '!') { + return true; + } + var index = 0; + while (index < str.length) { + if (/[*?{}()[\]]/.test(str[index])) { + return true; + } + + if (str[index] === '\\') { + var open = str[index + 1]; + index += 2; + var close = chars[open]; + + if (close) { + var n = str.indexOf(close, index); + if (n !== -1) { + index = n + 1; + } + } + + if (str[index] === '!') { + return true; + } + } else { + index++; + } + } + return false; +}; + +module.exports = function isGlob(str, options) { + if (typeof str !== 'string' || str === '') { + return false; + } + + if (isExtglob(str)) { + return true; + } + + var check = strictCheck; + + // optionally relax check + if (options && options.strict === false) { + check = relaxedCheck; + } + + return check(str); +}; diff --git a/node_modules/is-glob/package.json b/node_modules/is-glob/package.json new file mode 100644 index 0000000..858af03 --- /dev/null +++ b/node_modules/is-glob/package.json @@ -0,0 +1,81 @@ +{ + "name": "is-glob", + "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.", + "version": "4.0.3", + "homepage": "https://github.com/micromatch/is-glob", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Daniel Perez (https://tuvistavie.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/is-glob", + "bugs": { + "url": "https://github.com/micromatch/is-glob/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha && node benchmark.js" + }, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "devDependencies": { + "gulp-format-md": "^0.1.10", + "mocha": "^3.0.2" + }, + "keywords": [ + "bash", + "braces", + "check", + "exec", + "expression", + "extglob", + "glob", + "globbing", + "globstar", + "is", + "match", + "matches", + "pattern", + "regex", + "regular", + "string", + "test" + ], + "verb": { + "layout": "default", + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assemble", + "base", + "update", + "verb" + ] + }, + "reflinks": [ + "assemble", + "bach", + "base", + "composer", + "gulp", + "has-glob", + "is-valid-glob", + "micromatch", + "npm", + "scaffold", + "verb", + "vinyl" + ] + } +} diff --git a/node_modules/is-json/.npmignore b/node_modules/is-json/.npmignore new file mode 100644 index 0000000..b0e8ee7 --- /dev/null +++ b/node_modules/is-json/.npmignore @@ -0,0 +1,12 @@ +.*.swp +._* +.DS_Store +.git +.hg +.lock-wscript +.svn +.wafpickle-* +CVS +npm-debug.log +*.sublime-project +*.sublime-workspace \ No newline at end of file diff --git a/node_modules/is-json/.travis.yml b/node_modules/is-json/.travis.yml new file mode 100644 index 0000000..250e5ab --- /dev/null +++ b/node_modules/is-json/.travis.yml @@ -0,0 +1,14 @@ + language: node_js + node_js: + - "0.12" + - "0.10" + - "0.8" + branches: + only: + - master + notifications: + email: + - joaquim.serafim@gmail.com + script: npm test + before_install: + - npm install -g npm@~1.4.6 diff --git a/node_modules/is-json/LICENSE b/node_modules/is-json/LICENSE new file mode 100644 index 0000000..7773e29 --- /dev/null +++ b/node_modules/is-json/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Joaquim José F. Serafim + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, 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/is-json/README.md b/node_modules/is-json/README.md new file mode 100644 index 0000000..2fea1b4 --- /dev/null +++ b/node_modules/is-json/README.md @@ -0,0 +1,41 @@ +# is-json + + + +[![Build Status](https://travis-ci.org/joaquimserafim/is-json.png?branch=master)](https://travis-ci.org/joaquimserafim/is-json) + + +check if a string is a valid JSON string without using Try/Catch and is a JSON object + + + +**V1.2** + + +isJSON(str*, [passObjects=bool]) + +*with `passObjects = true` can pass a JSON object in `str`, default to `false` + + + var isJSON = require('is-json'); + + var good_json = '{"a":"obja","b":[0,1,2],"c":{"d":"some object"}}'; + var bad_json = '{"a":"obja""b":[0,1,2],"c":{"d":"some object"}}'; + var str_number = '121212'; + + + console.log(isJSON(good_json)); // true + console.log(isJSON(bad_json)); // false + console.log(isJSON(str_number)); // false + + + + // check is an object + + var object = {a: 12, b: [1,2,3]}; + + console.log(isJSON(object, true)); // true + + // can use isJSON.strict (uses try/catch) if wants something more robust + + console.log(isJSON.strict('{\n "config": 123,\n "test": "abcde" \n}')); // true diff --git a/node_modules/is-json/index.js b/node_modules/is-json/index.js new file mode 100644 index 0000000..2a09a3a --- /dev/null +++ b/node_modules/is-json/index.js @@ -0,0 +1,48 @@ +'use strict' + +module.exports = isJSON; +isJSON.strict = strict; + +function isJSON (str, pass_object) { + if (pass_object && isObject(str)) return true; + + if (!isString(str)) return false; + + str = str.replace(/\s/g, '').replace(/\n|\r/, ''); + + if (/^\{(.*?)\}$/.test(str)) + return /"(.*?)":(.*?)/g.test(str); + + if (/^\[(.*?)\]$/.test(str)) { + return str.replace(/^\[/, '') + .replace(/\]$/, '') + .replace(/},{/g, '}\n{') + .split(/\n/) + .map(function (s) { return isJSON(s); }) + .reduce(function (prev, curr) { return !!curr; }); + } + + return false; +} + + +function strict (str) { + if (isObject(str)) { + return true; + } + + try { + return JSON.parse(str) && true; + } catch (ex) { + return false; + } +} + +function isString (x) { + return Object.prototype.toString.call(x) === '[object String]'; +} + +function isObject (obj) { + return Object.prototype.toString.call(obj) === '[object Object]'; +} + diff --git a/node_modules/is-json/package.json b/node_modules/is-json/package.json new file mode 100644 index 0000000..75ac1af --- /dev/null +++ b/node_modules/is-json/package.json @@ -0,0 +1,29 @@ +{ + "name": "is-json", + "version": "2.0.1", + "description": "check if a string is a valid JSON string without using Try/Catch", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "node test" + }, + "repository": { + "type": "git", + "url": "git@github.com:joaquimserafim/is-json.git" + }, + "keywords": [ + "JSON", + "validation" + ], + "author": "@joaquimserafim", + "license": "ISC", + "bugs": { + "url": "https://github.com/joaquimserafim/is-json/issues" + }, + "homepage": "https://github.com/joaquimserafim/is-json", + "devDependencies": { + "tape": "^2.13.1" + } +} diff --git a/node_modules/is-json/test/index.js b/node_modules/is-json/test/index.js new file mode 100644 index 0000000..134d614 --- /dev/null +++ b/node_modules/is-json/test/index.js @@ -0,0 +1,33 @@ +var test = require('tape'); +var isJSON = require('../'); + + +test('performe isJSON verifications', function (assert) { + assert.deepEqual(isJSON('asdada[]asdadada sd asdasda das das'), false, '`asdada[]asdadada sd asdasda das das`, should return false'); + assert.deepEqual(isJSON(null), false, '`null`, should return false'); + assert.deepEqual(isJSON(false), false, '`false`, should return false'); + assert.deepEqual(isJSON(''), false, '`\'\'`, should return false'); + assert.deepEqual(isJSON('normal string'), false, '\'normal string\', should return false'); + assert.deepEqual(isJSON(2014), false, '`2014`, should return false'); + assert.deepEqual(isJSON(2014.5), false, '`2014.5`, should return false'); + assert.deepEqual(isJSON([1,2,3,4]), false, '`[1,2,3,4]`, should return false'); + assert.deepEqual(isJSON({a: 12, b: [1,2,3]}), false, 'a JSON object `{a: 12, b: [1,2,3]},`, should return false'); + assert.deepEqual(isJSON({a: 12, b: [1,2,3]}, true), true, + 'a JSON object `{a: 12, b: [1,2,3]}` but pass the 2 arg as true (check objects too), should return true'); + assert.deepEqual(isJSON('{"a":"obja","b":[0,1,2],"c":{"d":"some object"}}'), true, + '`{"a":"obja","b":[0,1,2],"c":{"d":"some object"}}`, should return true'); + assert.deepEqual(isJSON('1,2,3'), false, '`1,2,3`, should return false'); + assert.deepEqual(isJSON('{1,2,3}'), false, '`{1,2,3}`, should return false'); + assert.deepEqual(isJSON('[{"a": 123}, {1,2,3}}]'), false, '`[{"a": 123, {1,2,3}}]`, should return false'); + var cobj = '[{"a": {"aa": [1,2,3,4], "aaa": {"d": 1212}}}, {"b": "test", "c": [1,2,3], "date": "' + new Date() + '"}]'; + + assert.deepEqual(isJSON(cobj), true, cobj + ', should return true'); + assert.deepEqual(isJSON(new Date()), false, '`Date`, should return false'); + assert.deepEqual(isJSON.strict('{\n "config": 123,\n "test": "abcde" \n}'), true, '`{\n "config": 123,\n "test": "abcde" \n}`, should return true'); + assert.deepEqual( + isJSON.strict({a: 1}), + true, + 'should return true when passing a js object into `strict`' + ); + assert.end(); +}); diff --git a/node_modules/is-number/LICENSE b/node_modules/is-number/LICENSE new file mode 100644 index 0000000..9af4a67 --- /dev/null +++ b/node_modules/is-number/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-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/is-number/README.md b/node_modules/is-number/README.md new file mode 100644 index 0000000..eb8149e --- /dev/null +++ b/node_modules/is-number/README.md @@ -0,0 +1,187 @@ +# is-number [![NPM version](https://img.shields.io/npm/v/is-number.svg?style=flat)](https://www.npmjs.com/package/is-number) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![NPM total downloads](https://img.shields.io/npm/dt/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-number.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-number) + +> Returns true if the value is a finite number. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-number +``` + +## Why is this needed? + +In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use `+`, `-`, or `Number()` to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results: + +```js +console.log(+[]); //=> 0 +console.log(+''); //=> 0 +console.log(+' '); //=> 0 +console.log(typeof NaN); //=> 'number' +``` + +This library offers a performant way to smooth out edge cases like these. + +## Usage + +```js +const isNumber = require('is-number'); +``` + +See the [tests](./test.js) for more examples. + +### true + +```js +isNumber(5e3); // true +isNumber(0xff); // true +isNumber(-1.1); // true +isNumber(0); // true +isNumber(1); // true +isNumber(1.1); // true +isNumber(10); // true +isNumber(10.10); // true +isNumber(100); // true +isNumber('-1.1'); // true +isNumber('0'); // true +isNumber('012'); // true +isNumber('0xff'); // true +isNumber('1'); // true +isNumber('1.1'); // true +isNumber('10'); // true +isNumber('10.10'); // true +isNumber('100'); // true +isNumber('5e3'); // true +isNumber(parseInt('012')); // true +isNumber(parseFloat('012')); // true +``` + +### False + +Everything else is false, as you would expect: + +```js +isNumber(Infinity); // false +isNumber(NaN); // false +isNumber(null); // false +isNumber(undefined); // false +isNumber(''); // false +isNumber(' '); // false +isNumber('foo'); // false +isNumber([1]); // false +isNumber([]); // false +isNumber(function () {}); // false +isNumber({}); // false +``` + +## Release history + +### 7.0.0 + +* Refactor. Now uses `.isFinite` if it exists. +* Performance is about the same as v6.0 when the value is a string or number. But it's now 3x-4x faster when the value is not a string or number. + +### 6.0.0 + +* Optimizations, thanks to @benaadams. + +### 5.0.0 + +**Breaking changes** + +* removed support for `instanceof Number` and `instanceof String` + +## Benchmarks + +As with all benchmarks, take these with a grain of salt. See the [benchmarks](./benchmark/index.js) for more detail. + +``` +# all +v7.0 x 413,222 ops/sec ±2.02% (86 runs sampled) +v6.0 x 111,061 ops/sec ±1.29% (85 runs sampled) +parseFloat x 317,596 ops/sec ±1.36% (86 runs sampled) +fastest is 'v7.0' + +# string +v7.0 x 3,054,496 ops/sec ±1.05% (89 runs sampled) +v6.0 x 2,957,781 ops/sec ±0.98% (88 runs sampled) +parseFloat x 3,071,060 ops/sec ±1.13% (88 runs sampled) +fastest is 'parseFloat,v7.0' + +# number +v7.0 x 3,146,895 ops/sec ±0.89% (89 runs sampled) +v6.0 x 3,214,038 ops/sec ±1.07% (89 runs sampled) +parseFloat x 3,077,588 ops/sec ±1.07% (87 runs sampled) +fastest is 'v6.0' +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +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 +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 49 | [jonschlinkert](https://github.com/jonschlinkert) | +| 5 | [charlike-old](https://github.com/charlike-old) | +| 1 | [benaadams](https://github.com/benaadams) | +| 1 | [realityking](https://github.com/realityking) | + +### Author + +**Jon Schlinkert** + +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 15, 2018._ \ No newline at end of file diff --git a/node_modules/is-number/index.js b/node_modules/is-number/index.js new file mode 100644 index 0000000..27f19b7 --- /dev/null +++ b/node_modules/is-number/index.js @@ -0,0 +1,18 @@ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function(num) { + if (typeof num === 'number') { + return num - num === 0; + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + } + return false; +}; diff --git a/node_modules/is-number/package.json b/node_modules/is-number/package.json new file mode 100644 index 0000000..3715072 --- /dev/null +++ b/node_modules/is-number/package.json @@ -0,0 +1,82 @@ +{ + "name": "is-number", + "description": "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.", + "version": "7.0.0", + "homepage": "https://github.com/jonschlinkert/is-number", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Olsten Larck (https://i.am.charlike.online)", + "Rouven Weßling (www.rouvenwessling.de)" + ], + "repository": "jonschlinkert/is-number", + "bugs": { + "url": "https://github.com/jonschlinkert/is-number/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.12.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "ansi": "^0.3.1", + "benchmark": "^2.1.4", + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "cast", + "check", + "coerce", + "coercion", + "finite", + "integer", + "is", + "isnan", + "is-nan", + "is-num", + "is-number", + "isnumber", + "isfinite", + "istype", + "kind", + "math", + "nan", + "num", + "number", + "numeric", + "parseFloat", + "parseInt", + "test", + "type", + "typeof", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "related": { + "list": [ + "is-plain-object", + "is-primitive", + "isobject", + "kind-of" + ] + }, + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/isexe/.npmignore b/node_modules/isexe/.npmignore new file mode 100644 index 0000000..c1cb757 --- /dev/null +++ b/node_modules/isexe/.npmignore @@ -0,0 +1,2 @@ +.nyc_output/ +coverage/ diff --git a/node_modules/isexe/LICENSE b/node_modules/isexe/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/isexe/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, 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/isexe/README.md b/node_modules/isexe/README.md new file mode 100644 index 0000000..35769e8 --- /dev/null +++ b/node_modules/isexe/README.md @@ -0,0 +1,51 @@ +# isexe + +Minimal module to check if a file is executable, and a normal file. + +Uses `fs.stat` and tests against the `PATHEXT` environment variable on +Windows. + +## USAGE + +```javascript +var isexe = require('isexe') +isexe('some-file-name', function (err, isExe) { + if (err) { + console.error('probably file does not exist or something', err) + } else if (isExe) { + console.error('this thing can be run') + } else { + console.error('cannot be run') + } +}) + +// same thing but synchronous, throws errors +var isExe = isexe.sync('some-file-name') + +// treat errors as just "not executable" +isexe('maybe-missing-file', { ignoreErrors: true }, callback) +var isExe = isexe.sync('maybe-missing-file', { ignoreErrors: true }) +``` + +## API + +### `isexe(path, [options], [callback])` + +Check if the path is executable. If no callback provided, and a +global `Promise` object is available, then a Promise will be returned. + +Will raise whatever errors may be raised by `fs.stat`, unless +`options.ignoreErrors` is set to true. + +### `isexe.sync(path, [options])` + +Same as `isexe` but returns the value and throws any errors raised. + +### Options + +* `ignoreErrors` Treat all errors as "no, this is not executable", but + don't raise them. +* `uid` Number to use as the user id +* `gid` Number to use as the group id +* `pathExt` List of path extensions to use instead of `PATHEXT` + environment variable on Windows. diff --git a/node_modules/isexe/index.js b/node_modules/isexe/index.js new file mode 100644 index 0000000..553fb32 --- /dev/null +++ b/node_modules/isexe/index.js @@ -0,0 +1,57 @@ +var fs = require('fs') +var core +if (process.platform === 'win32' || global.TESTING_WINDOWS) { + core = require('./windows.js') +} else { + core = require('./mode.js') +} + +module.exports = isexe +isexe.sync = sync + +function isexe (path, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + + if (!cb) { + if (typeof Promise !== 'function') { + throw new TypeError('callback not provided') + } + + return new Promise(function (resolve, reject) { + isexe(path, options || {}, function (er, is) { + if (er) { + reject(er) + } else { + resolve(is) + } + }) + }) + } + + core(path, options || {}, function (er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === 'EACCES' || options && options.ignoreErrors) { + er = null + is = false + } + } + cb(er, is) + }) +} + +function sync (path, options) { + // my kingdom for a filtered catch + try { + return core.sync(path, options || {}) + } catch (er) { + if (options && options.ignoreErrors || er.code === 'EACCES') { + return false + } else { + throw er + } + } +} diff --git a/node_modules/isexe/mode.js b/node_modules/isexe/mode.js new file mode 100644 index 0000000..1995ea4 --- /dev/null +++ b/node_modules/isexe/mode.js @@ -0,0 +1,41 @@ +module.exports = isexe +isexe.sync = sync + +var fs = require('fs') + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), options) +} + +function checkStat (stat, options) { + return stat.isFile() && checkMode(stat, options) +} + +function checkMode (stat, options) { + var mod = stat.mode + var uid = stat.uid + var gid = stat.gid + + var myUid = options.uid !== undefined ? + options.uid : process.getuid && process.getuid() + var myGid = options.gid !== undefined ? + options.gid : process.getgid && process.getgid() + + var u = parseInt('100', 8) + var g = parseInt('010', 8) + var o = parseInt('001', 8) + var ug = u | g + + var ret = (mod & o) || + (mod & g) && gid === myGid || + (mod & u) && uid === myUid || + (mod & ug) && myUid === 0 + + return ret +} diff --git a/node_modules/isexe/package.json b/node_modules/isexe/package.json new file mode 100644 index 0000000..e452689 --- /dev/null +++ b/node_modules/isexe/package.json @@ -0,0 +1,31 @@ +{ + "name": "isexe", + "version": "2.0.0", + "description": "Minimal module to check if a file is executable.", + "main": "index.js", + "directories": { + "test": "test" + }, + "devDependencies": { + "mkdirp": "^0.5.1", + "rimraf": "^2.5.0", + "tap": "^10.3.0" + }, + "scripts": { + "test": "tap test/*.js --100", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/isexe.git" + }, + "keywords": [], + "bugs": { + "url": "https://github.com/isaacs/isexe/issues" + }, + "homepage": "https://github.com/isaacs/isexe#readme" +} diff --git a/node_modules/isexe/test/basic.js b/node_modules/isexe/test/basic.js new file mode 100644 index 0000000..d926df6 --- /dev/null +++ b/node_modules/isexe/test/basic.js @@ -0,0 +1,221 @@ +var t = require('tap') +var fs = require('fs') +var path = require('path') +var fixture = path.resolve(__dirname, 'fixtures') +var meow = fixture + '/meow.cat' +var mine = fixture + '/mine.cat' +var ours = fixture + '/ours.cat' +var fail = fixture + '/fail.false' +var noent = fixture + '/enoent.exe' +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') + +var isWindows = process.platform === 'win32' +var hasAccess = typeof fs.access === 'function' +var winSkip = isWindows && 'windows' +var accessSkip = !hasAccess && 'no fs.access function' +var hasPromise = typeof Promise === 'function' +var promiseSkip = !hasPromise && 'no global Promise' + +function reset () { + delete require.cache[require.resolve('../')] + return require('../') +} + +t.test('setup fixtures', function (t) { + rimraf.sync(fixture) + mkdirp.sync(fixture) + fs.writeFileSync(meow, '#!/usr/bin/env cat\nmeow\n') + fs.chmodSync(meow, parseInt('0755', 8)) + fs.writeFileSync(fail, '#!/usr/bin/env false\n') + fs.chmodSync(fail, parseInt('0644', 8)) + fs.writeFileSync(mine, '#!/usr/bin/env cat\nmine\n') + fs.chmodSync(mine, parseInt('0744', 8)) + fs.writeFileSync(ours, '#!/usr/bin/env cat\nours\n') + fs.chmodSync(ours, parseInt('0754', 8)) + t.end() +}) + +t.test('promise', { skip: promiseSkip }, function (t) { + var isexe = reset() + t.test('meow async', function (t) { + isexe(meow).then(function (is) { + t.ok(is) + t.end() + }) + }) + t.test('fail async', function (t) { + isexe(fail).then(function (is) { + t.notOk(is) + t.end() + }) + }) + t.test('noent async', function (t) { + isexe(noent).catch(function (er) { + t.ok(er) + t.end() + }) + }) + t.test('noent ignore async', function (t) { + isexe(noent, { ignoreErrors: true }).then(function (is) { + t.notOk(is) + t.end() + }) + }) + t.end() +}) + +t.test('no promise', function (t) { + global.Promise = null + var isexe = reset() + t.throws('try to meow a promise', function () { + isexe(meow) + }) + t.end() +}) + +t.test('access', { skip: accessSkip || winSkip }, function (t) { + runTest(t) +}) + +t.test('mode', { skip: winSkip }, function (t) { + delete fs.access + delete fs.accessSync + var isexe = reset() + t.ok(isexe.sync(ours, { uid: 0, gid: 0 })) + t.ok(isexe.sync(mine, { uid: 0, gid: 0 })) + runTest(t) +}) + +t.test('windows', function (t) { + global.TESTING_WINDOWS = true + var pathExt = '.EXE;.CAT;.CMD;.COM' + t.test('pathExt option', function (t) { + runTest(t, { pathExt: '.EXE;.CAT;.CMD;.COM' }) + }) + t.test('pathExt env', function (t) { + process.env.PATHEXT = pathExt + runTest(t) + }) + t.test('no pathExt', function (t) { + // with a pathExt of '', any filename is fine. + // so the "fail" one would still pass. + runTest(t, { pathExt: '', skipFail: true }) + }) + t.test('pathext with empty entry', function (t) { + // with a pathExt of '', any filename is fine. + // so the "fail" one would still pass. + runTest(t, { pathExt: ';' + pathExt, skipFail: true }) + }) + t.end() +}) + +t.test('cleanup', function (t) { + rimraf.sync(fixture) + t.end() +}) + +function runTest (t, options) { + var isexe = reset() + + var optionsIgnore = Object.create(options || {}) + optionsIgnore.ignoreErrors = true + + if (!options || !options.skipFail) { + t.notOk(isexe.sync(fail, options)) + } + t.notOk(isexe.sync(noent, optionsIgnore)) + if (!options) { + t.ok(isexe.sync(meow)) + } else { + t.ok(isexe.sync(meow, options)) + } + + t.ok(isexe.sync(mine, options)) + t.ok(isexe.sync(ours, options)) + t.throws(function () { + isexe.sync(noent, options) + }) + + t.test('meow async', function (t) { + if (!options) { + isexe(meow, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + } else { + isexe(meow, options, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + } + }) + + t.test('mine async', function (t) { + isexe(mine, options, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + }) + + t.test('ours async', function (t) { + isexe(ours, options, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + }) + + if (!options || !options.skipFail) { + t.test('fail async', function (t) { + isexe(fail, options, function (er, is) { + if (er) { + throw er + } + t.notOk(is) + t.end() + }) + }) + } + + t.test('noent async', function (t) { + isexe(noent, options, function (er, is) { + t.ok(er) + t.notOk(is) + t.end() + }) + }) + + t.test('noent ignore async', function (t) { + isexe(noent, optionsIgnore, function (er, is) { + if (er) { + throw er + } + t.notOk(is) + t.end() + }) + }) + + t.test('directory is not executable', function (t) { + isexe(__dirname, options, function (er, is) { + if (er) { + throw er + } + t.notOk(is) + t.end() + }) + }) + + t.end() +} diff --git a/node_modules/isexe/windows.js b/node_modules/isexe/windows.js new file mode 100644 index 0000000..3499673 --- /dev/null +++ b/node_modules/isexe/windows.js @@ -0,0 +1,42 @@ +module.exports = isexe +isexe.sync = sync + +var fs = require('fs') + +function checkPathExt (path, options) { + var pathext = options.pathExt !== undefined ? + options.pathExt : process.env.PATHEXT + + if (!pathext) { + return true + } + + pathext = pathext.split(';') + if (pathext.indexOf('') !== -1) { + return true + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase() + if (p && path.substr(-p.length).toLowerCase() === p) { + return true + } + } + return false +} + +function checkStat (stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) { + return false + } + return checkPathExt(path, options) +} + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, path, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), path, options) +} diff --git a/node_modules/iso-639-1/.eslintrc b/node_modules/iso-639-1/.eslintrc new file mode 100644 index 0000000..1ae9ef8 --- /dev/null +++ b/node_modules/iso-639-1/.eslintrc @@ -0,0 +1,38 @@ +{ + // 基于 airbnb 规则 + "extends": "airbnb", + // 使用 babel 解析器,支持一些还没有进入 ES6+ 标准的特性。比如 class property + "parser": "babel-eslint", + // 解析 webpack alias 中的模块名 + "settings": { + "import/resolver": "webpack" + }, + "env": { + "browser": true + }, + "rules": { + "no-plusplus": [ + "error", + { + // 允许 for 循环中的 i++ + "allowForLoopAfterthoughts": true + } + ], + "no-param-reassign": [ + "error", + { + // 允许修改参数的属性 + "props": false + } + ], + // 允许在循环里使用 await + "no-await-in-loop": 0, + // 允许在一个表达式里使用多种操作符,否则与 prettier 冲突 + // see https://github.com/prettier/eslint-config-prettier#no-mixed-operators + "no-mixed-operators": 0, + // 允许在 jsx 中使用 bind + "react/jsx-no-bind": 0, + // 允许所有类型的 proptype + "react/forbid-prop-types": 0 + } +} \ No newline at end of file diff --git a/node_modules/iso-639-1/.nvmrc b/node_modules/iso-639-1/.nvmrc new file mode 100644 index 0000000..ddc9289 --- /dev/null +++ b/node_modules/iso-639-1/.nvmrc @@ -0,0 +1 @@ +14.17 \ No newline at end of file diff --git a/node_modules/iso-639-1/.prettierrc b/node_modules/iso-639-1/.prettierrc new file mode 100644 index 0000000..dcb7279 --- /dev/null +++ b/node_modules/iso-639-1/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/node_modules/iso-639-1/.travis.yml b/node_modules/iso-639-1/.travis.yml new file mode 100644 index 0000000..734ba64 --- /dev/null +++ b/node_modules/iso-639-1/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - '8.0' + - '6.1' +script: + - npm run test \ No newline at end of file diff --git a/node_modules/iso-639-1/.vscode/settings.json b/node_modules/iso-639-1/.vscode/settings.json new file mode 100644 index 0000000..d563084 --- /dev/null +++ b/node_modules/iso-639-1/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "eslint.enable": true, + "eslint.packageManager": "yarn", + "prettier.eslintIntegration": true +} \ No newline at end of file diff --git a/node_modules/iso-639-1/CHANGELOG.md b/node_modules/iso-639-1/CHANGELOG.md new file mode 100644 index 0000000..edcadb4 --- /dev/null +++ b/node_modules/iso-639-1/CHANGELOG.md @@ -0,0 +1,79 @@ +# iso-639-1 Changelog + +## v3.1.5 + +- ISO6391.validate() type predicate [#87](https://github.com/meikidd/iso-639-1/pull/87) + +## v3.1.4 + +- Fix native language name for Czech and Slovak [#86](https://github.com/meikidd/iso-639-1/issues/86) + +## v3.1.3 + +- Remove unnecessary diacritics [#84](https://github.com/meikidd/iso-639-1/pull/84) + +## v3.1.2 + +- Capitalize Faroese native [#82](https://github.com/meikidd/iso-639-1/pull/82) + +## v3.1.1 + +- Capitalize Danish native [#80](https://github.com/meikidd/iso-639-1/pull/80) + +## v3.1.0 + +- Fix type for getCode [#74](https://github.com/meikidd/iso-639-1/pull/74) +- Improve performance [#72](https://github.com/meikidd/iso-639-1/pull/72) + +## v3.0.1 + +- Fix error TS7016 [#68](https://github.com/meikidd/iso-639-1/issues/68) + +## v3.0.0 + +- Export ESM module [#67](https://github.com/meikidd/iso-639-1/issues/67) + +## v2.1.15 + +- Change parameters type "LanguageCode" to "string" + +## v2.1.14 + +- Bump async from 2.6.0 to 2.6.4 [#53](https://github.com/meikidd/iso-639-1/pull/53) +- Add a type to list the langage codes in the TS definition file [#55](https://github.com/meikidd/iso-639-1/pull/55) + +## v2.1.13 + +- update Arabic native name [#50](https://github.com/meikidd/iso-639-1/pull/50) + +## v2.1.12 + +- remove 'bh' [#51](https://github.com/meikidd/iso-639-1/pull/51) +- fj native name changed to "vosa Vakaviti" [#51](https://github.com/meikidd/iso-639-1/pull/51) +- dv native name changed to "ދިވެހި" [#51](https://github.com/meikidd/iso-639-1/pull/51) +- lo native name changed to "ພາສາລາວ" [#51](https://github.com/meikidd/iso-639-1/pull/51) +- ms native name changed to "Bahasa Melayu" [#51](https://github.com/meikidd/iso-639-1/pull/51) +- lu native name changed to "Kiluba" [#51](https://github.com/meikidd/iso-639-1/pull/51) +- na native name changed to "Dorerin Naoero" [#51](https://github.com/meikidd/iso-639-1/pull/51) +- tk native name changed to "Türkmençe" [#51](https://github.com/meikidd/iso-639-1/pull/51) + +## v2.1.11 + +- Slovenian native name "slovenski jezik" -> "slovenščina" [#49](https://github.com/meikidd/iso-639-1/pull/49) + +## v2.1.10 + +- Polish native name "język polski" -> "Polski" [#48](https://github.com/meikidd/iso-639-1/pull/48) + +## v2.1.9 + +- Change hu native name "Magyar" -> "magyar" [#40](https://github.com/meikidd/iso-639-1/pull/40) + +## v2.1.8 + +- Change hr native name "hrvatski jezik" -> "Hrvatski" +- Change sl English name "Slovene" -> "Slovenian" + +## v2.1.0 + +- Correctly handle prototype property names passed as codes [#20](https://github.com/meikidd/iso-639-1/issues/20) diff --git a/node_modules/iso-639-1/LICENSE b/node_modules/iso-639-1/LICENSE new file mode 100644 index 0000000..8e3035e --- /dev/null +++ b/node_modules/iso-639-1/LICENSE @@ -0,0 +1,21 @@ +This software is licensed under the MIT License. + +Copyright(c) by Mei Qingguang + +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. \ No newline at end of file diff --git a/node_modules/iso-639-1/build/index.js b/node_modules/iso-639-1/build/index.js new file mode 100644 index 0000000..7be6caa --- /dev/null +++ b/node_modules/iso-639-1/build/index.js @@ -0,0 +1 @@ +var ISO6391;(()=>{var a={814:a=>{a.exports={aa:{name:"Afar",nativeName:"Afaraf"},ab:{name:"Abkhaz",nativeName:"аҧсуа бызшәа"},ae:{name:"Avestan",nativeName:"avesta"},af:{name:"Afrikaans",nativeName:"Afrikaans"},ak:{name:"Akan",nativeName:"Akan"},am:{name:"Amharic",nativeName:"አማርኛ"},an:{name:"Aragonese",nativeName:"aragonés"},ar:{name:"Arabic",nativeName:"العربية"},as:{name:"Assamese",nativeName:"অসমীয়া"},av:{name:"Avaric",nativeName:"авар мацӀ"},ay:{name:"Aymara",nativeName:"aymar aru"},az:{name:"Azerbaijani",nativeName:"azərbaycan dili"},ba:{name:"Bashkir",nativeName:"башҡорт теле"},be:{name:"Belarusian",nativeName:"беларуская мова"},bg:{name:"Bulgarian",nativeName:"български език"},bi:{name:"Bislama",nativeName:"Bislama"},bm:{name:"Bambara",nativeName:"bamanankan"},bn:{name:"Bengali",nativeName:"বাংলা"},bo:{name:"Tibetan",nativeName:"བོད་ཡིག"},br:{name:"Breton",nativeName:"brezhoneg"},bs:{name:"Bosnian",nativeName:"bosanski jezik"},ca:{name:"Catalan",nativeName:"Català"},ce:{name:"Chechen",nativeName:"нохчийн мотт"},ch:{name:"Chamorro",nativeName:"Chamoru"},co:{name:"Corsican",nativeName:"corsu"},cr:{name:"Cree",nativeName:"ᓀᐦᐃᔭᐍᐏᐣ"},cs:{name:"Czech",nativeName:"Čeština"},cu:{name:"Old Church Slavonic",nativeName:"ѩзыкъ словѣньскъ"},cv:{name:"Chuvash",nativeName:"чӑваш чӗлхи"},cy:{name:"Welsh",nativeName:"Cymraeg"},da:{name:"Danish",nativeName:"Dansk"},de:{name:"German",nativeName:"Deutsch"},dv:{name:"Divehi",nativeName:"ދިވެހި"},dz:{name:"Dzongkha",nativeName:"རྫོང་ཁ"},ee:{name:"Ewe",nativeName:"Eʋegbe"},el:{name:"Greek",nativeName:"Ελληνικά"},en:{name:"English",nativeName:"English"},eo:{name:"Esperanto",nativeName:"Esperanto"},es:{name:"Spanish",nativeName:"Español"},et:{name:"Estonian",nativeName:"eesti"},eu:{name:"Basque",nativeName:"euskara"},fa:{name:"Persian",nativeName:"فارسی"},ff:{name:"Fula",nativeName:"Fulfulde"},fi:{name:"Finnish",nativeName:"suomi"},fj:{name:"Fijian",nativeName:"vosa Vakaviti"},fo:{name:"Faroese",nativeName:"Føroyskt"},fr:{name:"French",nativeName:"Français"},fy:{name:"Western Frisian",nativeName:"Frysk"},ga:{name:"Irish",nativeName:"Gaeilge"},gd:{name:"Scottish Gaelic",nativeName:"Gàidhlig"},gl:{name:"Galician",nativeName:"galego"},gn:{name:"Guaraní",nativeName:"Avañe'ẽ"},gu:{name:"Gujarati",nativeName:"ગુજરાતી"},gv:{name:"Manx",nativeName:"Gaelg"},ha:{name:"Hausa",nativeName:"هَوُسَ"},he:{name:"Hebrew",nativeName:"עברית"},hi:{name:"Hindi",nativeName:"हिन्दी"},ho:{name:"Hiri Motu",nativeName:"Hiri Motu"},hr:{name:"Croatian",nativeName:"Hrvatski"},ht:{name:"Haitian",nativeName:"Kreyòl ayisyen"},hu:{name:"Hungarian",nativeName:"magyar"},hy:{name:"Armenian",nativeName:"Հայերեն"},hz:{name:"Herero",nativeName:"Otjiherero"},ia:{name:"Interlingua",nativeName:"Interlingua"},id:{name:"Indonesian",nativeName:"Bahasa Indonesia"},ie:{name:"Interlingue",nativeName:"Interlingue"},ig:{name:"Igbo",nativeName:"Asụsụ Igbo"},ii:{name:"Nuosu",nativeName:"ꆈꌠ꒿ Nuosuhxop"},ik:{name:"Inupiaq",nativeName:"Iñupiaq"},io:{name:"Ido",nativeName:"Ido"},is:{name:"Icelandic",nativeName:"Íslenska"},it:{name:"Italian",nativeName:"Italiano"},iu:{name:"Inuktitut",nativeName:"ᐃᓄᒃᑎᑐᑦ"},ja:{name:"Japanese",nativeName:"日本語"},jv:{name:"Javanese",nativeName:"basa Jawa"},ka:{name:"Georgian",nativeName:"ქართული"},kg:{name:"Kongo",nativeName:"Kikongo"},ki:{name:"Kikuyu",nativeName:"Gĩkũyũ"},kj:{name:"Kwanyama",nativeName:"Kuanyama"},kk:{name:"Kazakh",nativeName:"қазақ тілі"},kl:{name:"Kalaallisut",nativeName:"kalaallisut"},km:{name:"Khmer",nativeName:"ខេមរភាសា"},kn:{name:"Kannada",nativeName:"ಕನ್ನಡ"},ko:{name:"Korean",nativeName:"한국어"},kr:{name:"Kanuri",nativeName:"Kanuri"},ks:{name:"Kashmiri",nativeName:"कश्मीरी"},ku:{name:"Kurdish",nativeName:"Kurdî"},kv:{name:"Komi",nativeName:"коми кыв"},kw:{name:"Cornish",nativeName:"Kernewek"},ky:{name:"Kyrgyz",nativeName:"Кыргызча"},la:{name:"Latin",nativeName:"latine"},lb:{name:"Luxembourgish",nativeName:"Lëtzebuergesch"},lg:{name:"Ganda",nativeName:"Luganda"},li:{name:"Limburgish",nativeName:"Limburgs"},ln:{name:"Lingala",nativeName:"Lingála"},lo:{name:"Lao",nativeName:"ພາສາລາວ"},lt:{name:"Lithuanian",nativeName:"lietuvių kalba"},lu:{name:"Luba-Katanga",nativeName:"Kiluba"},lv:{name:"Latvian",nativeName:"latviešu valoda"},mg:{name:"Malagasy",nativeName:"fiteny malagasy"},mh:{name:"Marshallese",nativeName:"Kajin M̧ajeļ"},mi:{name:"Māori",nativeName:"te reo Māori"},mk:{name:"Macedonian",nativeName:"македонски јазик"},ml:{name:"Malayalam",nativeName:"മലയാളം"},mn:{name:"Mongolian",nativeName:"Монгол хэл"},mr:{name:"Marathi",nativeName:"मराठी"},ms:{name:"Malay",nativeName:"Bahasa Melayu"},mt:{name:"Maltese",nativeName:"Malti"},my:{name:"Burmese",nativeName:"ဗမာစာ"},na:{name:"Nauru",nativeName:"Dorerin Naoero"},nb:{name:"Norwegian Bokmål",nativeName:"Norsk bokmål"},nd:{name:"Northern Ndebele",nativeName:"isiNdebele"},ne:{name:"Nepali",nativeName:"नेपाली"},ng:{name:"Ndonga",nativeName:"Owambo"},nl:{name:"Dutch",nativeName:"Nederlands"},nn:{name:"Norwegian Nynorsk",nativeName:"Norsk nynorsk"},no:{name:"Norwegian",nativeName:"Norsk"},nr:{name:"Southern Ndebele",nativeName:"isiNdebele"},nv:{name:"Navajo",nativeName:"Diné bizaad"},ny:{name:"Chichewa",nativeName:"chiCheŵa"},oc:{name:"Occitan",nativeName:"occitan"},oj:{name:"Ojibwe",nativeName:"ᐊᓂᔑᓈᐯᒧᐎᓐ"},om:{name:"Oromo",nativeName:"Afaan Oromoo"},or:{name:"Oriya",nativeName:"ଓଡ଼ିଆ"},os:{name:"Ossetian",nativeName:"ирон æвзаг"},pa:{name:"Panjabi",nativeName:"ਪੰਜਾਬੀ"},pi:{name:"Pāli",nativeName:"पाऴि"},pl:{name:"Polish",nativeName:"Polski"},ps:{name:"Pashto",nativeName:"پښتو"},pt:{name:"Portuguese",nativeName:"Português"},qu:{name:"Quechua",nativeName:"Runa Simi"},rm:{name:"Romansh",nativeName:"rumantsch grischun"},rn:{name:"Kirundi",nativeName:"Ikirundi"},ro:{name:"Romanian",nativeName:"Română"},ru:{name:"Russian",nativeName:"Русский"},rw:{name:"Kinyarwanda",nativeName:"Ikinyarwanda"},sa:{name:"Sanskrit",nativeName:"संस्कृतम्"},sc:{name:"Sardinian",nativeName:"sardu"},sd:{name:"Sindhi",nativeName:"सिन्धी"},se:{name:"Northern Sami",nativeName:"Davvisámegiella"},sg:{name:"Sango",nativeName:"yângâ tî sängö"},si:{name:"Sinhala",nativeName:"සිංහල"},sk:{name:"Slovak",nativeName:"Slovenčina"},sl:{name:"Slovenian",nativeName:"slovenščina"},sm:{name:"Samoan",nativeName:"gagana fa'a Samoa"},sn:{name:"Shona",nativeName:"chiShona"},so:{name:"Somali",nativeName:"Soomaaliga"},sq:{name:"Albanian",nativeName:"Shqip"},sr:{name:"Serbian",nativeName:"српски језик"},ss:{name:"Swati",nativeName:"SiSwati"},st:{name:"Southern Sotho",nativeName:"Sesotho"},su:{name:"Sundanese",nativeName:"Basa Sunda"},sv:{name:"Swedish",nativeName:"Svenska"},sw:{name:"Swahili",nativeName:"Kiswahili"},ta:{name:"Tamil",nativeName:"தமிழ்"},te:{name:"Telugu",nativeName:"తెలుగు"},tg:{name:"Tajik",nativeName:"тоҷикӣ"},th:{name:"Thai",nativeName:"ไทย"},ti:{name:"Tigrinya",nativeName:"ትግርኛ"},tk:{name:"Turkmen",nativeName:"Türkmençe"},tl:{name:"Tagalog",nativeName:"Wikang Tagalog"},tn:{name:"Tswana",nativeName:"Setswana"},to:{name:"Tonga",nativeName:"faka Tonga"},tr:{name:"Turkish",nativeName:"Türkçe"},ts:{name:"Tsonga",nativeName:"Xitsonga"},tt:{name:"Tatar",nativeName:"татар теле"},tw:{name:"Twi",nativeName:"Twi"},ty:{name:"Tahitian",nativeName:"Reo Tahiti"},ug:{name:"Uyghur",nativeName:"ئۇيغۇرچە‎"},uk:{name:"Ukrainian",nativeName:"Українська"},ur:{name:"Urdu",nativeName:"اردو"},uz:{name:"Uzbek",nativeName:"Ўзбек"},ve:{name:"Venda",nativeName:"Tshivenḓa"},vi:{name:"Vietnamese",nativeName:"Tiếng Việt"},vo:{name:"Volapük",nativeName:"Volapük"},wa:{name:"Walloon",nativeName:"walon"},wo:{name:"Wolof",nativeName:"Wollof"},xh:{name:"Xhosa",nativeName:"isiXhosa"},yi:{name:"Yiddish",nativeName:"ייִדיש"},yo:{name:"Yoruba",nativeName:"Yorùbá"},za:{name:"Zhuang",nativeName:"Saɯ cueŋƅ"},zh:{name:"Chinese",nativeName:"中文"},zu:{name:"Zulu",nativeName:"isiZulu"}}},941:(a,e,n)=>{const m=n(814),i={},t={},v=[],N=[],s=[];for(const a in m){const{name:e,nativeName:n}=m[a];i[a]=t[e.toLowerCase()]=t[n.toLowerCase()]={code:a,name:e,nativeName:n},v.push(a),N.push(e),s.push(n)}a.exports=class a{static getLanguages(e=[]){return e.map((e=>a.validate(e)?Object.assign({},i[e]):{code:e,name:"",nativeName:""}))}static getName(e){return a.validate(e)?m[e].name:""}static getAllNames(){return N.slice()}static getNativeName(e){return a.validate(e)?m[e].nativeName:""}static getAllNativeNames(){return s.slice()}static getCode(a){return a=a.toLowerCase(),t.hasOwnProperty(a)?t[a].code:""}static getAllCodes(){return v.slice()}static validate(a){return m.hasOwnProperty(a)}}}},e={},n=function n(m){var i=e[m];if(void 0!==i)return i.exports;var t=e[m]={exports:{}};return a[m](t,t.exports,n),t.exports}(941);ISO6391=n})(); \ No newline at end of file diff --git a/node_modules/iso-639-1/index.d.ts b/node_modules/iso-639-1/index.d.ts new file mode 100644 index 0000000..aa7c5c4 --- /dev/null +++ b/node_modules/iso-639-1/index.d.ts @@ -0,0 +1,205 @@ +declare module 'iso-639-1' { + export type LanguageCode = + 'aa' + | 'ab' + | 'ae' + | 'af' + | 'ak' + | 'am' + | 'an' + | 'ar' + | 'as' + | 'av' + | 'ay' + | 'az' + | 'ba' + | 'be' + | 'bg' + | 'bi' + | 'bm' + | 'bn' + | 'bo' + | 'br' + | 'bs' + | 'ca' + | 'ce' + | 'ch' + | 'co' + | 'cr' + | 'cs' + | 'cu' + | 'cv' + | 'cy' + | 'da' + | 'de' + | 'dv' + | 'dz' + | 'ee' + | 'el' + | 'en' + | 'eo' + | 'es' + | 'et' + | 'eu' + | 'fa' + | 'ff' + | 'fi' + | 'fj' + | 'fo' + | 'fr' + | 'fy' + | 'ga' + | 'gd' + | 'gl' + | 'gn' + | 'gu' + | 'gv' + | 'ha' + | 'he' + | 'hi' + | 'ho' + | 'hr' + | 'ht' + | 'hu' + | 'hy' + | 'hz' + | 'ia' + | 'id' + | 'ie' + | 'ig' + | 'ii' + | 'ik' + | 'io' + | 'is' + | 'it' + | 'iu' + | 'ja' + | 'jv' + | 'ka' + | 'kg' + | 'ki' + | 'kj' + | 'kk' + | 'kl' + | 'km' + | 'kn' + | 'ko' + | 'kr' + | 'ks' + | 'ku' + | 'kv' + | 'kw' + | 'ky' + | 'la' + | 'lb' + | 'lg' + | 'li' + | 'ln' + | 'lo' + | 'lt' + | 'lu' + | 'lv' + | 'mg' + | 'mh' + | 'mi' + | 'mk' + | 'ml' + | 'mn' + | 'mr' + | 'ms' + | 'mt' + | 'my' + | 'na' + | 'nb' + | 'nd' + | 'ne' + | 'ng' + | 'nl' + | 'nn' + | 'no' + | 'nr' + | 'nv' + | 'ny' + | 'oc' + | 'oj' + | 'om' + | 'or' + | 'os' + | 'pa' + | 'pi' + | 'pl' + | 'ps' + | 'pt' + | 'qu' + | 'rm' + | 'rn' + | 'ro' + | 'ru' + | 'rw' + | 'sa' + | 'sc' + | 'sd' + | 'se' + | 'sg' + | 'si' + | 'sk' + | 'sl' + | 'sm' + | 'sn' + | 'so' + | 'sq' + | 'sr' + | 'ss' + | 'st' + | 'su' + | 'sv' + | 'sw' + | 'ta' + | 'te' + | 'tg' + | 'th' + | 'ti' + | 'tk' + | 'tl' + | 'tn' + | 'to' + | 'tr' + | 'ts' + | 'tt' + | 'tw' + | 'ty' + | 'ug' + | 'uk' + | 'ur' + | 'uz' + | 've' + | 'vi' + | 'vo' + | 'wa' + | 'wo' + | 'xh' + | 'yi' + | 'yo' + | 'za' + | 'zh' + | 'zu' + + interface ISO6391 { + getName: (code: string) => string; + getAllNames: () => Array; + getNativeName: (code: string) => string; + getAllNativeNames: () => Array; + getCode: (name: string) => LanguageCode | ""; + getAllCodes: () => Array; + validate: (code: string) => code is LanguageCode; + getLanguages: (codes: Array) => Array<{ + code: LanguageCode; + name: string; + nativeName: string; + }>; + } + + let localeCode: ISO6391; + + export default localeCode; +} diff --git a/node_modules/iso-639-1/package.json b/node_modules/iso-639-1/package.json new file mode 100644 index 0000000..8542cfa --- /dev/null +++ b/node_modules/iso-639-1/package.json @@ -0,0 +1,41 @@ +{ + "name": "iso-639-1", + "version": "3.1.5", + "description": "ISO-639-1 codes", + "main": "./src/index.js", + "type": "commonjs", + "typings": "index.d.ts", + "scripts": { + "build": "webpack", + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/meikidd/iso-639-1.git" + }, + "keywords": [ + "iso", + "iso-639", + "iso-639-1", + "language", + "language code", + "locale", + "locale code" + ], + "author": "meikidd ", + "license": "MIT", + "bugs": { + "url": "https://github.com/meikidd/iso-639-1/issues" + }, + "devDependencies": { + "babel-loader": "^9.1.3", + "clean-webpack-plugin": "^4.0.0", + "mocha": "^4.0.1", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "homepage": "https://github.com/meikidd/iso-639-1#readme", + "engines": { + "node": ">=6.0" + } +} diff --git a/node_modules/iso-639-1/readme.md b/node_modules/iso-639-1/readme.md new file mode 100644 index 0000000..d32de7f --- /dev/null +++ b/node_modules/iso-639-1/readme.md @@ -0,0 +1,121 @@ +# ISO-639-1 +[![NPM Version][npm-image]][npm-url] +[![Build Status][travis-image]][travis-url] +[![Download Count][download-url]][npm-url] + +[travis-image]: https://travis-ci.org/meikidd/iso-639-1.svg?branch=master +[travis-url]: https://travis-ci.org/meikidd/iso-639-1 +[npm-image]: https://img.shields.io/npm/v/iso-639-1.svg?style=flat-square +[npm-url]: https://npmjs.org/package/iso-639-1 +[download-url]: https://img.shields.io/npm/dt/iso-639-1.svg?style=flat-square + + +Simple interface for [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) language codes + +## Installation + +``` +npm install iso-639-1 +``` + +## Usage + +### Node.js + +```javascript +const ISO6391 = require('iso-639-1'); +console.log(ISO6391.getName('en')); // 'English' +``` + +### ES Module + +```javascript +import ISO6391 from 'iso-639-1'; +console.log(ISO6391.getName('en')); // 'English' +``` + +### Browsers + +HTML + +```html + +``` + +Visit global variable ISO6391 in js + +```javascript +console.log(ISO6391.getName('en')); // 'English' +``` + +## Methods + +### getName(code) + - @param code {string} + - @return {string} + +Lookup language english name by code + +### getAllNames() + - @return {array} + +Get array of all language english names + +### getNativeName(code) + - @param code {string} + - @return {string} + +Lookup language native name by code + +### getAllNativeNames() + - @return {array} + +Get array of all language native names + + +### getCode(name) + - @param name {string} + - @return {string} + +Lookup code by english name or native name + +### getAllCodes() + - @return {array} + +Get array of all codes + +### validate(code) + - @param code {string} + - @return {boolean} + +Check whether the given code is in the list of [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) + +### getLanguages(codes) + - @param codes {array} + - @return {array} + +Get the array of the language objects by the given codes + +## Example + +``` +const ISO6391 = require('iso-639-1') + +console.log(ISO6391.getName('zh')) // 'Chinese' +console.log(ISO6391.getNativeName('zh')) // '中文' + +console.log(ISO6391.getAllNames()) // ['Afar','Abkhaz', ... ,'Zulu'] +console.log(ISO6391.getAllNativeNames()) //['Afaraf','аҧсуа бызшәа', ... ,'isiZulu' ] + +console.log(ISO6391.getCode('Chinese')) // 'zh' +console.log(ISO6391.getCode('中文')) // 'zh' + +console.log(ISO6391.getAllCodes()) //['aa','ab',...,'zu'] + +console.log(ISO6391.validate('en')) // true +console.log(ISO6391.validate('xx')) // false + +console.log(ISO6391.getLanguages(['en', 'zh'])) +// [{code:'en',name:'English',nativeName:'English'},{code:'zh',name:'Chinese',nativeName:'中文'}] + +``` diff --git a/node_modules/iso-639-1/src/data.js b/node_modules/iso-639-1/src/data.js new file mode 100644 index 0000000..6ebd424 --- /dev/null +++ b/node_modules/iso-639-1/src/data.js @@ -0,0 +1,736 @@ +const LANGUAGES_LIST = { + aa: { + name: 'Afar', + nativeName: 'Afaraf', + }, + ab: { + name: 'Abkhaz', + nativeName: 'аҧсуа бызшәа', + }, + ae: { + name: 'Avestan', + nativeName: 'avesta', + }, + af: { + name: 'Afrikaans', + nativeName: 'Afrikaans', + }, + ak: { + name: 'Akan', + nativeName: 'Akan', + }, + am: { + name: 'Amharic', + nativeName: 'አማርኛ', + }, + an: { + name: 'Aragonese', + nativeName: 'aragonés', + }, + ar: { + name: 'Arabic', + nativeName: 'العربية', + }, + as: { + name: 'Assamese', + nativeName: 'অসমীয়া', + }, + av: { + name: 'Avaric', + nativeName: 'авар мацӀ', + }, + ay: { + name: 'Aymara', + nativeName: 'aymar aru', + }, + az: { + name: 'Azerbaijani', + nativeName: 'azərbaycan dili', + }, + ba: { + name: 'Bashkir', + nativeName: 'башҡорт теле', + }, + be: { + name: 'Belarusian', + nativeName: 'беларуская мова', + }, + bg: { + name: 'Bulgarian', + nativeName: 'български език', + }, + bi: { + name: 'Bislama', + nativeName: 'Bislama', + }, + bm: { + name: 'Bambara', + nativeName: 'bamanankan', + }, + bn: { + name: 'Bengali', + nativeName: 'বাংলা', + }, + bo: { + name: 'Tibetan', + nativeName: 'བོད་ཡིག', + }, + br: { + name: 'Breton', + nativeName: 'brezhoneg', + }, + bs: { + name: 'Bosnian', + nativeName: 'bosanski jezik', + }, + ca: { + name: 'Catalan', + nativeName: 'Català', + }, + ce: { + name: 'Chechen', + nativeName: 'нохчийн мотт', + }, + ch: { + name: 'Chamorro', + nativeName: 'Chamoru', + }, + co: { + name: 'Corsican', + nativeName: 'corsu', + }, + cr: { + name: 'Cree', + nativeName: 'ᓀᐦᐃᔭᐍᐏᐣ', + }, + cs: { + name: 'Czech', + nativeName: 'Čeština', + }, + cu: { + name: 'Old Church Slavonic', + nativeName: 'ѩзыкъ словѣньскъ', + }, + cv: { + name: 'Chuvash', + nativeName: 'чӑваш чӗлхи', + }, + cy: { + name: 'Welsh', + nativeName: 'Cymraeg', + }, + da: { + name: 'Danish', + nativeName: 'Dansk', + }, + de: { + name: 'German', + nativeName: 'Deutsch', + }, + dv: { + name: 'Divehi', + nativeName: 'ދިވެހި', + }, + dz: { + name: 'Dzongkha', + nativeName: 'རྫོང་ཁ', + }, + ee: { + name: 'Ewe', + nativeName: 'Eʋegbe', + }, + el: { + name: 'Greek', + nativeName: 'Ελληνικά', + }, + en: { + name: 'English', + nativeName: 'English', + }, + eo: { + name: 'Esperanto', + nativeName: 'Esperanto', + }, + es: { + name: 'Spanish', + nativeName: 'Español', + }, + et: { + name: 'Estonian', + nativeName: 'eesti', + }, + eu: { + name: 'Basque', + nativeName: 'euskara', + }, + fa: { + name: 'Persian', + nativeName: 'فارسی', + }, + ff: { + name: 'Fula', + nativeName: 'Fulfulde', + }, + fi: { + name: 'Finnish', + nativeName: 'suomi', + }, + fj: { + name: 'Fijian', + nativeName: 'vosa Vakaviti', + }, + fo: { + name: 'Faroese', + nativeName: 'Føroyskt', + }, + fr: { + name: 'French', + nativeName: 'Français', + }, + fy: { + name: 'Western Frisian', + nativeName: 'Frysk', + }, + ga: { + name: 'Irish', + nativeName: 'Gaeilge', + }, + gd: { + name: 'Scottish Gaelic', + nativeName: 'Gàidhlig', + }, + gl: { + name: 'Galician', + nativeName: 'galego', + }, + gn: { + name: 'Guaraní', + nativeName: "Avañe'ẽ", + }, + gu: { + name: 'Gujarati', + nativeName: 'ગુજરાતી', + }, + gv: { + name: 'Manx', + nativeName: 'Gaelg', + }, + ha: { + name: 'Hausa', + nativeName: 'هَوُسَ', + }, + he: { + name: 'Hebrew', + nativeName: 'עברית', + }, + hi: { + name: 'Hindi', + nativeName: 'हिन्दी', + }, + ho: { + name: 'Hiri Motu', + nativeName: 'Hiri Motu', + }, + hr: { + name: 'Croatian', + nativeName: 'Hrvatski', + }, + ht: { + name: 'Haitian', + nativeName: 'Kreyòl ayisyen', + }, + hu: { + name: 'Hungarian', + nativeName: 'magyar', + }, + hy: { + name: 'Armenian', + nativeName: 'Հայերեն', + }, + hz: { + name: 'Herero', + nativeName: 'Otjiherero', + }, + ia: { + name: 'Interlingua', + nativeName: 'Interlingua', + }, + id: { + name: 'Indonesian', + nativeName: 'Bahasa Indonesia', + }, + ie: { + name: 'Interlingue', + nativeName: 'Interlingue', + }, + ig: { + name: 'Igbo', + nativeName: 'Asụsụ Igbo', + }, + ii: { + name: 'Nuosu', + nativeName: 'ꆈꌠ꒿ Nuosuhxop', + }, + ik: { + name: 'Inupiaq', + nativeName: 'Iñupiaq', + }, + io: { + name: 'Ido', + nativeName: 'Ido', + }, + is: { + name: 'Icelandic', + nativeName: 'Íslenska', + }, + it: { + name: 'Italian', + nativeName: 'Italiano', + }, + iu: { + name: 'Inuktitut', + nativeName: 'ᐃᓄᒃᑎᑐᑦ', + }, + ja: { + name: 'Japanese', + nativeName: '日本語', + }, + jv: { + name: 'Javanese', + nativeName: 'basa Jawa', + }, + ka: { + name: 'Georgian', + nativeName: 'ქართული', + }, + kg: { + name: 'Kongo', + nativeName: 'Kikongo', + }, + ki: { + name: 'Kikuyu', + nativeName: 'Gĩkũyũ', + }, + kj: { + name: 'Kwanyama', + nativeName: 'Kuanyama', + }, + kk: { + name: 'Kazakh', + nativeName: 'қазақ тілі', + }, + kl: { + name: 'Kalaallisut', + nativeName: 'kalaallisut', + }, + km: { + name: 'Khmer', + nativeName: 'ខេមរភាសា', + }, + kn: { + name: 'Kannada', + nativeName: 'ಕನ್ನಡ', + }, + ko: { + name: 'Korean', + nativeName: '한국어', + }, + kr: { + name: 'Kanuri', + nativeName: 'Kanuri', + }, + ks: { + name: 'Kashmiri', + nativeName: 'कश्मीरी', + }, + ku: { + name: 'Kurdish', + nativeName: 'Kurdî', + }, + kv: { + name: 'Komi', + nativeName: 'коми кыв', + }, + kw: { + name: 'Cornish', + nativeName: 'Kernewek', + }, + ky: { + name: 'Kyrgyz', + nativeName: 'Кыргызча', + }, + la: { + name: 'Latin', + nativeName: 'latine', + }, + lb: { + name: 'Luxembourgish', + nativeName: 'Lëtzebuergesch', + }, + lg: { + name: 'Ganda', + nativeName: 'Luganda', + }, + li: { + name: 'Limburgish', + nativeName: 'Limburgs', + }, + ln: { + name: 'Lingala', + nativeName: 'Lingála', + }, + lo: { + name: 'Lao', + nativeName: 'ພາສາລາວ', + }, + lt: { + name: 'Lithuanian', + nativeName: 'lietuvių kalba', + }, + lu: { + name: 'Luba-Katanga', + nativeName: 'Kiluba', + }, + lv: { + name: 'Latvian', + nativeName: 'latviešu valoda', + }, + mg: { + name: 'Malagasy', + nativeName: 'fiteny malagasy', + }, + mh: { + name: 'Marshallese', + nativeName: 'Kajin M̧ajeļ', + }, + mi: { + name: 'Māori', + nativeName: 'te reo Māori', + }, + mk: { + name: 'Macedonian', + nativeName: 'македонски јазик', + }, + ml: { + name: 'Malayalam', + nativeName: 'മലയാളം', + }, + mn: { + name: 'Mongolian', + nativeName: 'Монгол хэл', + }, + mr: { + name: 'Marathi', + nativeName: 'मराठी', + }, + ms: { + name: 'Malay', + nativeName: 'Bahasa Melayu', + }, + mt: { + name: 'Maltese', + nativeName: 'Malti', + }, + my: { + name: 'Burmese', + nativeName: 'ဗမာစာ', + }, + na: { + name: 'Nauru', + nativeName: 'Dorerin Naoero', + }, + nb: { + name: 'Norwegian Bokmål', + nativeName: 'Norsk bokmål', + }, + nd: { + name: 'Northern Ndebele', + nativeName: 'isiNdebele', + }, + ne: { + name: 'Nepali', + nativeName: 'नेपाली', + }, + ng: { + name: 'Ndonga', + nativeName: 'Owambo', + }, + nl: { + name: 'Dutch', + nativeName: 'Nederlands', + }, + nn: { + name: 'Norwegian Nynorsk', + nativeName: 'Norsk nynorsk', + }, + no: { + name: 'Norwegian', + nativeName: 'Norsk', + }, + nr: { + name: 'Southern Ndebele', + nativeName: 'isiNdebele', + }, + nv: { + name: 'Navajo', + nativeName: 'Diné bizaad', + }, + ny: { + name: 'Chichewa', + nativeName: 'chiCheŵa', + }, + oc: { + name: 'Occitan', + nativeName: 'occitan', + }, + oj: { + name: 'Ojibwe', + nativeName: 'ᐊᓂᔑᓈᐯᒧᐎᓐ', + }, + om: { + name: 'Oromo', + nativeName: 'Afaan Oromoo', + }, + or: { + name: 'Oriya', + nativeName: 'ଓଡ଼ିଆ', + }, + os: { + name: 'Ossetian', + nativeName: 'ирон æвзаг', + }, + pa: { + name: 'Panjabi', + nativeName: 'ਪੰਜਾਬੀ', + }, + pi: { + name: 'Pāli', + nativeName: 'पाऴि', + }, + pl: { + name: 'Polish', + nativeName: 'Polski', + }, + ps: { + name: 'Pashto', + nativeName: 'پښتو', + }, + pt: { + name: 'Portuguese', + nativeName: 'Português', + }, + qu: { + name: 'Quechua', + nativeName: 'Runa Simi', + }, + rm: { + name: 'Romansh', + nativeName: 'rumantsch grischun', + }, + rn: { + name: 'Kirundi', + nativeName: 'Ikirundi', + }, + ro: { + name: 'Romanian', + nativeName: 'Română', + }, + ru: { + name: 'Russian', + nativeName: 'Русский', + }, + rw: { + name: 'Kinyarwanda', + nativeName: 'Ikinyarwanda', + }, + sa: { + name: 'Sanskrit', + nativeName: 'संस्कृतम्', + }, + sc: { + name: 'Sardinian', + nativeName: 'sardu', + }, + sd: { + name: 'Sindhi', + nativeName: 'सिन्धी', + }, + se: { + name: 'Northern Sami', + nativeName: 'Davvisámegiella', + }, + sg: { + name: 'Sango', + nativeName: 'yângâ tî sängö', + }, + si: { + name: 'Sinhala', + nativeName: 'සිංහල', + }, + sk: { + name: 'Slovak', + nativeName: 'Slovenčina', + }, + sl: { + name: 'Slovenian', + nativeName: 'slovenščina', + }, + sm: { + name: 'Samoan', + nativeName: "gagana fa'a Samoa", + }, + sn: { + name: 'Shona', + nativeName: 'chiShona', + }, + so: { + name: 'Somali', + nativeName: 'Soomaaliga', + }, + sq: { + name: 'Albanian', + nativeName: 'Shqip', + }, + sr: { + name: 'Serbian', + nativeName: 'српски језик', + }, + ss: { + name: 'Swati', + nativeName: 'SiSwati', + }, + st: { + name: 'Southern Sotho', + nativeName: 'Sesotho', + }, + su: { + name: 'Sundanese', + nativeName: 'Basa Sunda', + }, + sv: { + name: 'Swedish', + nativeName: 'Svenska', + }, + sw: { + name: 'Swahili', + nativeName: 'Kiswahili', + }, + ta: { + name: 'Tamil', + nativeName: 'தமிழ்', + }, + te: { + name: 'Telugu', + nativeName: 'తెలుగు', + }, + tg: { + name: 'Tajik', + nativeName: 'тоҷикӣ', + }, + th: { + name: 'Thai', + nativeName: 'ไทย', + }, + ti: { + name: 'Tigrinya', + nativeName: 'ትግርኛ', + }, + tk: { + name: 'Turkmen', + nativeName: 'Türkmençe', + }, + tl: { + name: 'Tagalog', + nativeName: 'Wikang Tagalog', + }, + tn: { + name: 'Tswana', + nativeName: 'Setswana', + }, + to: { + name: 'Tonga', + nativeName: 'faka Tonga', + }, + tr: { + name: 'Turkish', + nativeName: 'Türkçe', + }, + ts: { + name: 'Tsonga', + nativeName: 'Xitsonga', + }, + tt: { + name: 'Tatar', + nativeName: 'татар теле', + }, + tw: { + name: 'Twi', + nativeName: 'Twi', + }, + ty: { + name: 'Tahitian', + nativeName: 'Reo Tahiti', + }, + ug: { + name: 'Uyghur', + nativeName: 'ئۇيغۇرچە‎', + }, + uk: { + name: 'Ukrainian', + nativeName: 'Українська', + }, + ur: { + name: 'Urdu', + nativeName: 'اردو', + }, + uz: { + name: 'Uzbek', + nativeName: 'Ўзбек', + }, + ve: { + name: 'Venda', + nativeName: 'Tshivenḓa', + }, + vi: { + name: 'Vietnamese', + nativeName: 'Tiếng Việt', + }, + vo: { + name: 'Volapük', + nativeName: 'Volapük', + }, + wa: { + name: 'Walloon', + nativeName: 'walon', + }, + wo: { + name: 'Wolof', + nativeName: 'Wollof', + }, + xh: { + name: 'Xhosa', + nativeName: 'isiXhosa', + }, + yi: { + name: 'Yiddish', + nativeName: 'ייִדיש', + }, + yo: { + name: 'Yoruba', + nativeName: 'Yorùbá', + }, + za: { + name: 'Zhuang', + nativeName: 'Saɯ cueŋƅ', + }, + zh: { + name: 'Chinese', + nativeName: '中文', + }, + zu: { + name: 'Zulu', + nativeName: 'isiZulu', + }, +}; + +module.exports = LANGUAGES_LIST; diff --git a/node_modules/iso-639-1/src/index.js b/node_modules/iso-639-1/src/index.js new file mode 100644 index 0000000..abfef8d --- /dev/null +++ b/node_modules/iso-639-1/src/index.js @@ -0,0 +1,59 @@ +const LANGUAGES_LIST = require('./data.js'); + +const LANGUAGES = {}; +const LANGUAGES_BY_NAME = {}; +const LANGUAGE_CODES = []; +const LANGUAGE_NAMES = []; +const LANGUAGE_NATIVE_NAMES = []; + +for (const code in LANGUAGES_LIST) { + const { name, nativeName } = LANGUAGES_LIST[code]; + LANGUAGES[code] = + LANGUAGES_BY_NAME[name.toLowerCase()] = + LANGUAGES_BY_NAME[nativeName.toLowerCase()] = + { code, name, nativeName }; + LANGUAGE_CODES.push(code); + LANGUAGE_NAMES.push(name); + LANGUAGE_NATIVE_NAMES.push(nativeName); +} + +module.exports = class ISO6391 { + static getLanguages(codes = []) { + return codes.map(code => + ISO6391.validate(code) + ? Object.assign({}, LANGUAGES[code]) + : { code, name: '', nativeName: '' } + ); + } + + static getName(code) { + return ISO6391.validate(code) ? LANGUAGES_LIST[code].name : ''; + } + + static getAllNames() { + return LANGUAGE_NAMES.slice(); + } + + static getNativeName(code) { + return ISO6391.validate(code) ? LANGUAGES_LIST[code].nativeName : ''; + } + + static getAllNativeNames() { + return LANGUAGE_NATIVE_NAMES.slice(); + } + + static getCode(name) { + name = name.toLowerCase(); + return LANGUAGES_BY_NAME.hasOwnProperty(name) + ? LANGUAGES_BY_NAME[name].code + : ''; + } + + static getAllCodes() { + return LANGUAGE_CODES.slice(); + } + + static validate(code) { + return LANGUAGES_LIST.hasOwnProperty(code); + } +} diff --git a/node_modules/iso-639-1/test/test.js b/node_modules/iso-639-1/test/test.js new file mode 100644 index 0000000..f8ff153 --- /dev/null +++ b/node_modules/iso-639-1/test/test.js @@ -0,0 +1,92 @@ +const assert = require('assert'); +const ISO6391 = require('../src/index'); + +describe('getName()', function() { + it('en', function() { + assert.equal(ISO6391.getName('en'), 'English'); + }); + it('zh', function() { + assert.equal(ISO6391.getName('zh'), 'Chinese'); + }); + it('xx', function() { + assert.equal(ISO6391.getName('xx'), ''); + }); + it('toString', function() { + assert.equal(ISO6391.getName('toString'), ''); + }); +}); + +describe('getNativeName()', function() { + it('en', function() { + assert.equal(ISO6391.getNativeName('en'), 'English'); + }); + it('zh', function() { + assert.equal(ISO6391.getNativeName('zh'), '中文'); + }); + it('xx', function() { + assert.equal(ISO6391.getNativeName('xx'), ''); + }); + it('toString', function() { + assert.equal(ISO6391.getNativeName('toString'), ''); + }); +}); + +describe('getCode()', function() { + it('English', function() { + assert.equal(ISO6391.getCode('English'), 'en'); + }); + it('Chinese', function() { + assert.equal(ISO6391.getCode('Chinese'), 'zh'); + }); + it('中文', function() { + assert.equal(ISO6391.getCode('中文'), 'zh'); + }); + it('xx', function() { + assert.equal(ISO6391.getCode('xx'), ''); + }); + it('toString', function() { + assert.equal(ISO6391.getCode('toString'), ''); + }); +}); + +describe('validate()', function() { + it('en', function() { + assert.equal(ISO6391.validate('en'), true); + }); + it('zh', function() { + assert.equal(ISO6391.validate('zh'), true); + }); + it('xx', function() { + assert.equal(ISO6391.validate('xx'), false); + }); + it('toString', function() { + assert.equal(ISO6391.validate('toString'), false); + }); +}); + +describe('getLanguages()', function() { + it('[en, zh, xx, toString]', function() { + assert.deepEqual(ISO6391.getLanguages(['en', 'zh', 'xx', 'toString']), [ + { + code: 'en', + name: 'English', + nativeName: 'English', + }, + { + code: 'zh', + name: 'Chinese', + nativeName: '中文', + }, + { + code: 'xx', + name: '', + nativeName: '', + }, + { + code: 'toString', + name: '', + nativeName: '', + }, + ]); + }); +}); diff --git a/node_modules/iso-639-1/webpack.config.js b/node_modules/iso-639-1/webpack.config.js new file mode 100644 index 0000000..1fff0a0 --- /dev/null +++ b/node_modules/iso-639-1/webpack.config.js @@ -0,0 +1,20 @@ +const path = require('path'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); + +// webpack configuration +let webpackConfig = { + mode: 'production', + entry: { + index: './src/index.js', + }, + output: { + path: path.resolve(__dirname, `./build`), + filename: '[name].js', + library: 'ISO6391', + }, + plugins: [ + new CleanWebpackPlugin(), + ], +}; + +module.exports = webpackConfig; diff --git a/node_modules/js-yaml/LICENSE b/node_modules/js-yaml/LICENSE new file mode 100644 index 0000000..09d3a29 --- /dev/null +++ b/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/js-yaml/README.md b/node_modules/js-yaml/README.md new file mode 100644 index 0000000..eeaf531 --- /dev/null +++ b/node_modules/js-yaml/README.md @@ -0,0 +1,247 @@ +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](https://nodeca.github.io/js-yaml/)__ + + +This is an implementation of [YAML](https://yaml.org/), a human-friendly data +serialization language. Started as [PyYAML](https://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: + https://www.yaml.org/spec/1.2/spec.html#id2802346 + - `JSON_SCHEMA` - all JSON-supported types: + https://www.yaml.org/spec/1.2/spec.html#id2803231 + - `CORE_SCHEMA` - same as `JSON_SCHEMA`: + https://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" + "empty" -> "" + +!!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](https://pyyaml.org/wiki/YAMLTagDiscussion) and +[YAML types repository](https://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/js-yaml/bin/js-yaml.js b/node_modules/js-yaml/bin/js-yaml.js new file mode 100755 index 0000000..a182f1a --- /dev/null +++ b/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/js-yaml/dist/js-yaml.js b/node_modules/js-yaml/dist/js-yaml.js new file mode 100644 index 0000000..21c52ec --- /dev/null +++ b/node_modules/js-yaml/dist/js-yaml.js @@ -0,0 +1,3880 @@ + +/*! js-yaml 4.1.1 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 + ); + } + + // set a property of a literal object, while protecting against prototype pollution, + // see https://github.com/nodeca/js-yaml/issues/164 for more details + function setProperty(object, key, value) { + // used for this specific key only because Object.defineProperty is slow + if (key === '__proto__') { + Object.defineProperty(object, key, { + configurable: true, + enumerable: true, + writable: true, + value: value + }); + } else { + object[key] = value; + } + } + + 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)) { + setProperty(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'); + } + + setProperty(_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/js-yaml/dist/js-yaml.min.js b/node_modules/js-yaml/dist/js-yaml.min.js new file mode 100644 index 0000000..8e7f766 --- /dev/null +++ b/node_modules/js-yaml/dist/js-yaml.min.js @@ -0,0 +1,2 @@ +/*! js-yaml 4.1.1 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"]}}),I=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var S=/^[-+]?[0-9]+e/;var O=new p("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!I.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),S.test(i)?i.replace("e",".e"):i},defaultStyle:"lowercase"}),j=b.extend({implicit:[A,v,x,O]}),T=j,N=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),F=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 E=new p("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==N.exec(e)||null!==F.exec(e))},construct:function(e){var t,n,i,r,o,a,l,c,s=0,u=null;if(null===(t=N.exec(e))&&(t=F.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 M=new p("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),L="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var _=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=L;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=L,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=L;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}}),D=Object.prototype.hasOwnProperty,U=Object.prototype.toString;var q=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))}function ae(e,t,n){"__proto__"===t?Object.defineProperty(e,t,{configurable:!0,enumerable:!0,writable:!0,value:n}):e[t]=n}for(var le=new Array(256),ce=new Array(256),se=0;se<256;se++)le[se]=re(se)?1:0,ce[se]=re(se);function ue(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||P,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 pe(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 fe(e,t){throw pe(e,t)}function de(e,t){e.onWarning&&e.onWarning.call(null,pe(e,t))}var he={YAML:function(e,t,n){var i,r,o;null!==e.version&&fe(e,"duplication of %YAML directive"),1!==n.length&&fe(e,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&fe(e,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&fe(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&de(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,r;2!==n.length&&fe(e,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],V.test(i)||fe(e,"ill-formed tag handle (first argument) of the TAG directive"),W.call(e.tagMap,i)&&fe(e,'there is a previously declared suffix for "'+i+'" tag handle'),Z.test(r)||fe(e,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(t){fe(e,"tag prefix is malformed: "+r)}e.tagMap[i]=r}};function ge(e,t,n,i){var r,o,a,l;if(t1&&(e.result+=n.repeat("\n",t-1))}function ke(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,fe(e,"tab characters must not be used in indentation")),45===i)&&X(e.input.charCodeAt(e.position+1));)if(l=!0,e.position++,Ae(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,Ie(e,t,3,!1,!0),a.push(e.result),Ae(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)fe(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),Ie(e,t,4,!0,r)&&(y?g=e.result:m=e.result),y||(ye(e,f,d,h,g,m,a,l,c),h=g=m=null),Ae(e,!0,-1),s=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==s)fe(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===o?fe(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?fe(e,"repeat of an indentation width identifier"):(u=t+o-1,s=!0)}if(z(a)){do{a=e.input.charCodeAt(++e.position)}while(z(a));if(35===a)do{a=e.input.charCodeAt(++e.position)}while(!Q(a)&&0!==a)}for(;0!==a;){for(be(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!s||e.lineIndentu&&(u=e.lineIndent),Q(a))p++;else{if(e.lineIndent0){for(r=a,o=0;r>0;r--)(a=te(l=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+a:fe(e,"expected hexadecimal character");e.result+=oe(o),e.position++}else fe(e,"unknown escape sequence");n=i=e.position}else Q(l)?(ge(e,n,i,!0),we(e,Ae(e,!1,t)),n=i=e.position):e.position===e.lineStart&&ve(e)?fe(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}fe(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&&!X(i)&&!ee(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&fe(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),W.call(e.anchorMap,n)||fe(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],Ae(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(X(u=e.input.charCodeAt(e.position))||ee(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)&&(X(i=e.input.charCodeAt(e.position+1))||n&&ee(i)))return!1;for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==u;){if(58===u){if(X(i=e.input.charCodeAt(e.position+1))||n&&ee(i))break}else if(35===u){if(X(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&ve(e)||n&&ee(u))break;if(Q(u)){if(l=e.line,c=e.lineStart,s=e.lineIndent,Ae(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&&(ge(e,r,o,!1),we(e,e.line-l),r=o=e.position,a=!1),z(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return ge(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||fe(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===g&&(y=c&&ke(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&&fe(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&&fe(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)):fe(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 Se(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))&&(Ae(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&&!X(r);)r=e.input.charCodeAt(++e.position);for(i=[],(n=e.input.slice(t,e.position)).length<1&&fe(e,"directive name must not be less than one character in length");0!==r;){for(;z(r);)r=e.input.charCodeAt(++e.position);if(35===r){do{r=e.input.charCodeAt(++e.position)}while(0!==r&&!Q(r));break}if(Q(r))break;for(t=e.position;0!==r&&!X(r);)r=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==r&&be(e),W.call(he,n)?he[n](e,n,i):de(e,'unknown document directive "'+n+'"')}Ae(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,Ae(e,!0,-1)):a&&fe(e,"directives end mark is expected"),Ie(e,e.lineIndent-1,4,!1,!0),Ae(e,!0,-1),e.checkLineBreaks&&$.test(e.input.slice(o,e.position))&&de(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&ve(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,Ae(e,!0,-1)):e.position=55296&&i<=56319&&t+1=56320&&n<=57343?1024*(i-55296)+n-56320+65536:i}function We(e){return/^\n* /.test(e)}function He(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=Re(s=Pe(e,0))&&s!==Fe&&!Ye(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!Ye(e)&&58!==e}(Pe(e,e.length-1));if(t||a)for(c=0;c=65536?c+=2:c++){if(!Re(u=Pe(e,c)))return 5;m=m&&Ke(u,p,l),p=u}else{for(c=0;c=65536?c+=2:c++){if(10===(u=Pe(e,c)))f=!0,h&&(d=d||c-g-1>i&&" "!==e[g+1],g=c);else if(!Re(u))return 5;m=m&&Ke(u,p,l),p=u}d=d||h&&c-g-1>i&&" "!==e[g+1]}return f||d?n>9&&We(e)?5:a?2===o?5:2:d?4:3:!m||a||r(e)?2===o?5:2:1}function $e(e,t,n,i,r){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''";if(!e.noCompatMode&&(-1!==Me.indexOf(t)||Le.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(He(t,c,e.indent,l,function(t){return function(e,t){var n,i;for(n=0,i=e.implicitTypes.length;n"+Ge(t,e.indent)+Ve(Ue(function(e,t){var n,i,r=/(\n+)([^\n]*)/g,o=(l=e.indexOf("\n"),l=-1!==l?l:e.length,r.lastIndex=l,Ze(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")+Ze(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=Pe(e,r),!(t=Ee[i])&&Re(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=t||_e(i);return n}(t)+'"';default:throw new o("impossible error: invalid scalar style")}}()}function Ge(e,t){var n=We(e)?String(t):"",i="\n"===e[e.length-1];return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function Ve(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Ze(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 Je(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 ze(e,t,n,i,r,a,l){e.tag=null,e.dump=n,Qe(e,n,!1)||Qe(e,n,!0);var c,s=Te.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+=qe(e,t)),ze(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?"":" "),ze(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?Je(e,t-1,e.dump,r):Je(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 Xe(e,t){var n,i,r=[],o=[];for(et(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 + ); +} + +// set a property of a literal object, while protecting against prototype pollution, +// see https://github.com/nodeca/js-yaml/issues/164 for more details +function setProperty(object, key, value) { + // used for this specific key only because Object.defineProperty is slow + if (key === '__proto__') { + Object.defineProperty(object, key, { + configurable: true, + enumerable: true, + writable: true, + value: value + }); + } else { + object[key] = value; + } +} + +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)) { + setProperty(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'); + } + + setProperty(_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 { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types }; diff --git a/node_modules/js-yaml/index.js b/node_modules/js-yaml/index.js new file mode 100644 index 0000000..bcb7eba --- /dev/null +++ b/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/js-yaml/lib/common.js b/node_modules/js-yaml/lib/common.js new file mode 100644 index 0000000..25ef7d8 --- /dev/null +++ b/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/js-yaml/lib/dumper.js b/node_modules/js-yaml/lib/dumper.js new file mode 100644 index 0000000..f357a6a --- /dev/null +++ b/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/js-yaml/lib/exception.js b/node_modules/js-yaml/lib/exception.js new file mode 100644 index 0000000..7f62daa --- /dev/null +++ b/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/js-yaml/lib/loader.js b/node_modules/js-yaml/lib/loader.js new file mode 100644 index 0000000..25abc80 --- /dev/null +++ b/node_modules/js-yaml/lib/loader.js @@ -0,0 +1,1733 @@ +'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 + ); +} + +// set a property of a literal object, while protecting against prototype pollution, +// see https://github.com/nodeca/js-yaml/issues/164 for more details +function setProperty(object, key, value) { + // used for this specific key only because Object.defineProperty is slow + if (key === '__proto__') { + Object.defineProperty(object, key, { + configurable: true, + enumerable: true, + writable: true, + value: value + }); + } else { + object[key] = value; + } +} + +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)) { + setProperty(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'); + } + + setProperty(_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/js-yaml/lib/schema.js b/node_modules/js-yaml/lib/schema.js new file mode 100644 index 0000000..65b41f4 --- /dev/null +++ b/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/js-yaml/lib/schema/core.js b/node_modules/js-yaml/lib/schema/core.js new file mode 100644 index 0000000..608b26d --- /dev/null +++ b/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/js-yaml/lib/schema/default.js b/node_modules/js-yaml/lib/schema/default.js new file mode 100644 index 0000000..3af0520 --- /dev/null +++ b/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/js-yaml/lib/schema/failsafe.js b/node_modules/js-yaml/lib/schema/failsafe.js new file mode 100644 index 0000000..b7a33eb --- /dev/null +++ b/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/js-yaml/lib/schema/json.js b/node_modules/js-yaml/lib/schema/json.js new file mode 100644 index 0000000..b73df78 --- /dev/null +++ b/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/js-yaml/lib/snippet.js b/node_modules/js-yaml/lib/snippet.js new file mode 100644 index 0000000..00e2133 --- /dev/null +++ b/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/js-yaml/lib/type.js b/node_modules/js-yaml/lib/type.js new file mode 100644 index 0000000..5e57877 --- /dev/null +++ b/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/js-yaml/lib/type/binary.js b/node_modules/js-yaml/lib/type/binary.js new file mode 100644 index 0000000..e152351 --- /dev/null +++ b/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/js-yaml/lib/type/bool.js b/node_modules/js-yaml/lib/type/bool.js new file mode 100644 index 0000000..cb77459 --- /dev/null +++ b/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/js-yaml/lib/type/float.js b/node_modules/js-yaml/lib/type/float.js new file mode 100644 index 0000000..74d77ec --- /dev/null +++ b/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/js-yaml/lib/type/int.js b/node_modules/js-yaml/lib/type/int.js new file mode 100644 index 0000000..3fe3a44 --- /dev/null +++ b/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/js-yaml/lib/type/map.js b/node_modules/js-yaml/lib/type/map.js new file mode 100644 index 0000000..f327bee --- /dev/null +++ b/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/js-yaml/lib/type/merge.js b/node_modules/js-yaml/lib/type/merge.js new file mode 100644 index 0000000..ae08a86 --- /dev/null +++ b/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/js-yaml/lib/type/null.js b/node_modules/js-yaml/lib/type/null.js new file mode 100644 index 0000000..315ca4e --- /dev/null +++ b/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/js-yaml/lib/type/omap.js b/node_modules/js-yaml/lib/type/omap.js new file mode 100644 index 0000000..b2b5323 --- /dev/null +++ b/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/js-yaml/lib/type/pairs.js b/node_modules/js-yaml/lib/type/pairs.js new file mode 100644 index 0000000..74b5240 --- /dev/null +++ b/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/js-yaml/lib/type/seq.js b/node_modules/js-yaml/lib/type/seq.js new file mode 100644 index 0000000..be8f77f --- /dev/null +++ b/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/js-yaml/lib/type/set.js b/node_modules/js-yaml/lib/type/set.js new file mode 100644 index 0000000..f885a32 --- /dev/null +++ b/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/js-yaml/lib/type/str.js b/node_modules/js-yaml/lib/type/str.js new file mode 100644 index 0000000..27acc10 --- /dev/null +++ b/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/js-yaml/lib/type/timestamp.js b/node_modules/js-yaml/lib/type/timestamp.js new file mode 100644 index 0000000..8fa9c58 --- /dev/null +++ b/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/js-yaml/package.json b/node_modules/js-yaml/package.json new file mode 100644 index 0000000..5bbd6c9 --- /dev/null +++ b/node_modules/js-yaml/package.json @@ -0,0 +1,66 @@ +{ + "name": "js-yaml", + "version": "4.1.1", + "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/junk/index.d.ts b/node_modules/junk/index.d.ts new file mode 100644 index 0000000..46dbded --- /dev/null +++ b/node_modules/junk/index.d.ts @@ -0,0 +1,40 @@ +declare const junk: { + /** + Returns `true` if `filename` matches a junk file. + */ + is(filename: string): boolean; + + /** + Returns `true` if `filename` doesn't match a junk file. + + @example + ``` + import {promisify} from 'util'; + import * as fs from 'fs'; + import junk = require('junk'); + + const pReaddir = promisify(fs.readdir); + + (async () => { + const files = await pReaddir('some/path'); + + console.log(files); + //=> ['.DS_Store', 'test.jpg'] + + console.log(files.filter(junk.not)); + //=> ['test.jpg'] + })(); + ``` + */ + not(filename: string): boolean; + + /** + Regex used for matching junk files. + */ + readonly regex: RegExp; + + // TODO: Remove this for the next major release + default: typeof junk; +}; + +export = junk; diff --git a/node_modules/junk/index.js b/node_modules/junk/index.js new file mode 100644 index 0000000..76efefa --- /dev/null +++ b/node_modules/junk/index.js @@ -0,0 +1,39 @@ +'use strict'; + +const blacklist = [ + // # All + '^npm-debug\\.log$', // Error log for npm + '^\\..*\\.swp$', // Swap file for vim state + + // # macOS + '^\\.DS_Store$', // Stores custom folder attributes + '^\\.AppleDouble$', // Stores additional file resources + '^\\.LSOverride$', // Contains the absolute path to the app to be used + '^Icon\\r$', // Custom Finder icon: http://superuser.com/questions/298785/icon-file-on-os-x-desktop + '^\\._.*', // Thumbnail + '^\\.Spotlight-V100(?:$|\\/)', // Directory that might appear on external disk + '\\.Trashes', // File that might appear on external disk + '^__MACOSX$', // Resource fork + + // # Linux + '~$', // Backup file + + // # Windows + '^Thumbs\\.db$', // Image file cache + '^ehthumbs\\.db$', // Folder config file + '^Desktop\\.ini$', // Stores custom folder attributes + '@eaDir$' // Synology Diskstation "hidden" folder where the server stores thumbnails +]; + +exports.re = () => { + throw new Error('`junk.re` was renamed to `junk.regex`'); +}; + +exports.regex = new RegExp(blacklist.join('|')); + +exports.is = filename => exports.regex.test(filename); + +exports.not = filename => !exports.is(filename); + +// TODO: Remove this for the next major release +exports.default = module.exports; diff --git a/node_modules/junk/license b/node_modules/junk/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/junk/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +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/junk/package.json b/node_modules/junk/package.json new file mode 100644 index 0000000..2c940f7 --- /dev/null +++ b/node_modules/junk/package.json @@ -0,0 +1,42 @@ +{ + "name": "junk", + "version": "3.1.0", + "description": "Filter out system junk files like .DS_Store and Thumbs.db", + "license": "MIT", + "repository": "sindresorhus/junk", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "junk", + "trash", + "garbage", + "files", + "os", + "ignore", + "exclude", + "filter", + "temp", + "tmp", + "system", + "clean", + "cleanup" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.1", + "xo": "^0.24.0" + } +} diff --git a/node_modules/junk/readme.md b/node_modules/junk/readme.md new file mode 100644 index 0000000..74c23ca --- /dev/null +++ b/node_modules/junk/readme.md @@ -0,0 +1,51 @@ +# junk [![Build Status](https://travis-ci.org/sindresorhus/junk.svg?branch=master)](https://travis-ci.org/sindresorhus/junk) + +> Filter out [system junk files](test.js) like `.DS_Store` and `Thumbs.db` + + +## Install + +``` +$ npm install junk +``` + + +## Usage + +```js +const {promisify} = require('util'); +const fs = require('fs'); +const junk = require('junk'); + +const pReaddir = promisify(fs.readdir); + +(async () => { + const files = await pReaddir('some/path'); + + console.log(files); + //=> ['.DS_Store', 'test.jpg'] + + console.log(files.filter(junk.not)); + //=> ['test.jpg'] +})(); +``` + + +## API + +### junk.is(filename) + +Returns `true` if `filename` matches a junk file. + +### junk.not(filename) + +Returns `true` if `filename` doesn't match a junk file. + +### junk.regex + +Regex used for matching junk files. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/kind-of/CHANGELOG.md b/node_modules/kind-of/CHANGELOG.md new file mode 100644 index 0000000..01687d5 --- /dev/null +++ b/node_modules/kind-of/CHANGELOG.md @@ -0,0 +1,160 @@ +# Release history + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +
    + Guiding Principles + +- Changelogs are for humans, not machines. +- There should be an entry for every single version. +- The same types of changes should be grouped. +- Versions and sections should be linkable. +- The latest version comes first. +- The release date of each versions is displayed. +- Mention whether you follow Semantic Versioning. + +
    + +
    + Types of changes + +Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_): + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + +
    + +## [6.0.3] - 2020-01-16 + +- Merge pull request #31 for issue #30 + +## [6.0.0] - 2017-10-13 + +- refactor code to be more performant +- refactor benchmarks + +## [5.1.0] - 2017-10-13 + +**Added** + +- Merge pull request #15 from aretecode/patch-1 +- adds support and tests for string & array iterators + +**Changed** + +- updates benchmarks + +## [5.0.2] - 2017-08-02 + +- Merge pull request #14 from struct78/master +- Added `undefined` check + +## [5.0.0] - 2017-06-21 + +- Merge pull request #12 from aretecode/iterator +- Set Iterator + Map Iterator +- streamline `isbuffer`, minor edits + +## [4.0.0] - 2017-05-19 + +- Merge pull request #8 from tunnckoCore/master +- update deps + +## [3.2.2] - 2017-05-16 + +- fix version + +## [3.2.1] - 2017-05-16 + +- add browserify + +## [3.2.0] - 2017-04-25 + +- Merge pull request #10 from ksheedlo/unrequire-buffer +- add `promise` support and tests +- Remove unnecessary `Buffer` check + +## [3.1.0] - 2016-12-07 + +- Merge pull request #7 from laggingreflex/err +- add support for `error` and tests +- run update + +## [3.0.4] - 2016-07-29 + +- move tests +- run update + +## [3.0.3] - 2016-05-03 + +- fix prepublish script +- remove unused dep + +## [3.0.0] - 2015-11-17 + +- add typed array support +- Merge pull request #5 from miguelmota/typed-arrays +- adds new tests + +## [2.0.1] - 2015-08-21 + +- use `is-buffer` module + +## [2.0.0] - 2015-05-31 + +- Create fallback for `Array.isArray` if used as a browser package +- Merge pull request #2 from dtothefp/patch-1 +- Merge pull request #3 from pdehaan/patch-1 +- Merge branch 'master' of https://github.com/chorks/kind-of into chorks-master +- optimizations, mostly date and regex + +## [1.1.0] - 2015-02-09 + +- adds `buffer` support +- adds tests for `buffer` + +## [1.0.0] - 2015-01-19 + +- update benchmarks +- optimizations based on benchmarks + +## [0.1.2] - 2014-10-26 + +- return `typeof` value if it's not an object. very slight speed improvement +- use `.slice` +- adds benchmarks + +## [0.1.0] - 2014-9-26 + +- first commit + +[6.0.0]: https://github.com/jonschlinkert/kind-of/compare/5.1.0...6.0.0 +[5.1.0]: https://github.com/jonschlinkert/kind-of/compare/5.0.2...5.1.0 +[5.0.2]: https://github.com/jonschlinkert/kind-of/compare/5.0.1...5.0.2 +[5.0.1]: https://github.com/jonschlinkert/kind-of/compare/5.0.0...5.0.1 +[5.0.0]: https://github.com/jonschlinkert/kind-of/compare/4.0.0...5.0.0 +[4.0.0]: https://github.com/jonschlinkert/kind-of/compare/3.2.2...4.0.0 +[3.2.2]: https://github.com/jonschlinkert/kind-of/compare/3.2.1...3.2.2 +[3.2.1]: https://github.com/jonschlinkert/kind-of/compare/3.2.0...3.2.1 +[3.2.0]: https://github.com/jonschlinkert/kind-of/compare/3.1.0...3.2.0 +[3.1.0]: https://github.com/jonschlinkert/kind-of/compare/3.0.4...3.1.0 +[3.0.4]: https://github.com/jonschlinkert/kind-of/compare/3.0.3...3.0.4 +[3.0.3]: https://github.com/jonschlinkert/kind-of/compare/3.0.0...3.0.3 +[3.0.0]: https://github.com/jonschlinkert/kind-of/compare/2.0.1...3.0.0 +[2.0.1]: https://github.com/jonschlinkert/kind-of/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/jonschlinkert/kind-of/compare/1.1.0...2.0.0 +[1.1.0]: https://github.com/jonschlinkert/kind-of/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/jonschlinkert/kind-of/compare/0.1.2...1.0.0 +[0.1.2]: https://github.com/jonschlinkert/kind-of/compare/0.1.0...0.1.2 +[0.1.0]: https://github.com/jonschlinkert/kind-of/commit/2fae09b0b19b1aadb558e9be39f0c3ef6034eb87 + +[Unreleased]: https://github.com/jonschlinkert/kind-of/compare/0.1.2...HEAD +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog \ No newline at end of file diff --git a/node_modules/kind-of/LICENSE b/node_modules/kind-of/LICENSE new file mode 100644 index 0000000..3f2eca1 --- /dev/null +++ b/node_modules/kind-of/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, 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/kind-of/README.md b/node_modules/kind-of/README.md new file mode 100644 index 0000000..0411dc5 --- /dev/null +++ b/node_modules/kind-of/README.md @@ -0,0 +1,367 @@ +# kind-of [![NPM version](https://img.shields.io/npm/v/kind-of.svg?style=flat)](https://www.npmjs.com/package/kind-of) [![NPM monthly downloads](https://img.shields.io/npm/dm/kind-of.svg?style=flat)](https://npmjs.org/package/kind-of) [![NPM total downloads](https://img.shields.io/npm/dt/kind-of.svg?style=flat)](https://npmjs.org/package/kind-of) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/kind-of.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/kind-of) + +> Get the native type of a value. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save kind-of +``` + +Install with [bower](https://bower.io/) + +```sh +$ bower install kind-of --save +``` + +## Why use this? + +1. [it's fast](#benchmarks) | [optimizations](#optimizations) +2. [better type checking](#better-type-checking) + +## Usage + +> es5, es6, and browser ready + +```js +var kindOf = require('kind-of'); + +kindOf(undefined); +//=> 'undefined' + +kindOf(null); +//=> 'null' + +kindOf(true); +//=> 'boolean' + +kindOf(false); +//=> 'boolean' + +kindOf(new Buffer('')); +//=> 'buffer' + +kindOf(42); +//=> 'number' + +kindOf('str'); +//=> 'string' + +kindOf(arguments); +//=> 'arguments' + +kindOf({}); +//=> 'object' + +kindOf(Object.create(null)); +//=> 'object' + +kindOf(new Test()); +//=> 'object' + +kindOf(new Date()); +//=> 'date' + +kindOf([1, 2, 3]); +//=> 'array' + +kindOf(/foo/); +//=> 'regexp' + +kindOf(new RegExp('foo')); +//=> 'regexp' + +kindOf(new Error('error')); +//=> 'error' + +kindOf(function () {}); +//=> 'function' + +kindOf(function * () {}); +//=> 'generatorfunction' + +kindOf(Symbol('str')); +//=> 'symbol' + +kindOf(new Map()); +//=> 'map' + +kindOf(new WeakMap()); +//=> 'weakmap' + +kindOf(new Set()); +//=> 'set' + +kindOf(new WeakSet()); +//=> 'weakset' + +kindOf(new Int8Array()); +//=> 'int8array' + +kindOf(new Uint8Array()); +//=> 'uint8array' + +kindOf(new Uint8ClampedArray()); +//=> 'uint8clampedarray' + +kindOf(new Int16Array()); +//=> 'int16array' + +kindOf(new Uint16Array()); +//=> 'uint16array' + +kindOf(new Int32Array()); +//=> 'int32array' + +kindOf(new Uint32Array()); +//=> 'uint32array' + +kindOf(new Float32Array()); +//=> 'float32array' + +kindOf(new Float64Array()); +//=> 'float64array' +``` + +## Benchmarks + +Benchmarked against [typeof](http://github.com/CodingFu/typeof) and [type-of](https://github.com/ForbesLindesay/type-of). + +```bash +# arguments (32 bytes) + kind-of x 17,024,098 ops/sec ±1.90% (86 runs sampled) + lib-type-of x 11,926,235 ops/sec ±1.34% (83 runs sampled) + lib-typeof x 9,245,257 ops/sec ±1.22% (87 runs sampled) + + fastest is kind-of (by 161% avg) + +# array (22 bytes) + kind-of x 17,196,492 ops/sec ±1.07% (88 runs sampled) + lib-type-of x 8,838,283 ops/sec ±1.02% (87 runs sampled) + lib-typeof x 8,677,848 ops/sec ±0.87% (87 runs sampled) + + fastest is kind-of (by 196% avg) + +# boolean (24 bytes) + kind-of x 16,841,600 ops/sec ±1.10% (86 runs sampled) + lib-type-of x 8,096,787 ops/sec ±0.95% (87 runs sampled) + lib-typeof x 8,423,345 ops/sec ±1.15% (86 runs sampled) + + fastest is kind-of (by 204% avg) + +# buffer (38 bytes) + kind-of x 14,848,060 ops/sec ±1.05% (86 runs sampled) + lib-type-of x 3,671,577 ops/sec ±1.49% (87 runs sampled) + lib-typeof x 8,360,236 ops/sec ±1.24% (86 runs sampled) + + fastest is kind-of (by 247% avg) + +# date (30 bytes) + kind-of x 16,067,761 ops/sec ±1.58% (86 runs sampled) + lib-type-of x 8,954,436 ops/sec ±1.40% (87 runs sampled) + lib-typeof x 8,488,307 ops/sec ±1.51% (84 runs sampled) + + fastest is kind-of (by 184% avg) + +# error (36 bytes) + kind-of x 9,634,090 ops/sec ±1.12% (89 runs sampled) + lib-type-of x 7,735,624 ops/sec ±1.32% (86 runs sampled) + lib-typeof x 7,442,160 ops/sec ±1.11% (90 runs sampled) + + fastest is kind-of (by 127% avg) + +# function (34 bytes) + kind-of x 10,031,494 ops/sec ±1.27% (86 runs sampled) + lib-type-of x 9,502,757 ops/sec ±1.17% (89 runs sampled) + lib-typeof x 8,278,985 ops/sec ±1.08% (88 runs sampled) + + fastest is kind-of (by 113% avg) + +# null (24 bytes) + kind-of x 18,159,808 ops/sec ±1.92% (86 runs sampled) + lib-type-of x 12,927,635 ops/sec ±1.01% (88 runs sampled) + lib-typeof x 7,958,234 ops/sec ±1.21% (89 runs sampled) + + fastest is kind-of (by 174% avg) + +# number (22 bytes) + kind-of x 17,846,779 ops/sec ±0.91% (85 runs sampled) + lib-type-of x 3,316,636 ops/sec ±1.19% (86 runs sampled) + lib-typeof x 2,329,477 ops/sec ±2.21% (85 runs sampled) + + fastest is kind-of (by 632% avg) + +# object-plain (47 bytes) + kind-of x 7,085,155 ops/sec ±1.05% (88 runs sampled) + lib-type-of x 8,870,930 ops/sec ±1.06% (83 runs sampled) + lib-typeof x 8,716,024 ops/sec ±1.05% (87 runs sampled) + + fastest is lib-type-of (by 112% avg) + +# regex (25 bytes) + kind-of x 14,196,052 ops/sec ±1.65% (84 runs sampled) + lib-type-of x 9,554,164 ops/sec ±1.25% (88 runs sampled) + lib-typeof x 8,359,691 ops/sec ±1.07% (87 runs sampled) + + fastest is kind-of (by 158% avg) + +# string (33 bytes) + kind-of x 16,131,428 ops/sec ±1.41% (85 runs sampled) + lib-type-of x 7,273,172 ops/sec ±1.05% (87 runs sampled) + lib-typeof x 7,382,635 ops/sec ±1.17% (85 runs sampled) + + fastest is kind-of (by 220% avg) + +# symbol (34 bytes) + kind-of x 17,011,537 ops/sec ±1.24% (86 runs sampled) + lib-type-of x 3,492,454 ops/sec ±1.23% (89 runs sampled) + lib-typeof x 7,471,235 ops/sec ±2.48% (87 runs sampled) + + fastest is kind-of (by 310% avg) + +# template-strings (36 bytes) + kind-of x 15,434,250 ops/sec ±1.46% (83 runs sampled) + lib-type-of x 7,157,907 ops/sec ±0.97% (87 runs sampled) + lib-typeof x 7,517,986 ops/sec ±0.92% (86 runs sampled) + + fastest is kind-of (by 210% avg) + +# undefined (29 bytes) + kind-of x 19,167,115 ops/sec ±1.71% (87 runs sampled) + lib-type-of x 15,477,740 ops/sec ±1.63% (85 runs sampled) + lib-typeof x 19,075,495 ops/sec ±1.17% (83 runs sampled) + + fastest is lib-typeof,kind-of + +``` + +## Optimizations + +In 7 out of 8 cases, this library is 2x-10x faster than other top libraries included in the benchmarks. There are a few things that lead to this performance advantage, none of them hard and fast rules, but all of them simple and repeatable in almost any code library: + +1. Optimize around the fastest and most common use cases first. Of course, this will change from project-to-project, but I took some time to understand how and why `typeof` checks were being used in my own libraries and other libraries I use a lot. +2. Optimize around bottlenecks - In other words, the order in which conditionals are implemented is significant, because each check is only as fast as the failing checks that came before it. Here, the biggest bottleneck by far is checking for plain objects (an object that was created by the `Object` constructor). I opted to make this check happen by process of elimination rather than brute force up front (e.g. by using something like `val.constructor.name`), so that every other type check would not be penalized it. +3. Don't do uneccessary processing - why do `.slice(8, -1).toLowerCase();` just to get the word `regex`? It's much faster to do `if (type === '[object RegExp]') return 'regex'` +4. There is no reason to make the code in a microlib as terse as possible, just to win points for making it shorter. It's always better to favor performant code over terse code. You will always only be using a single `require()` statement to use the library anyway, regardless of how the code is written. + +## Better type checking + +kind-of seems to be more consistently "correct" than other type checking libs I've looked at. For example, here are some differing results from other popular libs: + +### [typeof](https://github.com/CodingFu/typeof) lib + +Incorrectly identifies instances of custom constructors (pretty common): + +```js +var typeOf = require('typeof'); +function Test() {} +console.log(typeOf(new Test())); +//=> 'test' +``` + +Returns `object` instead of `arguments`: + +```js +function foo() { + console.log(typeOf(arguments)) //=> 'object' +} +foo(); +``` + +### [type-of](https://github.com/ForbesLindesay/type-of) lib + +Incorrectly returns `object` for generator functions, buffers, `Map`, `Set`, `WeakMap` and `WeakSet`: + +```js +function * foo() {} +console.log(typeOf(foo)); +//=> 'object' +console.log(typeOf(new Buffer(''))); +//=> 'object' +console.log(typeOf(new Map())); +//=> 'object' +console.log(typeOf(new Set())); +//=> 'object' +console.log(typeOf(new WeakMap())); +//=> 'object' +console.log(typeOf(new WeakSet())); +//=> 'object' +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +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 +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/micromatch/is-glob) | [homepage](https://github.com/micromatch/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [is-number](https://www.npmjs.com/package/is-number): Returns true if a number or string value is a finite number. Useful for regex… [more](https://github.com/jonschlinkert/is-number) | [homepage](https://github.com/jonschlinkert/is-number "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.") +* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 102 | [jonschlinkert](https://github.com/jonschlinkert) | +| 3 | [aretecode](https://github.com/aretecode) | +| 2 | [miguelmota](https://github.com/miguelmota) | +| 1 | [doowb](https://github.com/doowb) | +| 1 | [dtothefp](https://github.com/dtothefp) | +| 1 | [ianstormtaylor](https://github.com/ianstormtaylor) | +| 1 | [ksheedlo](https://github.com/ksheedlo) | +| 1 | [pdehaan](https://github.com/pdehaan) | +| 1 | [laggingreflex](https://github.com/laggingreflex) | +| 1 | [tunnckoCore](https://github.com/tunnckoCore) | +| 1 | [xiaofen9](https://github.com/xiaofen9) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2020, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on January 16, 2020._ \ No newline at end of file diff --git a/node_modules/kind-of/index.js b/node_modules/kind-of/index.js new file mode 100644 index 0000000..dfa799b --- /dev/null +++ b/node_modules/kind-of/index.js @@ -0,0 +1,129 @@ +var toString = Object.prototype.toString; + +module.exports = function kindOf(val) { + if (val === void 0) return 'undefined'; + if (val === null) return 'null'; + + var type = typeof val; + if (type === 'boolean') return 'boolean'; + if (type === 'string') return 'string'; + if (type === 'number') return 'number'; + if (type === 'symbol') return 'symbol'; + if (type === 'function') { + return isGeneratorFn(val) ? 'generatorfunction' : 'function'; + } + + if (isArray(val)) return 'array'; + if (isBuffer(val)) return 'buffer'; + if (isArguments(val)) return 'arguments'; + if (isDate(val)) return 'date'; + if (isError(val)) return 'error'; + if (isRegexp(val)) return 'regexp'; + + switch (ctorName(val)) { + case 'Symbol': return 'symbol'; + case 'Promise': return 'promise'; + + // Set, Map, WeakSet, WeakMap + case 'WeakMap': return 'weakmap'; + case 'WeakSet': return 'weakset'; + case 'Map': return 'map'; + case 'Set': return 'set'; + + // 8-bit typed arrays + case 'Int8Array': return 'int8array'; + case 'Uint8Array': return 'uint8array'; + case 'Uint8ClampedArray': return 'uint8clampedarray'; + + // 16-bit typed arrays + case 'Int16Array': return 'int16array'; + case 'Uint16Array': return 'uint16array'; + + // 32-bit typed arrays + case 'Int32Array': return 'int32array'; + case 'Uint32Array': return 'uint32array'; + case 'Float32Array': return 'float32array'; + case 'Float64Array': return 'float64array'; + } + + if (isGeneratorObj(val)) { + return 'generator'; + } + + // Non-plain objects + type = toString.call(val); + switch (type) { + case '[object Object]': return 'object'; + // iterators + case '[object Map Iterator]': return 'mapiterator'; + case '[object Set Iterator]': return 'setiterator'; + case '[object String Iterator]': return 'stringiterator'; + case '[object Array Iterator]': return 'arrayiterator'; + } + + // other + return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); +}; + +function ctorName(val) { + return typeof val.constructor === 'function' ? val.constructor.name : null; +} + +function isArray(val) { + if (Array.isArray) return Array.isArray(val); + return val instanceof Array; +} + +function isError(val) { + return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'); +} + +function isDate(val) { + if (val instanceof Date) return true; + return typeof val.toDateString === 'function' + && typeof val.getDate === 'function' + && typeof val.setDate === 'function'; +} + +function isRegexp(val) { + if (val instanceof RegExp) return true; + return typeof val.flags === 'string' + && typeof val.ignoreCase === 'boolean' + && typeof val.multiline === 'boolean' + && typeof val.global === 'boolean'; +} + +function isGeneratorFn(name, val) { + return ctorName(name) === 'GeneratorFunction'; +} + +function isGeneratorObj(val) { + return typeof val.throw === 'function' + && typeof val.return === 'function' + && typeof val.next === 'function'; +} + +function isArguments(val) { + try { + if (typeof val.length === 'number' && typeof val.callee === 'function') { + return true; + } + } catch (err) { + if (err.message.indexOf('callee') !== -1) { + return true; + } + } + return false; +} + +/** + * If you need to support Safari 5-7 (8-10 yr-old browser), + * take a look at https://github.com/feross/is-buffer + */ + +function isBuffer(val) { + if (val.constructor && typeof val.constructor.isBuffer === 'function') { + return val.constructor.isBuffer(val); + } + return false; +} diff --git a/node_modules/kind-of/package.json b/node_modules/kind-of/package.json new file mode 100644 index 0000000..5820cad --- /dev/null +++ b/node_modules/kind-of/package.json @@ -0,0 +1,88 @@ +{ + "name": "kind-of", + "description": "Get the native type of a value.", + "version": "6.0.3", + "homepage": "https://github.com/jonschlinkert/kind-of", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "David Fox-Powell (https://dtothefp.github.io/me)", + "James (https://twitter.com/aretecode)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Ken Sheedlo (kensheedlo.com)", + "laggingreflex (https://github.com/laggingreflex)", + "Miguel Mota (https://miguelmota.com)", + "Peter deHaan (http://about.me/peterdehaan)", + "tunnckoCore (https://i.am.charlike.online)" + ], + "repository": "jonschlinkert/kind-of", + "bugs": { + "url": "https://github.com/jonschlinkert/kind-of/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha", + "prepublish": "browserify -o browser.js -e index.js -s index --bare" + }, + "devDependencies": { + "benchmarked": "^2.0.0", + "browserify": "^14.4.0", + "gulp-format-md": "^1.0.0", + "mocha": "^4.0.1", + "write": "^1.0.3" + }, + "keywords": [ + "arguments", + "array", + "boolean", + "check", + "date", + "function", + "is", + "is-type", + "is-type-of", + "kind", + "kind-of", + "number", + "object", + "of", + "regexp", + "string", + "test", + "type", + "type-of", + "typeof", + "types" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "is-glob", + "is-number", + "is-primitive" + ] + }, + "reflinks": [ + "type-of", + "typeof", + "verb" + ] + } +} diff --git a/node_modules/kleur/colors.d.ts b/node_modules/kleur/colors.d.ts new file mode 100644 index 0000000..cab25c6 --- /dev/null +++ b/node_modules/kleur/colors.d.ts @@ -0,0 +1,38 @@ +declare function print(input: string | boolean | number): string; +declare function print(input: undefined | void): undefined; +declare function print(input: null): null; +type Colorize = typeof print; + +export declare const $: { enabled: boolean }; + +// Colors +export declare const black: Colorize; +export declare const red: Colorize; +export declare const green: Colorize; +export declare const yellow: Colorize; +export declare const blue: Colorize; +export declare const magenta: Colorize; +export declare const cyan: Colorize; +export declare const white: Colorize; +export declare const gray: Colorize; +export declare const grey: Colorize; + +// Backgrounds +export declare const bgBlack: Colorize; +export declare const bgRed: Colorize; +export declare const bgGreen: Colorize; +export declare const bgYellow: Colorize; +export declare const bgBlue: Colorize; +export declare const bgMagenta: Colorize; +export declare const bgCyan: Colorize; +export declare const bgWhite: Colorize; + +// Modifiers +export declare const reset: Colorize; +export declare const bold: Colorize; +export declare const dim: Colorize; +export declare const italic: Colorize; +export declare const underline: Colorize; +export declare const inverse: Colorize; +export declare const hidden: Colorize; +export declare const strikethrough: Colorize; diff --git a/node_modules/kleur/colors.js b/node_modules/kleur/colors.js new file mode 100644 index 0000000..89fb012 --- /dev/null +++ b/node_modules/kleur/colors.js @@ -0,0 +1,53 @@ +let FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY=true; +if (typeof process !== 'undefined') { + ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {}); + isTTY = process.stdout && process.stdout.isTTY; +} + +const $ = exports.$ = { + enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== 'dumb' && ( + FORCE_COLOR != null && FORCE_COLOR !== '0' || isTTY + ) +} + +function init(x, y) { + let rgx = new RegExp(`\\x1b\\[${y}m`, 'g'); + let open = `\x1b[${x}m`, close = `\x1b[${y}m`; + + return function (txt) { + if (!$.enabled || txt == null) return txt; + return open + (!!~(''+txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) + close; + }; +} + +// modifiers +exports.reset = init(0, 0); +exports.bold = init(1, 22); +exports.dim = init(2, 22); +exports.italic = init(3, 23); +exports.underline = init(4, 24); +exports.inverse = init(7, 27); +exports.hidden = init(8, 28); +exports.strikethrough = init(9, 29); + +// colors +exports.black = init(30, 39); +exports.red = init(31, 39); +exports.green = init(32, 39); +exports.yellow = init(33, 39); +exports.blue = init(34, 39); +exports.magenta = init(35, 39); +exports.cyan = init(36, 39); +exports.white = init(37, 39); +exports.gray = init(90, 39); +exports.grey = init(90, 39); + +// background colors +exports.bgBlack = init(40, 49); +exports.bgRed = init(41, 49); +exports.bgGreen = init(42, 49); +exports.bgYellow = init(43, 49); +exports.bgBlue = init(44, 49); +exports.bgMagenta = init(45, 49); +exports.bgCyan = init(46, 49); +exports.bgWhite = init(47, 49); diff --git a/node_modules/kleur/colors.mjs b/node_modules/kleur/colors.mjs new file mode 100644 index 0000000..e9feb83 --- /dev/null +++ b/node_modules/kleur/colors.mjs @@ -0,0 +1,53 @@ +let FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY=true; +if (typeof process !== 'undefined') { + ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {}); + isTTY = process.stdout && process.stdout.isTTY; +} + +export const $ = { + enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== 'dumb' && ( + FORCE_COLOR != null && FORCE_COLOR !== '0' || isTTY + ) +} + +function init(x, y) { + let rgx = new RegExp(`\\x1b\\[${y}m`, 'g'); + let open = `\x1b[${x}m`, close = `\x1b[${y}m`; + + return function (txt) { + if (!$.enabled || txt == null) return txt; + return open + (!!~(''+txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) + close; + }; +} + +// modifiers +export const reset = init(0, 0); +export const bold = init(1, 22); +export const dim = init(2, 22); +export const italic = init(3, 23); +export const underline = init(4, 24); +export const inverse = init(7, 27); +export const hidden = init(8, 28); +export const strikethrough = init(9, 29); + +// colors +export const black = init(30, 39); +export const red = init(31, 39); +export const green = init(32, 39); +export const yellow = init(33, 39); +export const blue = init(34, 39); +export const magenta = init(35, 39); +export const cyan = init(36, 39); +export const white = init(37, 39); +export const gray = init(90, 39); +export const grey = init(90, 39); + +// background colors +export const bgBlack = init(40, 49); +export const bgRed = init(41, 49); +export const bgGreen = init(42, 49); +export const bgYellow = init(43, 49); +export const bgBlue = init(44, 49); +export const bgMagenta = init(45, 49); +export const bgCyan = init(46, 49); +export const bgWhite = init(47, 49); diff --git a/node_modules/kleur/index.d.ts b/node_modules/kleur/index.d.ts new file mode 100644 index 0000000..fdc26ca --- /dev/null +++ b/node_modules/kleur/index.d.ts @@ -0,0 +1,45 @@ +// Originally by: Rogier Schouten +// Adapted by: Madhav Varshney +declare namespace kleur { + interface Color { + (x: string | number): string; + (): Kleur; + } + + interface Kleur { + // Colors + black: Color; + red: Color; + green: Color; + yellow: Color; + blue: Color; + magenta: Color; + cyan: Color; + white: Color; + gray: Color; + grey: Color; + + // Backgrounds + bgBlack: Color; + bgRed: Color; + bgGreen: Color; + bgYellow: Color; + bgBlue: Color; + bgMagenta: Color; + bgCyan: Color; + bgWhite: Color; + + // Modifiers + reset: Color; + bold: Color; + dim: Color; + italic: Color; + underline: Color; + inverse: Color; + hidden: Color; + strikethrough: Color; + } +} + +declare let kleur: kleur.Kleur & { enabled: boolean }; +export = kleur; diff --git a/node_modules/kleur/index.js b/node_modules/kleur/index.js new file mode 100644 index 0000000..5800b98 --- /dev/null +++ b/node_modules/kleur/index.js @@ -0,0 +1,110 @@ +'use strict'; + +let FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY=true; +if (typeof process !== 'undefined') { + ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {}); + isTTY = process.stdout && process.stdout.isTTY; +} + +const $ = { + enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== 'dumb' && ( + FORCE_COLOR != null && FORCE_COLOR !== '0' || isTTY + ), + + // modifiers + reset: init(0, 0), + bold: init(1, 22), + dim: init(2, 22), + italic: init(3, 23), + underline: init(4, 24), + inverse: init(7, 27), + hidden: init(8, 28), + strikethrough: init(9, 29), + + // colors + black: init(30, 39), + red: init(31, 39), + green: init(32, 39), + yellow: init(33, 39), + blue: init(34, 39), + magenta: init(35, 39), + cyan: init(36, 39), + white: init(37, 39), + gray: init(90, 39), + grey: init(90, 39), + + // background colors + bgBlack: init(40, 49), + bgRed: init(41, 49), + bgGreen: init(42, 49), + bgYellow: init(43, 49), + bgBlue: init(44, 49), + bgMagenta: init(45, 49), + bgCyan: init(46, 49), + bgWhite: init(47, 49) +}; + +function run(arr, str) { + let i=0, tmp, beg='', end=''; + for (; i < arr.length; i++) { + tmp = arr[i]; + beg += tmp.open; + end += tmp.close; + if (!!~str.indexOf(tmp.close)) { + str = str.replace(tmp.rgx, tmp.close + tmp.open); + } + } + return beg + str + end; +} + +function chain(has, keys) { + let ctx = { has, keys }; + + ctx.reset = $.reset.bind(ctx); + ctx.bold = $.bold.bind(ctx); + ctx.dim = $.dim.bind(ctx); + ctx.italic = $.italic.bind(ctx); + ctx.underline = $.underline.bind(ctx); + ctx.inverse = $.inverse.bind(ctx); + ctx.hidden = $.hidden.bind(ctx); + ctx.strikethrough = $.strikethrough.bind(ctx); + + ctx.black = $.black.bind(ctx); + ctx.red = $.red.bind(ctx); + ctx.green = $.green.bind(ctx); + ctx.yellow = $.yellow.bind(ctx); + ctx.blue = $.blue.bind(ctx); + ctx.magenta = $.magenta.bind(ctx); + ctx.cyan = $.cyan.bind(ctx); + ctx.white = $.white.bind(ctx); + ctx.gray = $.gray.bind(ctx); + ctx.grey = $.grey.bind(ctx); + + ctx.bgBlack = $.bgBlack.bind(ctx); + ctx.bgRed = $.bgRed.bind(ctx); + ctx.bgGreen = $.bgGreen.bind(ctx); + ctx.bgYellow = $.bgYellow.bind(ctx); + ctx.bgBlue = $.bgBlue.bind(ctx); + ctx.bgMagenta = $.bgMagenta.bind(ctx); + ctx.bgCyan = $.bgCyan.bind(ctx); + ctx.bgWhite = $.bgWhite.bind(ctx); + + return ctx; +} + +function init(open, close) { + let blk = { + open: `\x1b[${open}m`, + close: `\x1b[${close}m`, + rgx: new RegExp(`\\x1b\\[${close}m`, 'g') + }; + return function (txt) { + if (this !== void 0 && this.has !== void 0) { + !!~this.has.indexOf(open) || (this.has.push(open),this.keys.push(blk)); + return txt === void 0 ? this : $.enabled ? run(this.keys, txt+'') : txt+''; + } + return txt === void 0 ? chain([open], [blk]) : $.enabled ? run([blk], txt+'') : txt+''; + }; +} + +module.exports = $; diff --git a/node_modules/kleur/index.mjs b/node_modules/kleur/index.mjs new file mode 100644 index 0000000..96dadad --- /dev/null +++ b/node_modules/kleur/index.mjs @@ -0,0 +1,110 @@ +'use strict'; + +let FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY=true; +if (typeof process !== 'undefined') { + ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {}); + isTTY = process.stdout && process.stdout.isTTY; +} + +const $ = { + enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== 'dumb' && ( + FORCE_COLOR != null && FORCE_COLOR !== '0' || isTTY + ), + + // modifiers + reset: init(0, 0), + bold: init(1, 22), + dim: init(2, 22), + italic: init(3, 23), + underline: init(4, 24), + inverse: init(7, 27), + hidden: init(8, 28), + strikethrough: init(9, 29), + + // colors + black: init(30, 39), + red: init(31, 39), + green: init(32, 39), + yellow: init(33, 39), + blue: init(34, 39), + magenta: init(35, 39), + cyan: init(36, 39), + white: init(37, 39), + gray: init(90, 39), + grey: init(90, 39), + + // background colors + bgBlack: init(40, 49), + bgRed: init(41, 49), + bgGreen: init(42, 49), + bgYellow: init(43, 49), + bgBlue: init(44, 49), + bgMagenta: init(45, 49), + bgCyan: init(46, 49), + bgWhite: init(47, 49) +}; + +function run(arr, str) { + let i=0, tmp, beg='', end=''; + for (; i < arr.length; i++) { + tmp = arr[i]; + beg += tmp.open; + end += tmp.close; + if (!!~str.indexOf(tmp.close)) { + str = str.replace(tmp.rgx, tmp.close + tmp.open); + } + } + return beg + str + end; +} + +function chain(has, keys) { + let ctx = { has, keys }; + + ctx.reset = $.reset.bind(ctx); + ctx.bold = $.bold.bind(ctx); + ctx.dim = $.dim.bind(ctx); + ctx.italic = $.italic.bind(ctx); + ctx.underline = $.underline.bind(ctx); + ctx.inverse = $.inverse.bind(ctx); + ctx.hidden = $.hidden.bind(ctx); + ctx.strikethrough = $.strikethrough.bind(ctx); + + ctx.black = $.black.bind(ctx); + ctx.red = $.red.bind(ctx); + ctx.green = $.green.bind(ctx); + ctx.yellow = $.yellow.bind(ctx); + ctx.blue = $.blue.bind(ctx); + ctx.magenta = $.magenta.bind(ctx); + ctx.cyan = $.cyan.bind(ctx); + ctx.white = $.white.bind(ctx); + ctx.gray = $.gray.bind(ctx); + ctx.grey = $.grey.bind(ctx); + + ctx.bgBlack = $.bgBlack.bind(ctx); + ctx.bgRed = $.bgRed.bind(ctx); + ctx.bgGreen = $.bgGreen.bind(ctx); + ctx.bgYellow = $.bgYellow.bind(ctx); + ctx.bgBlue = $.bgBlue.bind(ctx); + ctx.bgMagenta = $.bgMagenta.bind(ctx); + ctx.bgCyan = $.bgCyan.bind(ctx); + ctx.bgWhite = $.bgWhite.bind(ctx); + + return ctx; +} + +function init(open, close) { + let blk = { + open: `\x1b[${open}m`, + close: `\x1b[${close}m`, + rgx: new RegExp(`\\x1b\\[${close}m`, 'g') + }; + return function (txt) { + if (this !== void 0 && this.has !== void 0) { + !!~this.has.indexOf(open) || (this.has.push(open),this.keys.push(blk)); + return txt === void 0 ? this : $.enabled ? run(this.keys, txt+'') : txt+''; + } + return txt === void 0 ? chain([open], [blk]) : $.enabled ? run([blk], txt+'') : txt+''; + }; +} + +export default $; diff --git a/node_modules/kleur/license b/node_modules/kleur/license new file mode 100644 index 0000000..a3f96f8 --- /dev/null +++ b/node_modules/kleur/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Luke Edwards (lukeed.com) + +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/kleur/package.json b/node_modules/kleur/package.json new file mode 100644 index 0000000..5007c05 --- /dev/null +++ b/node_modules/kleur/package.json @@ -0,0 +1,51 @@ +{ + "name": "kleur", + "version": "4.1.5", + "repository": "lukeed/kleur", + "description": "The fastest Node.js library for formatting terminal text with ANSI colors~!", + "module": "index.mjs", + "types": "index.d.ts", + "main": "index.js", + "license": "MIT", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.mjs", + "require": "./index.js" + }, + "./colors": { + "types": "./colors.d.ts", + "import": "./colors.mjs", + "require": "./colors.js" + } + }, + "files": [ + "*.d.ts", + "colors.*", + "index.*" + ], + "author": { + "name": "Luke Edwards", + "email": "luke.edwards05@gmail.com", + "url": "https://lukeed.com" + }, + "scripts": { + "build": "node build", + "test": "uvu -r esm -i utils -i xyz" + }, + "engines": { + "node": ">=6" + }, + "keywords": [ + "ansi", + "cli", + "color", + "colors", + "console", + "terminal" + ], + "devDependencies": { + "esm": "3.2.25", + "uvu": "0.3.3" + } +} diff --git a/node_modules/kleur/readme.md b/node_modules/kleur/readme.md new file mode 100644 index 0000000..de7f5aa --- /dev/null +++ b/node_modules/kleur/readme.md @@ -0,0 +1,232 @@ +
    + kleur +
    + + + +
    The fastest Node.js library for formatting terminal text with ANSI colors~!
    + +## Features + +* No dependencies +* Super [lightweight](#load-time) & [performant](#performance) +* Supports [nested](#nested-methods) & [chained](#chained-methods) colors +* No `String.prototype` modifications +* Conditional [color support](#conditional-support) +* [Fully treeshakable](#individual-colors) +* Familiar [API](#api) + +--- + +As of `v3.0` the Chalk-style syntax (magical getter) is no longer used.
    Please visit [History](#history) for migration paths supporting that syntax. + +--- + + +## Install + +``` +$ npm install --save kleur +``` + + +## Usage + +```js +import kleur from 'kleur'; + +// basic usage +kleur.red('red text'); + +// chained methods +kleur.blue().bold().underline('howdy partner'); + +// nested methods +kleur.bold(`${ white().bgRed('[ERROR]') } ${ kleur.red().italic('Something happened')}`); +``` + +### Chained Methods + +```js +const { bold, green } = require('kleur'); + +console.log(bold().red('this is a bold red message')); +console.log(bold().italic('this is a bold italicized message')); +console.log(bold().yellow().bgRed().italic('this is a bold yellow italicized message')); +console.log(green().bold().underline('this is a bold green underlined message')); +``` + + + +### Nested Methods + +```js +const { yellow, red, cyan } = require('kleur'); + +console.log(yellow(`foo ${red().bold('red')} bar ${cyan('cyan')} baz`)); +console.log(yellow('foo ' + red().bold('red') + ' bar ' + cyan('cyan') + ' baz')); +``` + + + + +### Conditional Support + +Toggle color support as needed; `kleur` includes simple auto-detection which may not cover all cases. + +> **Note:** Both `kleur` and `kleur/colors` share the same detection logic. + +```js +import kleur from 'kleur'; + +// manually disable +kleur.enabled = false; + +// or use another library to detect support +kleur.enabled = require('color-support').level > 0; + +console.log(kleur.red('I will only be colored red if the terminal supports colors')); +``` + +> **Important:**
    Colors will be disabled automatically in non [TTY contexts](https://nodejs.org/api/process.html#process_a_note_on_process_i_o). For example, spawning another process or piping output into another process will disable colorization automatically. To force colors in your piped output, you may do so with the `FORCE_COLOR=1` environment variable: + +```sh +$ node app.js #=> COLORS +$ node app.js > log.txt #=> NO COLORS +$ FORCE_COLOR=1 node app.js > log.txt #=> COLORS +$ FORCE_COLOR=0 node app.js > log.txt #=> NO COLORS +``` + +## API + +Any `kleur` method returns a `String` when invoked with input; otherwise chaining is expected. + +> It's up to the developer to pass the output to destinations like `console.log`, `process.stdout.write`, etc. + +The methods below are grouped by type for legibility purposes only. They each can be [chained](#chained-methods) or [nested](#nested-methods) with one another. + +***Colors:*** +> black — red — green — yellow — blue — magenta — cyan — white — gray — grey + +***Backgrounds:*** +> bgBlack — bgRed — bgGreen — bgYellow — bgBlue — bgMagenta — bgCyan — bgWhite + +***Modifiers:*** +> reset — bold — dim — italic* — underline — inverse — hidden — strikethrough* + +* Not widely supported + + +## Individual Colors + +When you only need a few colors, it doesn't make sense to import _all_ of `kleur` because, as small as it is, `kleur` is not treeshakeable, and so most of its code will be doing nothing. In order to fix this, you can import from the `kleur/colors` submodule which _fully_ supports tree-shaking. + +The caveat with this approach is that color functions **are not** chainable~!
    Each function receives and colorizes its input. You may combine colors, backgrounds, and modifiers by nesting function calls within other functions. + +```js +// or: import * as kleur from 'kleur/colors'; +import { red, underline, bgWhite } from 'kleur/colors'; + +red('red text'); +//~> kleur.red('red text'); + +underline(red('red underlined text')); +//~> kleur.underline().red('red underlined text'); + +bgWhite(underline(red('red underlined text w/ white background'))); +//~> kleur.bgWhite().underline().red('red underlined text w/ white background'); +``` + +> **Note:** All the same [colors, backgrounds, and modifiers](#api) are available. + +***Conditional Support*** + +The `kleur/colors` submodule also allows you to toggle color support, as needed.
    +It includes the same initial assumptions as `kleur`, in an attempt to have colors enabled by default. + +Unlike `kleur`, this setting exists as `kleur.$.enabled` instead of `kleur.enabled`: + +```js +import * as kleur from 'kleur/colors'; +// or: import { $, red } from 'kleur/colors'; + +// manually disabled +kleur.$.enabled = false; + +// or use another library to detect support +kleur.$.enabled = require('color-support').level > 0; + +console.log(red('I will only be colored red if the terminal supports colors')); +``` + + +## Benchmarks + +> Using Node v10.13.0 + +### Load time + +``` +chalk :: 5.303ms +kleur :: 0.488ms +kleur/colors :: 0.369ms +ansi-colors :: 1.504ms +``` + +### Performance + +``` +# All Colors + ansi-colors x 177,625 ops/sec ±1.47% (92 runs sampled) + chalk x 611,907 ops/sec ±0.20% (92 runs sampled) + kleur x 742,509 ops/sec ±1.47% (93 runs sampled) + kleur/colors x 881,742 ops/sec ±0.19% (98 runs sampled) + +# Stacked colors + ansi-colors x 23,331 ops/sec ±1.81% (94 runs sampled) + chalk x 337,178 ops/sec ±0.20% (98 runs sampled) + kleur x 78,299 ops/sec ±1.01% (97 runs sampled) + kleur/colors x 104,431 ops/sec ±0.22% (97 runs sampled) + +# Nested colors + ansi-colors x 67,181 ops/sec ±1.15% (92 runs sampled) + chalk x 116,361 ops/sec ±0.63% (94 runs sampled) + kleur x 139,514 ops/sec ±0.76% (95 runs sampled) + kleur/colors x 145,716 ops/sec ±0.97% (97 runs sampled) +``` + + +## History + +This project originally forked [`ansi-colors`](https://github.com/doowb/ansi-colors). + +Beginning with `kleur@3.0`, the Chalk-style syntax (magical getter) has been replaced with function calls per key: + +```js +// Old: +c.red.bold.underline('old'); + +// New: +c.red().bold().underline('new'); +``` +> As I work more with Rust, the newer syntax feels so much better & more natural! + +If you prefer the old syntax, you may migrate to `ansi-colors` or newer `chalk` releases.
    Versions below `kleur@3.0` have been officially deprecated. + + +## License + +MIT © [Luke Edwards](https://lukeed.com) diff --git a/node_modules/linkify-it/LICENSE b/node_modules/linkify-it/LICENSE new file mode 100644 index 0000000..67596f5 --- /dev/null +++ b/node_modules/linkify-it/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015 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/linkify-it/README.md b/node_modules/linkify-it/README.md new file mode 100644 index 0000000..7c2d9fb --- /dev/null +++ b/node_modules/linkify-it/README.md @@ -0,0 +1,196 @@ +linkify-it +========== + +[![CI](https://github.com/markdown-it/linkify-it/actions/workflows/ci.yml/badge.svg)](https://github.com/markdown-it/linkify-it/actions/workflows/ci.yml) +[![NPM version](https://img.shields.io/npm/v/linkify-it.svg?style=flat)](https://www.npmjs.org/package/linkify-it) +[![Coverage Status](https://img.shields.io/coveralls/markdown-it/linkify-it/master.svg?style=flat)](https://coveralls.io/r/markdown-it/linkify-it?branch=master) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/markdown-it/linkify-it) + +> Links recognition library with FULL unicode support. +> Focused on high quality link patterns detection in plain text. + +__[Demo](http://markdown-it.github.io/linkify-it/)__ + +Why it's awesome: + +- Full unicode support, _with astral characters_! +- International domains support. +- Allows rules extension & custom normalizers. + + +Install +------- + +```bash +npm install linkify-it --save +``` + +Browserification is also supported. + + +Usage examples +-------------- + +##### Example 1 + +```js +import linkifyit from 'linkify-it'; +const linkify = linkifyit(); + +// Reload full tlds list & add unofficial `.onion` domain. +linkify + .tlds(require('tlds')) // Reload with full tlds list + .tlds('onion', true) // Add unofficial `.onion` domain + .add('git:', 'http:') // Add `git:` protocol as "alias" + .add('ftp:', null) // Disable `ftp:` protocol + .set({ fuzzyIP: true }); // Enable IPs in fuzzy links (without schema) + +console.log(linkify.test('Site github.com!')); // true + +console.log(linkify.match('Site github.com!')); // [ { + // schema: "", + // index: 5, + // lastIndex: 15, + // raw: "github.com", + // text: "github.com", + // url: "http://github.com", + // } ] +``` + +##### Example 2. Add twitter mentions handler + +```js +linkify.add('@', { + validate: function (text, pos, self) { + const tail = text.slice(pos); + + if (!self.re.twitter) { + self.re.twitter = new RegExp( + '^([a-zA-Z0-9_]){1,15}(?!_)(?=$|' + self.re.src_ZPCc + ')' + ); + } + if (self.re.twitter.test(tail)) { + // Linkifier allows punctuation chars before prefix, + // but we additionally disable `@` ("@@mention" is invalid) + if (pos >= 2 && tail[pos - 2] === '@') { + return false; + } + return tail.match(self.re.twitter)[0].length; + } + return 0; + }, + normalize: function (match) { + match.url = 'https://twitter.com/' + match.url.replace(/^@/, ''); + } +}); +``` + + +API +--- + +__[API documentation](http://markdown-it.github.io/linkify-it/doc)__ + +### new LinkifyIt(schemas, options) + +Creates new linkifier instance with optional additional schemas. +Can be called without `new` keyword for convenience. + +By default understands: + +- `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links +- "fuzzy" links and emails (google.com, foo@bar.com). + +`schemas` is an object, where each key/value describes protocol/rule: + +- __key__ - link prefix (usually, protocol name with `:` at the end, `skype:` + for example). `linkify-it` makes sure that prefix is not preceded with + alphanumeric char. +- __value__ - rule to check tail after link prefix + - _String_ - just alias to existing rule + - _Object_ + - _validate_ - either a `RegExp` (start with `^`, and don't include the + link prefix itself), or a validator function which, given arguments + _text_, _pos_, and _self_, returns the length of a match in _text_ + starting at index _pos_. _pos_ is the index right after the link prefix. + _self_ can be used to access the linkify object to cache data. + - _normalize_ - optional function to normalize text & url of matched result + (for example, for twitter mentions). + +`options`: + +- __fuzzyLink__ - recognize URL-s without `http(s)://` head. Default `true`. +- __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts + like version numbers. Default `false`. +- __fuzzyEmail__ - recognize emails without `mailto:` prefix. Default `true`. +- __---__ - set `true` to terminate link with `---` (if it's considered as long dash). + + +### .test(text) + +Searches linkifiable pattern and returns `true` on success or `false` on fail. + + +### .pretest(text) + +Quick check if link MAY BE can exist. Can be used to optimize more expensive +`.test()` calls. Return `false` if link can not be found, `true` - if `.test()` +call needed to know exactly. + + +### .testSchemaAt(text, name, offset) + +Similar to `.test()` but checks only specific protocol tail exactly at given +position. Returns length of found pattern (0 on fail). + + +### .match(text) + +Returns `Array` of found link matches or null if nothing found. + +Each match has: + +- __schema__ - link schema, can be empty for fuzzy links, or `//` for + protocol-neutral links. +- __index__ - offset of matched text +- __lastIndex__ - index of next char after mathch end +- __raw__ - matched text +- __text__ - normalized text +- __url__ - link, generated from matched text + + +### .matchAtStart(text) + +Checks if a match exists at the start of the string. Returns `Match` +(see docs for `match(text)`) or null if no URL is at the start. +Doesn't work with fuzzy links. + + +### .tlds(list[, keepOld]) + +Load (or merge) new tlds list. Those are needed for fuzzy links (without schema) +to avoid false positives. By default: + +- 2-letter root zones are ok. +- biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф are ok. +- encoded (`xn--...`) root zones are ok. + +If that's not enough, you can reload defaults with more detailed zones list. + +### .add(key, value) + +Add a new schema to the schemas object. As described in the constructor +definition, `key` is a link prefix (`skype:`, for example), and `value` +is a String to alias to another schema, or an Object with `validate` and +optionally `normalize` definitions. To disable an existing rule, use +`.add(key, null)`. + + +### .set(options) + +Override default options. Missed properties will not be changed. + + +## License + +[MIT](https://github.com/markdown-it/linkify-it/blob/master/LICENSE) diff --git a/node_modules/linkify-it/build/index.cjs.js b/node_modules/linkify-it/build/index.cjs.js new file mode 100644 index 0000000..b1108b6 --- /dev/null +++ b/node_modules/linkify-it/build/index.cjs.js @@ -0,0 +1,832 @@ +'use strict'; + +var uc_micro = require('uc.micro'); + +function reFactory (opts) { + const re = {}; + opts = opts || {}; + + re.src_Any = uc_micro.Any.source; + re.src_Cc = uc_micro.Cc.source; + re.src_Z = uc_micro.Z.source; + re.src_P = uc_micro.P.source; + + // \p{\Z\P\Cc\CF} (white spaces + control + format + punctuation) + re.src_ZPCc = [re.src_Z, re.src_P, re.src_Cc].join('|'); + + // \p{\Z\Cc} (white spaces + control) + re.src_ZCc = [re.src_Z, re.src_Cc].join('|'); + + // Experimental. List of chars, completely prohibited in links + // because can separate it from other part of text + const text_separators = '[><\uff5c]'; + + // All possible word characters (everything without punctuation, spaces & controls) + // Defined via punctuation & spaces to save space + // Should be something like \p{\L\N\S\M} (\w but without `_`) + re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')'; + // The same as abothe but without [0-9] + // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')'; + + re.src_ip4 = + + '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'; + + // Prohibit any of "@/[]()" in user/pass to avoid wrong domain fetch. + re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\[\\]()]).)+@)?'; + + re.src_port = + + '(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?'; + + re.src_host_terminator = + + '(?=$|' + text_separators + '|' + re.src_ZPCc + ')' + + '(?!' + (opts['---'] ? '-(?!--)|' : '-|') + '_|:\\d|\\.-|\\.(?!$|' + re.src_ZPCc + '))'; + + re.src_path = + + '(?:' + + '[/?#]' + + '(?:' + + '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\]{}.,"\'?!\\-;]).|' + + '\\[(?:(?!' + re.src_ZCc + '|\\]).)*\\]|' + + '\\((?:(?!' + re.src_ZCc + '|[)]).)*\\)|' + + '\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\}|' + + '\\"(?:(?!' + re.src_ZCc + '|["]).)+\\"|' + + "\\'(?:(?!" + re.src_ZCc + "|[']).)+\\'|" + + + // allow `I'm_king` if no pair found + "\\'(?=" + re.src_pseudo_letter + '|[-])|' + + + // google has many dots in "google search" links (#66, #81). + // github has ... in commit range links, + // Restrict to + // - english + // - percent-encoded + // - parts of file path + // - params separator + // until more examples found. + '\\.{2,}[a-zA-Z0-9%/&]|' + + + '\\.(?!' + re.src_ZCc + '|[.]|$)|' + + (opts['---'] + ? '\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate + : '\\-+|' + ) + + // allow `,,,` in paths + ',(?!' + re.src_ZCc + '|$)|' + + + // allow `;` if not followed by space-like char + ';(?!' + re.src_ZCc + '|$)|' + + + // allow `!!!` in paths, but not at the end + '\\!+(?!' + re.src_ZCc + '|[!]|$)|' + + + '\\?(?!' + re.src_ZCc + '|[?]|$)' + + ')+' + + '|\\/' + + ')?'; + + // Allow anything in markdown spec, forbid quote (") at the first position + // because emails enclosed in quotes are far more common + re.src_email_name = + + '[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*'; + + re.src_xn = + + 'xn--[a-z0-9\\-]{1,59}'; + + // More to read about domain names + // http://serverfault.com/questions/638260/ + + re.src_domain_root = + + // Allow letters & digits (http://test1) + '(?:' + + re.src_xn + + '|' + + re.src_pseudo_letter + '{1,63}' + + ')'; + + re.src_domain = + + '(?:' + + re.src_xn + + '|' + + '(?:' + re.src_pseudo_letter + ')' + + '|' + + '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' + + ')'; + + re.src_host = + + '(?:' + + // Don't need IP check, because digits are already allowed in normal domain names + // src_ip4 + + // '|' + + '(?:(?:(?:' + re.src_domain + ')\\.)*' + re.src_domain/* _root */ + ')' + + ')'; + + re.tpl_host_fuzzy = + + '(?:' + + re.src_ip4 + + '|' + + '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))' + + ')'; + + re.tpl_host_no_ip_fuzzy = + + '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))'; + + re.src_host_strict = + + re.src_host + re.src_host_terminator; + + re.tpl_host_fuzzy_strict = + + re.tpl_host_fuzzy + re.src_host_terminator; + + re.src_host_port_strict = + + re.src_host + re.src_port + re.src_host_terminator; + + re.tpl_host_port_fuzzy_strict = + + re.tpl_host_fuzzy + re.src_port + re.src_host_terminator; + + re.tpl_host_port_no_ip_fuzzy_strict = + + re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator; + + // + // Main rules + // + + // Rude test fuzzy links by host, for quick deny + re.tpl_host_fuzzy_test = + + 'localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))'; + + re.tpl_email_fuzzy = + + '(^|' + text_separators + '|"|\\(|' + re.src_ZCc + ')' + + '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')'; + + re.tpl_link_fuzzy = + // Fuzzy link can't be prepended with .:/\- and non punctuation. + // but can start with > (markdown blockquote) + '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')'; + + re.tpl_link_no_ip_fuzzy = + // Fuzzy link can't be prepended with .:/\- and non punctuation. + // but can start with > (markdown blockquote) + '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')'; + + return re +} + +// +// Helpers +// + +// Merge objects +// +function assign (obj /* from1, from2, from3, ... */) { + const sources = Array.prototype.slice.call(arguments, 1); + + sources.forEach(function (source) { + if (!source) { return } + + Object.keys(source).forEach(function (key) { + obj[key] = source[key]; + }); + }); + + return obj +} + +function _class (obj) { return Object.prototype.toString.call(obj) } +function isString (obj) { return _class(obj) === '[object String]' } +function isObject (obj) { return _class(obj) === '[object Object]' } +function isRegExp (obj) { return _class(obj) === '[object RegExp]' } +function isFunction (obj) { return _class(obj) === '[object Function]' } + +function escapeRE (str) { return str.replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&') } + +// + +const defaultOptions = { + fuzzyLink: true, + fuzzyEmail: true, + fuzzyIP: false +}; + +function isOptionsObj (obj) { + return Object.keys(obj || {}).reduce(function (acc, k) { + /* eslint-disable-next-line no-prototype-builtins */ + return acc || defaultOptions.hasOwnProperty(k) + }, false) +} + +const defaultSchemas = { + 'http:': { + validate: function (text, pos, self) { + const tail = text.slice(pos); + + if (!self.re.http) { + // compile lazily, because "host"-containing variables can change on tlds update. + self.re.http = new RegExp( + '^\\/\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i' + ); + } + if (self.re.http.test(tail)) { + return tail.match(self.re.http)[0].length + } + return 0 + } + }, + 'https:': 'http:', + 'ftp:': 'http:', + '//': { + validate: function (text, pos, self) { + const tail = text.slice(pos); + + if (!self.re.no_http) { + // compile lazily, because "host"-containing variables can change on tlds update. + self.re.no_http = new RegExp( + '^' + + self.re.src_auth + + // Don't allow single-level domains, because of false positives like '//test' + // with code comments + '(?:localhost|(?:(?:' + self.re.src_domain + ')\\.)+' + self.re.src_domain_root + ')' + + self.re.src_port + + self.re.src_host_terminator + + self.re.src_path, + + 'i' + ); + } + + if (self.re.no_http.test(tail)) { + // should not be `://` & `///`, that protects from errors in protocol name + if (pos >= 3 && text[pos - 3] === ':') { return 0 } + if (pos >= 3 && text[pos - 3] === '/') { return 0 } + return tail.match(self.re.no_http)[0].length + } + return 0 + } + }, + 'mailto:': { + validate: function (text, pos, self) { + const tail = text.slice(pos); + + if (!self.re.mailto) { + self.re.mailto = new RegExp( + '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i' + ); + } + if (self.re.mailto.test(tail)) { + return tail.match(self.re.mailto)[0].length + } + return 0 + } + } +}; + +// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js) +/* eslint-disable-next-line max-len */ +const tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]'; + +// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead +const tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|'); + +function resetScanCache (self) { + self.__index__ = -1; + self.__text_cache__ = ''; +} + +function createValidator (re) { + return function (text, pos) { + const tail = text.slice(pos); + + if (re.test(tail)) { + return tail.match(re)[0].length + } + return 0 + } +} + +function createNormalizer () { + return function (match, self) { + self.normalize(match); + } +} + +// Schemas compiler. Build regexps. +// +function compile (self) { + // Load & clone RE patterns. + const re = self.re = reFactory(self.__opts__); + + // Define dynamic patterns + const tlds = self.__tlds__.slice(); + + self.onCompile(); + + if (!self.__tlds_replaced__) { + tlds.push(tlds_2ch_src_re); + } + tlds.push(re.src_xn); + + re.src_tlds = tlds.join('|'); + + function untpl (tpl) { return tpl.replace('%TLDS%', re.src_tlds) } + + re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i'); + re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i'); + re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i'); + re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i'); + + // + // Compile each schema + // + + const aliases = []; + + self.__compiled__ = {}; // Reset compiled data + + function schemaError (name, val) { + throw new Error('(LinkifyIt) Invalid schema "' + name + '": ' + val) + } + + Object.keys(self.__schemas__).forEach(function (name) { + const val = self.__schemas__[name]; + + // skip disabled methods + if (val === null) { return } + + const compiled = { validate: null, link: null }; + + self.__compiled__[name] = compiled; + + if (isObject(val)) { + if (isRegExp(val.validate)) { + compiled.validate = createValidator(val.validate); + } else if (isFunction(val.validate)) { + compiled.validate = val.validate; + } else { + schemaError(name, val); + } + + if (isFunction(val.normalize)) { + compiled.normalize = val.normalize; + } else if (!val.normalize) { + compiled.normalize = createNormalizer(); + } else { + schemaError(name, val); + } + + return + } + + if (isString(val)) { + aliases.push(name); + return + } + + schemaError(name, val); + }); + + // + // Compile postponed aliases + // + + aliases.forEach(function (alias) { + if (!self.__compiled__[self.__schemas__[alias]]) { + // Silently fail on missed schemas to avoid errons on disable. + // schemaError(alias, self.__schemas__[alias]); + return + } + + self.__compiled__[alias].validate = + self.__compiled__[self.__schemas__[alias]].validate; + self.__compiled__[alias].normalize = + self.__compiled__[self.__schemas__[alias]].normalize; + }); + + // + // Fake record for guessed links + // + self.__compiled__[''] = { validate: null, normalize: createNormalizer() }; + + // + // Build schema condition + // + const slist = Object.keys(self.__compiled__) + .filter(function (name) { + // Filter disabled & fake schemas + return name.length > 0 && self.__compiled__[name] + }) + .map(escapeRE) + .join('|'); + // (?!_) cause 1.5x slowdown + self.re.schema_test = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i'); + self.re.schema_search = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig'); + self.re.schema_at_start = RegExp('^' + self.re.schema_search.source, 'i'); + + self.re.pretest = RegExp( + '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@', + 'i' + ); + + // + // Cleanup + // + + resetScanCache(self); +} + +/** + * class Match + * + * Match result. Single element of array, returned by [[LinkifyIt#match]] + **/ +function Match (self, shift) { + const start = self.__index__; + const end = self.__last_index__; + const text = self.__text_cache__.slice(start, end); + + /** + * Match#schema -> String + * + * Prefix (protocol) for matched string. + **/ + this.schema = self.__schema__.toLowerCase(); + /** + * Match#index -> Number + * + * First position of matched string. + **/ + this.index = start + shift; + /** + * Match#lastIndex -> Number + * + * Next position after matched string. + **/ + this.lastIndex = end + shift; + /** + * Match#raw -> String + * + * Matched string. + **/ + this.raw = text; + /** + * Match#text -> String + * + * Notmalized text of matched string. + **/ + this.text = text; + /** + * Match#url -> String + * + * Normalized url of matched string. + **/ + this.url = text; +} + +function createMatch (self, shift) { + const match = new Match(self, shift); + + self.__compiled__[match.schema].normalize(match, self); + + return match +} + +/** + * class LinkifyIt + **/ + +/** + * new LinkifyIt(schemas, options) + * - schemas (Object): Optional. Additional schemas to validate (prefix/validator) + * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + * + * Creates new linkifier instance with optional additional schemas. + * Can be called without `new` keyword for convenience. + * + * By default understands: + * + * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links + * - "fuzzy" links and emails (example.com, foo@bar.com). + * + * `schemas` is an object, where each key/value describes protocol/rule: + * + * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:` + * for example). `linkify-it` makes shure that prefix is not preceeded with + * alphanumeric char and symbols. Only whitespaces and punctuation allowed. + * - __value__ - rule to check tail after link prefix + * - _String_ - just alias to existing rule + * - _Object_ + * - _validate_ - validator function (should return matched length on success), + * or `RegExp`. + * - _normalize_ - optional function to normalize text & url of matched result + * (for example, for @twitter mentions). + * + * `options`: + * + * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`. + * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts + * like version numbers. Default `false`. + * - __fuzzyEmail__ - recognize emails without `mailto:` prefix. + * + **/ +function LinkifyIt (schemas, options) { + if (!(this instanceof LinkifyIt)) { + return new LinkifyIt(schemas, options) + } + + if (!options) { + if (isOptionsObj(schemas)) { + options = schemas; + schemas = {}; + } + } + + this.__opts__ = assign({}, defaultOptions, options); + + // Cache last tested result. Used to skip repeating steps on next `match` call. + this.__index__ = -1; + this.__last_index__ = -1; // Next scan position + this.__schema__ = ''; + this.__text_cache__ = ''; + + this.__schemas__ = assign({}, defaultSchemas, schemas); + this.__compiled__ = {}; + + this.__tlds__ = tlds_default; + this.__tlds_replaced__ = false; + + this.re = {}; + + compile(this); +} + +/** chainable + * LinkifyIt#add(schema, definition) + * - schema (String): rule name (fixed pattern prefix) + * - definition (String|RegExp|Object): schema definition + * + * Add new rule definition. See constructor description for details. + **/ +LinkifyIt.prototype.add = function add (schema, definition) { + this.__schemas__[schema] = definition; + compile(this); + return this +}; + +/** chainable + * LinkifyIt#set(options) + * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + * + * Set recognition options for links without schema. + **/ +LinkifyIt.prototype.set = function set (options) { + this.__opts__ = assign(this.__opts__, options); + return this +}; + +/** + * LinkifyIt#test(text) -> Boolean + * + * Searches linkifiable pattern and returns `true` on success or `false` on fail. + **/ +LinkifyIt.prototype.test = function test (text) { + // Reset scan cache + this.__text_cache__ = text; + this.__index__ = -1; + + if (!text.length) { return false } + + let m, ml, me, len, shift, next, re, tld_pos, at_pos; + + // try to scan for link with schema - that's the most simple rule + if (this.re.schema_test.test(text)) { + re = this.re.schema_search; + re.lastIndex = 0; + while ((m = re.exec(text)) !== null) { + len = this.testSchemaAt(text, m[2], re.lastIndex); + if (len) { + this.__schema__ = m[2]; + this.__index__ = m.index + m[1].length; + this.__last_index__ = m.index + m[0].length + len; + break + } + } + } + + if (this.__opts__.fuzzyLink && this.__compiled__['http:']) { + // guess schemaless links + tld_pos = text.search(this.re.host_fuzzy_test); + if (tld_pos >= 0) { + // if tld is located after found link - no need to check fuzzy pattern + if (this.__index__ < 0 || tld_pos < this.__index__) { + if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) { + shift = ml.index + ml[1].length; + + if (this.__index__ < 0 || shift < this.__index__) { + this.__schema__ = ''; + this.__index__ = shift; + this.__last_index__ = ml.index + ml[0].length; + } + } + } + } + } + + if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) { + // guess schemaless emails + at_pos = text.indexOf('@'); + if (at_pos >= 0) { + // We can't skip this check, because this cases are possible: + // 192.168.1.1@gmail.com, my.in@example.com + if ((me = text.match(this.re.email_fuzzy)) !== null) { + shift = me.index + me[1].length; + next = me.index + me[0].length; + + if (this.__index__ < 0 || shift < this.__index__ || + (shift === this.__index__ && next > this.__last_index__)) { + this.__schema__ = 'mailto:'; + this.__index__ = shift; + this.__last_index__ = next; + } + } + } + } + + return this.__index__ >= 0 +}; + +/** + * LinkifyIt#pretest(text) -> Boolean + * + * Very quick check, that can give false positives. Returns true if link MAY BE + * can exists. Can be used for speed optimization, when you need to check that + * link NOT exists. + **/ +LinkifyIt.prototype.pretest = function pretest (text) { + return this.re.pretest.test(text) +}; + +/** + * LinkifyIt#testSchemaAt(text, name, position) -> Number + * - text (String): text to scan + * - name (String): rule (schema) name + * - position (Number): text offset to check from + * + * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly + * at given position. Returns length of found pattern (0 on fail). + **/ +LinkifyIt.prototype.testSchemaAt = function testSchemaAt (text, schema, pos) { + // If not supported schema check requested - terminate + if (!this.__compiled__[schema.toLowerCase()]) { + return 0 + } + return this.__compiled__[schema.toLowerCase()].validate(text, pos, this) +}; + +/** + * LinkifyIt#match(text) -> Array|null + * + * Returns array of found link descriptions or `null` on fail. We strongly + * recommend to use [[LinkifyIt#test]] first, for best speed. + * + * ##### Result match description + * + * - __schema__ - link schema, can be empty for fuzzy links, or `//` for + * protocol-neutral links. + * - __index__ - offset of matched text + * - __lastIndex__ - index of next char after mathch end + * - __raw__ - matched text + * - __text__ - normalized text + * - __url__ - link, generated from matched text + **/ +LinkifyIt.prototype.match = function match (text) { + const result = []; + let shift = 0; + + // Try to take previous element from cache, if .test() called before + if (this.__index__ >= 0 && this.__text_cache__ === text) { + result.push(createMatch(this, shift)); + shift = this.__last_index__; + } + + // Cut head if cache was used + let tail = shift ? text.slice(shift) : text; + + // Scan string until end reached + while (this.test(tail)) { + result.push(createMatch(this, shift)); + + tail = tail.slice(this.__last_index__); + shift += this.__last_index__; + } + + if (result.length) { + return result + } + + return null +}; + +/** + * LinkifyIt#matchAtStart(text) -> Match|null + * + * Returns fully-formed (not fuzzy) link if it starts at the beginning + * of the string, and null otherwise. + **/ +LinkifyIt.prototype.matchAtStart = function matchAtStart (text) { + // Reset scan cache + this.__text_cache__ = text; + this.__index__ = -1; + + if (!text.length) return null + + const m = this.re.schema_at_start.exec(text); + if (!m) return null + + const len = this.testSchemaAt(text, m[2], m[0].length); + if (!len) return null + + this.__schema__ = m[2]; + this.__index__ = m.index + m[1].length; + this.__last_index__ = m.index + m[0].length + len; + + return createMatch(this, 0) +}; + +/** chainable + * LinkifyIt#tlds(list [, keepOld]) -> this + * - list (Array): list of tlds + * - keepOld (Boolean): merge with current list if `true` (`false` by default) + * + * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix) + * to avoid false positives. By default this algorythm used: + * + * - hostname with any 2-letter root zones are ok. + * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф + * are ok. + * - encoded (`xn--...`) root zones are ok. + * + * If list is replaced, then exact match for 2-chars root zones will be checked. + **/ +LinkifyIt.prototype.tlds = function tlds (list, keepOld) { + list = Array.isArray(list) ? list : [list]; + + if (!keepOld) { + this.__tlds__ = list.slice(); + this.__tlds_replaced__ = true; + compile(this); + return this + } + + this.__tlds__ = this.__tlds__.concat(list) + .sort() + .filter(function (el, idx, arr) { + return el !== arr[idx - 1] + }) + .reverse(); + + compile(this); + return this +}; + +/** + * LinkifyIt#normalize(match) + * + * Default normalizer (if schema does not define it's own). + **/ +LinkifyIt.prototype.normalize = function normalize (match) { + // Do minimal possible changes by default. Need to collect feedback prior + // to move forward https://github.com/markdown-it/linkify-it/issues/1 + + if (!match.schema) { match.url = 'http://' + match.url; } + + if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) { + match.url = 'mailto:' + match.url; + } +}; + +/** + * LinkifyIt#onCompile() + * + * Override to modify basic RegExp-s. + **/ +LinkifyIt.prototype.onCompile = function onCompile () { +}; + +module.exports = LinkifyIt; diff --git a/node_modules/linkify-it/index.mjs b/node_modules/linkify-it/index.mjs new file mode 100644 index 0000000..f4c8e13 --- /dev/null +++ b/node_modules/linkify-it/index.mjs @@ -0,0 +1,642 @@ +import reFactory from './lib/re.mjs' + +// +// Helpers +// + +// Merge objects +// +function assign (obj /* from1, from2, from3, ... */) { + const sources = Array.prototype.slice.call(arguments, 1) + + sources.forEach(function (source) { + if (!source) { return } + + Object.keys(source).forEach(function (key) { + obj[key] = source[key] + }) + }) + + return obj +} + +function _class (obj) { return Object.prototype.toString.call(obj) } +function isString (obj) { return _class(obj) === '[object String]' } +function isObject (obj) { return _class(obj) === '[object Object]' } +function isRegExp (obj) { return _class(obj) === '[object RegExp]' } +function isFunction (obj) { return _class(obj) === '[object Function]' } + +function escapeRE (str) { return str.replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&') } + +// + +const defaultOptions = { + fuzzyLink: true, + fuzzyEmail: true, + fuzzyIP: false +} + +function isOptionsObj (obj) { + return Object.keys(obj || {}).reduce(function (acc, k) { + /* eslint-disable-next-line no-prototype-builtins */ + return acc || defaultOptions.hasOwnProperty(k) + }, false) +} + +const defaultSchemas = { + 'http:': { + validate: function (text, pos, self) { + const tail = text.slice(pos) + + if (!self.re.http) { + // compile lazily, because "host"-containing variables can change on tlds update. + self.re.http = new RegExp( + '^\\/\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i' + ) + } + if (self.re.http.test(tail)) { + return tail.match(self.re.http)[0].length + } + return 0 + } + }, + 'https:': 'http:', + 'ftp:': 'http:', + '//': { + validate: function (text, pos, self) { + const tail = text.slice(pos) + + if (!self.re.no_http) { + // compile lazily, because "host"-containing variables can change on tlds update. + self.re.no_http = new RegExp( + '^' + + self.re.src_auth + + // Don't allow single-level domains, because of false positives like '//test' + // with code comments + '(?:localhost|(?:(?:' + self.re.src_domain + ')\\.)+' + self.re.src_domain_root + ')' + + self.re.src_port + + self.re.src_host_terminator + + self.re.src_path, + + 'i' + ) + } + + if (self.re.no_http.test(tail)) { + // should not be `://` & `///`, that protects from errors in protocol name + if (pos >= 3 && text[pos - 3] === ':') { return 0 } + if (pos >= 3 && text[pos - 3] === '/') { return 0 } + return tail.match(self.re.no_http)[0].length + } + return 0 + } + }, + 'mailto:': { + validate: function (text, pos, self) { + const tail = text.slice(pos) + + if (!self.re.mailto) { + self.re.mailto = new RegExp( + '^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i' + ) + } + if (self.re.mailto.test(tail)) { + return tail.match(self.re.mailto)[0].length + } + return 0 + } + } +} + +// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js) +/* eslint-disable-next-line max-len */ +const tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]' + +// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead +const tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|') + +function resetScanCache (self) { + self.__index__ = -1 + self.__text_cache__ = '' +} + +function createValidator (re) { + return function (text, pos) { + const tail = text.slice(pos) + + if (re.test(tail)) { + return tail.match(re)[0].length + } + return 0 + } +} + +function createNormalizer () { + return function (match, self) { + self.normalize(match) + } +} + +// Schemas compiler. Build regexps. +// +function compile (self) { + // Load & clone RE patterns. + const re = self.re = reFactory(self.__opts__) + + // Define dynamic patterns + const tlds = self.__tlds__.slice() + + self.onCompile() + + if (!self.__tlds_replaced__) { + tlds.push(tlds_2ch_src_re) + } + tlds.push(re.src_xn) + + re.src_tlds = tlds.join('|') + + function untpl (tpl) { return tpl.replace('%TLDS%', re.src_tlds) } + + re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i') + re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i') + re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i') + re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i') + + // + // Compile each schema + // + + const aliases = [] + + self.__compiled__ = {} // Reset compiled data + + function schemaError (name, val) { + throw new Error('(LinkifyIt) Invalid schema "' + name + '": ' + val) + } + + Object.keys(self.__schemas__).forEach(function (name) { + const val = self.__schemas__[name] + + // skip disabled methods + if (val === null) { return } + + const compiled = { validate: null, link: null } + + self.__compiled__[name] = compiled + + if (isObject(val)) { + if (isRegExp(val.validate)) { + compiled.validate = createValidator(val.validate) + } else if (isFunction(val.validate)) { + compiled.validate = val.validate + } else { + schemaError(name, val) + } + + if (isFunction(val.normalize)) { + compiled.normalize = val.normalize + } else if (!val.normalize) { + compiled.normalize = createNormalizer() + } else { + schemaError(name, val) + } + + return + } + + if (isString(val)) { + aliases.push(name) + return + } + + schemaError(name, val) + }) + + // + // Compile postponed aliases + // + + aliases.forEach(function (alias) { + if (!self.__compiled__[self.__schemas__[alias]]) { + // Silently fail on missed schemas to avoid errons on disable. + // schemaError(alias, self.__schemas__[alias]); + return + } + + self.__compiled__[alias].validate = + self.__compiled__[self.__schemas__[alias]].validate + self.__compiled__[alias].normalize = + self.__compiled__[self.__schemas__[alias]].normalize + }) + + // + // Fake record for guessed links + // + self.__compiled__[''] = { validate: null, normalize: createNormalizer() } + + // + // Build schema condition + // + const slist = Object.keys(self.__compiled__) + .filter(function (name) { + // Filter disabled & fake schemas + return name.length > 0 && self.__compiled__[name] + }) + .map(escapeRE) + .join('|') + // (?!_) cause 1.5x slowdown + self.re.schema_test = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i') + self.re.schema_search = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig') + self.re.schema_at_start = RegExp('^' + self.re.schema_search.source, 'i') + + self.re.pretest = RegExp( + '(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@', + 'i' + ) + + // + // Cleanup + // + + resetScanCache(self) +} + +/** + * class Match + * + * Match result. Single element of array, returned by [[LinkifyIt#match]] + **/ +function Match (self, shift) { + const start = self.__index__ + const end = self.__last_index__ + const text = self.__text_cache__.slice(start, end) + + /** + * Match#schema -> String + * + * Prefix (protocol) for matched string. + **/ + this.schema = self.__schema__.toLowerCase() + /** + * Match#index -> Number + * + * First position of matched string. + **/ + this.index = start + shift + /** + * Match#lastIndex -> Number + * + * Next position after matched string. + **/ + this.lastIndex = end + shift + /** + * Match#raw -> String + * + * Matched string. + **/ + this.raw = text + /** + * Match#text -> String + * + * Notmalized text of matched string. + **/ + this.text = text + /** + * Match#url -> String + * + * Normalized url of matched string. + **/ + this.url = text +} + +function createMatch (self, shift) { + const match = new Match(self, shift) + + self.__compiled__[match.schema].normalize(match, self) + + return match +} + +/** + * class LinkifyIt + **/ + +/** + * new LinkifyIt(schemas, options) + * - schemas (Object): Optional. Additional schemas to validate (prefix/validator) + * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + * + * Creates new linkifier instance with optional additional schemas. + * Can be called without `new` keyword for convenience. + * + * By default understands: + * + * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links + * - "fuzzy" links and emails (example.com, foo@bar.com). + * + * `schemas` is an object, where each key/value describes protocol/rule: + * + * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:` + * for example). `linkify-it` makes shure that prefix is not preceeded with + * alphanumeric char and symbols. Only whitespaces and punctuation allowed. + * - __value__ - rule to check tail after link prefix + * - _String_ - just alias to existing rule + * - _Object_ + * - _validate_ - validator function (should return matched length on success), + * or `RegExp`. + * - _normalize_ - optional function to normalize text & url of matched result + * (for example, for @twitter mentions). + * + * `options`: + * + * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`. + * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts + * like version numbers. Default `false`. + * - __fuzzyEmail__ - recognize emails without `mailto:` prefix. + * + **/ +function LinkifyIt (schemas, options) { + if (!(this instanceof LinkifyIt)) { + return new LinkifyIt(schemas, options) + } + + if (!options) { + if (isOptionsObj(schemas)) { + options = schemas + schemas = {} + } + } + + this.__opts__ = assign({}, defaultOptions, options) + + // Cache last tested result. Used to skip repeating steps on next `match` call. + this.__index__ = -1 + this.__last_index__ = -1 // Next scan position + this.__schema__ = '' + this.__text_cache__ = '' + + this.__schemas__ = assign({}, defaultSchemas, schemas) + this.__compiled__ = {} + + this.__tlds__ = tlds_default + this.__tlds_replaced__ = false + + this.re = {} + + compile(this) +} + +/** chainable + * LinkifyIt#add(schema, definition) + * - schema (String): rule name (fixed pattern prefix) + * - definition (String|RegExp|Object): schema definition + * + * Add new rule definition. See constructor description for details. + **/ +LinkifyIt.prototype.add = function add (schema, definition) { + this.__schemas__[schema] = definition + compile(this) + return this +} + +/** chainable + * LinkifyIt#set(options) + * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + * + * Set recognition options for links without schema. + **/ +LinkifyIt.prototype.set = function set (options) { + this.__opts__ = assign(this.__opts__, options) + return this +} + +/** + * LinkifyIt#test(text) -> Boolean + * + * Searches linkifiable pattern and returns `true` on success or `false` on fail. + **/ +LinkifyIt.prototype.test = function test (text) { + // Reset scan cache + this.__text_cache__ = text + this.__index__ = -1 + + if (!text.length) { return false } + + let m, ml, me, len, shift, next, re, tld_pos, at_pos + + // try to scan for link with schema - that's the most simple rule + if (this.re.schema_test.test(text)) { + re = this.re.schema_search + re.lastIndex = 0 + while ((m = re.exec(text)) !== null) { + len = this.testSchemaAt(text, m[2], re.lastIndex) + if (len) { + this.__schema__ = m[2] + this.__index__ = m.index + m[1].length + this.__last_index__ = m.index + m[0].length + len + break + } + } + } + + if (this.__opts__.fuzzyLink && this.__compiled__['http:']) { + // guess schemaless links + tld_pos = text.search(this.re.host_fuzzy_test) + if (tld_pos >= 0) { + // if tld is located after found link - no need to check fuzzy pattern + if (this.__index__ < 0 || tld_pos < this.__index__) { + if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) { + shift = ml.index + ml[1].length + + if (this.__index__ < 0 || shift < this.__index__) { + this.__schema__ = '' + this.__index__ = shift + this.__last_index__ = ml.index + ml[0].length + } + } + } + } + } + + if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) { + // guess schemaless emails + at_pos = text.indexOf('@') + if (at_pos >= 0) { + // We can't skip this check, because this cases are possible: + // 192.168.1.1@gmail.com, my.in@example.com + if ((me = text.match(this.re.email_fuzzy)) !== null) { + shift = me.index + me[1].length + next = me.index + me[0].length + + if (this.__index__ < 0 || shift < this.__index__ || + (shift === this.__index__ && next > this.__last_index__)) { + this.__schema__ = 'mailto:' + this.__index__ = shift + this.__last_index__ = next + } + } + } + } + + return this.__index__ >= 0 +} + +/** + * LinkifyIt#pretest(text) -> Boolean + * + * Very quick check, that can give false positives. Returns true if link MAY BE + * can exists. Can be used for speed optimization, when you need to check that + * link NOT exists. + **/ +LinkifyIt.prototype.pretest = function pretest (text) { + return this.re.pretest.test(text) +} + +/** + * LinkifyIt#testSchemaAt(text, name, position) -> Number + * - text (String): text to scan + * - name (String): rule (schema) name + * - position (Number): text offset to check from + * + * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly + * at given position. Returns length of found pattern (0 on fail). + **/ +LinkifyIt.prototype.testSchemaAt = function testSchemaAt (text, schema, pos) { + // If not supported schema check requested - terminate + if (!this.__compiled__[schema.toLowerCase()]) { + return 0 + } + return this.__compiled__[schema.toLowerCase()].validate(text, pos, this) +} + +/** + * LinkifyIt#match(text) -> Array|null + * + * Returns array of found link descriptions or `null` on fail. We strongly + * recommend to use [[LinkifyIt#test]] first, for best speed. + * + * ##### Result match description + * + * - __schema__ - link schema, can be empty for fuzzy links, or `//` for + * protocol-neutral links. + * - __index__ - offset of matched text + * - __lastIndex__ - index of next char after mathch end + * - __raw__ - matched text + * - __text__ - normalized text + * - __url__ - link, generated from matched text + **/ +LinkifyIt.prototype.match = function match (text) { + const result = [] + let shift = 0 + + // Try to take previous element from cache, if .test() called before + if (this.__index__ >= 0 && this.__text_cache__ === text) { + result.push(createMatch(this, shift)) + shift = this.__last_index__ + } + + // Cut head if cache was used + let tail = shift ? text.slice(shift) : text + + // Scan string until end reached + while (this.test(tail)) { + result.push(createMatch(this, shift)) + + tail = tail.slice(this.__last_index__) + shift += this.__last_index__ + } + + if (result.length) { + return result + } + + return null +} + +/** + * LinkifyIt#matchAtStart(text) -> Match|null + * + * Returns fully-formed (not fuzzy) link if it starts at the beginning + * of the string, and null otherwise. + **/ +LinkifyIt.prototype.matchAtStart = function matchAtStart (text) { + // Reset scan cache + this.__text_cache__ = text + this.__index__ = -1 + + if (!text.length) return null + + const m = this.re.schema_at_start.exec(text) + if (!m) return null + + const len = this.testSchemaAt(text, m[2], m[0].length) + if (!len) return null + + this.__schema__ = m[2] + this.__index__ = m.index + m[1].length + this.__last_index__ = m.index + m[0].length + len + + return createMatch(this, 0) +} + +/** chainable + * LinkifyIt#tlds(list [, keepOld]) -> this + * - list (Array): list of tlds + * - keepOld (Boolean): merge with current list if `true` (`false` by default) + * + * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix) + * to avoid false positives. By default this algorythm used: + * + * - hostname with any 2-letter root zones are ok. + * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф + * are ok. + * - encoded (`xn--...`) root zones are ok. + * + * If list is replaced, then exact match for 2-chars root zones will be checked. + **/ +LinkifyIt.prototype.tlds = function tlds (list, keepOld) { + list = Array.isArray(list) ? list : [list] + + if (!keepOld) { + this.__tlds__ = list.slice() + this.__tlds_replaced__ = true + compile(this) + return this + } + + this.__tlds__ = this.__tlds__.concat(list) + .sort() + .filter(function (el, idx, arr) { + return el !== arr[idx - 1] + }) + .reverse() + + compile(this) + return this +} + +/** + * LinkifyIt#normalize(match) + * + * Default normalizer (if schema does not define it's own). + **/ +LinkifyIt.prototype.normalize = function normalize (match) { + // Do minimal possible changes by default. Need to collect feedback prior + // to move forward https://github.com/markdown-it/linkify-it/issues/1 + + if (!match.schema) { match.url = 'http://' + match.url } + + if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) { + match.url = 'mailto:' + match.url + } +} + +/** + * LinkifyIt#onCompile() + * + * Override to modify basic RegExp-s. + **/ +LinkifyIt.prototype.onCompile = function onCompile () { +} + +export default LinkifyIt diff --git a/node_modules/linkify-it/lib/re.mjs b/node_modules/linkify-it/lib/re.mjs new file mode 100644 index 0000000..92d12da --- /dev/null +++ b/node_modules/linkify-it/lib/re.mjs @@ -0,0 +1,189 @@ +import { Any, Cc, Z, P } from 'uc.micro' + +export default function (opts) { + const re = {} + opts = opts || {} + + re.src_Any = Any.source + re.src_Cc = Cc.source + re.src_Z = Z.source + re.src_P = P.source + + // \p{\Z\P\Cc\CF} (white spaces + control + format + punctuation) + re.src_ZPCc = [re.src_Z, re.src_P, re.src_Cc].join('|') + + // \p{\Z\Cc} (white spaces + control) + re.src_ZCc = [re.src_Z, re.src_Cc].join('|') + + // Experimental. List of chars, completely prohibited in links + // because can separate it from other part of text + const text_separators = '[><\uff5c]' + + // All possible word characters (everything without punctuation, spaces & controls) + // Defined via punctuation & spaces to save space + // Should be something like \p{\L\N\S\M} (\w but without `_`) + re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')' + // The same as abothe but without [0-9] + // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')'; + + re.src_ip4 = + + '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' + + // Prohibit any of "@/[]()" in user/pass to avoid wrong domain fetch. + re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\[\\]()]).)+@)?' + + re.src_port = + + '(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?' + + re.src_host_terminator = + + '(?=$|' + text_separators + '|' + re.src_ZPCc + ')' + + '(?!' + (opts['---'] ? '-(?!--)|' : '-|') + '_|:\\d|\\.-|\\.(?!$|' + re.src_ZPCc + '))' + + re.src_path = + + '(?:' + + '[/?#]' + + '(?:' + + '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\]{}.,"\'?!\\-;]).|' + + '\\[(?:(?!' + re.src_ZCc + '|\\]).)*\\]|' + + '\\((?:(?!' + re.src_ZCc + '|[)]).)*\\)|' + + '\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\}|' + + '\\"(?:(?!' + re.src_ZCc + '|["]).)+\\"|' + + "\\'(?:(?!" + re.src_ZCc + "|[']).)+\\'|" + + + // allow `I'm_king` if no pair found + "\\'(?=" + re.src_pseudo_letter + '|[-])|' + + + // google has many dots in "google search" links (#66, #81). + // github has ... in commit range links, + // Restrict to + // - english + // - percent-encoded + // - parts of file path + // - params separator + // until more examples found. + '\\.{2,}[a-zA-Z0-9%/&]|' + + + '\\.(?!' + re.src_ZCc + '|[.]|$)|' + + (opts['---'] + ? '\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate + : '\\-+|' + ) + + // allow `,,,` in paths + ',(?!' + re.src_ZCc + '|$)|' + + + // allow `;` if not followed by space-like char + ';(?!' + re.src_ZCc + '|$)|' + + + // allow `!!!` in paths, but not at the end + '\\!+(?!' + re.src_ZCc + '|[!]|$)|' + + + '\\?(?!' + re.src_ZCc + '|[?]|$)' + + ')+' + + '|\\/' + + ')?' + + // Allow anything in markdown spec, forbid quote (") at the first position + // because emails enclosed in quotes are far more common + re.src_email_name = + + '[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*' + + re.src_xn = + + 'xn--[a-z0-9\\-]{1,59}' + + // More to read about domain names + // http://serverfault.com/questions/638260/ + + re.src_domain_root = + + // Allow letters & digits (http://test1) + '(?:' + + re.src_xn + + '|' + + re.src_pseudo_letter + '{1,63}' + + ')' + + re.src_domain = + + '(?:' + + re.src_xn + + '|' + + '(?:' + re.src_pseudo_letter + ')' + + '|' + + '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' + + ')' + + re.src_host = + + '(?:' + + // Don't need IP check, because digits are already allowed in normal domain names + // src_ip4 + + // '|' + + '(?:(?:(?:' + re.src_domain + ')\\.)*' + re.src_domain/* _root */ + ')' + + ')' + + re.tpl_host_fuzzy = + + '(?:' + + re.src_ip4 + + '|' + + '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))' + + ')' + + re.tpl_host_no_ip_fuzzy = + + '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))' + + re.src_host_strict = + + re.src_host + re.src_host_terminator + + re.tpl_host_fuzzy_strict = + + re.tpl_host_fuzzy + re.src_host_terminator + + re.src_host_port_strict = + + re.src_host + re.src_port + re.src_host_terminator + + re.tpl_host_port_fuzzy_strict = + + re.tpl_host_fuzzy + re.src_port + re.src_host_terminator + + re.tpl_host_port_no_ip_fuzzy_strict = + + re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator + + // + // Main rules + // + + // Rude test fuzzy links by host, for quick deny + re.tpl_host_fuzzy_test = + + 'localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))' + + re.tpl_email_fuzzy = + + '(^|' + text_separators + '|"|\\(|' + re.src_ZCc + ')' + + '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')' + + re.tpl_link_fuzzy = + // Fuzzy link can't be prepended with .:/\- and non punctuation. + // but can start with > (markdown blockquote) + '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')' + + re.tpl_link_no_ip_fuzzy = + // Fuzzy link can't be prepended with .:/\- and non punctuation. + // but can start with > (markdown blockquote) + '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')' + + return re +} diff --git a/node_modules/linkify-it/package.json b/node_modules/linkify-it/package.json new file mode 100644 index 0000000..ae3b7c1 --- /dev/null +++ b/node_modules/linkify-it/package.json @@ -0,0 +1,58 @@ +{ + "name": "linkify-it", + "version": "5.0.0", + "description": "Links recognition library with FULL unicode support", + "keywords": [ + "linkify", + "linkifier", + "autolink", + "autolinker" + ], + "repository": "markdown-it/linkify-it", + "main": "build/index.cjs.js", + "module": "index.mjs", + "exports": { + ".": { + "require": "./build/index.cjs.js", + "import": "./index.mjs" + }, + "./*": { + "require": "./*", + "import": "./*" + } + }, + "files": [ + "index.mjs", + "lib/", + "build/" + ], + "license": "MIT", + "scripts": { + "lint": "eslint .", + "test": "npm run lint && npm run build && c8 --exclude build --exclude test -r text -r html -r lcov mocha", + "demo": "npm run lint && node support/build_demo.mjs", + "doc": "node support/build_doc.mjs", + "build": "rollup -c support/rollup.config.mjs", + "gh-pages": "npm run demo && npm run doc && shx cp -R doc/ demo/ && gh-pages -d demo -f", + "prepublishOnly": "npm run lint && npm run build && npm run gh-pages" + }, + "dependencies": { + "uc.micro": "^2.0.0" + }, + "devDependencies": { + "@rollup/plugin-node-resolve": "^15.2.3", + "ansi": "^0.3.0", + "benchmark": "^2.1.0", + "c8": "^8.0.1", + "eslint": "^8.54.0", + "eslint-config-standard": "^17.1.0", + "gh-pages": "^6.1.0", + "mdurl": "^2.0.0", + "mocha": "^10.2.0", + "ndoc": "^6.0.0", + "rollup": "^4.6.1", + "shelljs": "^0.8.4", + "shx": "^0.3.2", + "tlds": "^1.166.0" + } +} diff --git a/node_modules/liquidjs/LICENSE b/node_modules/liquidjs/LICENSE new file mode 100644 index 0000000..62a9eeb --- /dev/null +++ b/node_modules/liquidjs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Jun Yang + +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/liquidjs/README.md b/node_modules/liquidjs/README.md new file mode 100644 index 0000000..eb4d616 --- /dev/null +++ b/node_modules/liquidjs/README.md @@ -0,0 +1,243 @@ +# liquidjs +[![npm version](https://img.shields.io/npm/v/liquidjs.svg?logo=npm&style=flat-square)](https://www.npmjs.org/package/liquidjs) +[![npm downloads](https://img.shields.io/npm/dm/liquidjs.svg?style=flat-square)](https://www.npmjs.org/package/liquidjs) +[![Coverage](https://img.shields.io/coveralls/harttle/liquidjs.svg?style=flat-square)](https://coveralls.io/github/harttle/liquidjs?branch=master) +[![Build Status](https://img.shields.io/github/actions/workflow/status/harttle/liquidjs/ci-build.yml?branch=master&style=flat-square)](https://github.com/harttle/liquidjs/actions/workflows/ci-build.yml?query=branch%3Amaster) +[![DUB license](https://img.shields.io/dub/l/vibe-d.svg?style=flat-square)](https://github.com/harttle/liquidjs/blob/master/LICENSE) +[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg?style=flat-square)](https://github.com/harttle/liquidjs) + +A simple, expressive and safe [Shopify][shopify/liquid] / GitHub Pages compatible template engine in pure JavaScript. +**The purpose of this repo** is to provide a standard Liquid implementation for the JavaScript community so that [Jekyll sites](https://jekyllrb.com), [GitHub Pages](https://pages.github.com/) and [Shopify templates](https://themes.shopify.com/) can be ported to Node.js without pain. + +* [Documentation][doc] +* Please star [LiquidJS on GitHub][github]! +* Financial support via [GitHub Sponsors](https://github.com/sponsors/harttle). + +

    logo

    + +## What's it like? + +Basically there're two types of Liquid syntax: tags enclosed by `{% %}` and outputs enclosed by `{{ }}`. A Liquid template looks like: + +```liquid +{% if username %} + {{ username | append: ", welcome to LiquidJS!" | capitalize }} +{% endif %} +``` + +[A live demo](https://liquidjs.com/playground.html) is also available and here's a [quick tutorial](https://liquidjs.com/tutorials/intro-to-liquid.html) for Liquid syntax. + + +## Installation + +Install from npm in Node.js: + +```bash +npm install liquidjs +``` + +Or use the UMD bundle from jsDelivr: + +```html + +``` + +Or render directly from CLI using npx: + +```bash +npx liquidjs --template 'Hello, {{ name }}!' --context '{"name": "Snake"}' +``` + +For more details, refer to the [Setup Guide][setup]. + +## Who's Using LiquidJS? + +- [Eleventy](https://www.11ty.dev/): Eleventy, a simpler static site generator. +- [Github Docs](https://github.com/github/docs): The open-source repo for docs.github.com. +- [Kibana](https://github.com/elastic/kibana): Elastic's analytics and visualization platform for Elasticsearch; workflow features use LiquidJS for Liquid templates. +- [Opensense](https://www.opensense.com/): The smarter way to send email. +- [Directus](https://docs.directus.io/): an instant REST+GraphQL API and intuitive no-code data collaboration app for any SQL database. +- [Rock](https://www.rockrms.com/): An open source CMS, Relationship Management System (RMS) and Church Management System (ChMS) all rolled into one. +- [Mitosis](https://github.com/BuilderIO/mitosis): Write components once, run everywhere. Compiles to React, Vue, Qwik, Solid, Angular, Svelte, and more. +- [Pattern Lab](https://patternlab.io/): a frontend workshop environment that helps you build, view, test, and showcase your design system's UI components. +- [Builder.io](https://www.builder.io/m/developers): the first and only headless CMS with a visual editor that lets you drag and drop with your components, directly within your current site or app. Completely API-driven, for cleaner code and simpler workflows. +- [Microsoft Power Pages](https://learn.microsoft.com/en-us/power-pages/introduction): a secure, enterprise-grade, low-code software as a service (SaaS) platform for creating, hosting, and administering modern external-facing business websites. +- [Azure API Management developer portal](https://learn.microsoft.com/en-us/azure/api-management/api-management-howto-developer-portal): an automatically generated, fully customizable website with the documentation of your APIs. +- [WISMOlabs](https://wismolabs.com/): Post Purchase Experience platform for eCommerce retailers enhancing customer satisfaction by using LiquidJS to provide customizable post-purchase experiences through programmable email, SMS, order tracking pages, and webhooks. +- [Freshet](https://chromewebstore.google.com/detail/freshet/mpclplhdencffbilobpcapccnihpelcg): *JSON in, page out* — a Chrome extension that uses LiquidJS templates per URL pattern, so the JSON becomes a rendered, useful page. + +Feel free to create a PR or contact me to add your use case into this list! + +## Financial Support + +If you personally love LiquidJS or it's benefiting your business, please consider financially support us via [GitHub Sponsors](https://github.com/sponsors/harttle). Special thanks to our sponsors! + + +

    + Eleventy + Opensense Inc. + Microsoft + Sentry + Checkout Blocks + Customer IO + Syntax Podcast +
    + TestMu AI + Tal + Chudovo + Dailycontributors + PakStyle.pk + EscortA.com +
    + Touchless + Dropkiq + Peter deHaan + Serkan Holat + amit777 + Khaled Salem + Emmanuel Cartelli + Cartelli Emmanuel +

    + + +## Contributors ✨ + +Want to contribute? see [Contribution Guidelines][contribution]. Thanks goes to these wonderful people: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Jun Yang
    Jun Yang

    🚧 💻
    chenos
    chenos

    💻
    Zach Leatherman
    Zach Leatherman

    🐛
    Tim Hardy
    Tim Hardy

    💻
    Paul Robert Lloyd
    Paul Robert Lloyd

    💻 🐛
    Alec Larson
    Alec Larson

    💻
    Patrick Malouin
    Patrick Malouin

    💻 📖
    jaswrks
    jaswrks

    💻
    三三
    三三

    💻 🤔
    ssendev
    ssendev

    💻 📖
    wojtask9
    wojtask9

    💻
    Andrew Barclay
    Andrew Barclay

    💻
    Cory Mawhorter
    Cory Mawhorter

    💻
    Mehdi Jaffery
    Mehdi Jaffery

    💻
    Robin Bijlani
    Robin Bijlani

    💻 🐛
    Ryan Kennedy
    Ryan Kennedy

    💻
    Sami Kukkonen
    Sami Kukkonen

    💻
    Scott Santucci
    Scott Santucci

    💻
    Steven
    Steven

    💡 💻
    azu
    azu

    📖
    Joonas
    Joonas

    💻
    Jamel A.
    Jamel A.

    💻
    Brandon Pittman
    Brandon Pittman

    💻
    tgrandgent
    tgrandgent

    💻
    Martin Schuster
    Martin Schuster

    💻
    Ray
    Ray

    ⚠️ 💻
    Cristofer Gonzales
    Cristofer Gonzales

    💻
    Raymond Camden
    Raymond Camden

    📖
    Steve Stedman
    Steve Stedman

    📖
    Anthony Ciccarello
    Anthony Ciccarello

    📖
    Bogdan Chadkin
    Bogdan Chadkin

    💻
    Tejas Manohar
    Tejas Manohar

    💻
    Peter deHaan
    Peter deHaan

    📖
    amit777
    amit777

    💻
    Steffen Schuldenzucker
    Steffen Schuldenzucker

    💻
    Pixcell
    Pixcell

    💻
    Jason Etcovitch
    Jason Etcovitch

    💻
    ZC
    ZC

    📖
    Memmie Lenglet
    Memmie Lenglet

    💻
    ilhamdev0
    ilhamdev0

    📖
    一饮一啄皆是人生
    一饮一啄皆是人生

    📖
    Amit Agarwal
    Amit Agarwal

    📖
    Laurin Quast
    Laurin Quast

    💻
    Matt Vague
    Matt Vague

    💻
    Liam Bigelow
    Liam Bigelow

    💻
    Jason Kurian
    Jason Kurian

    📖
    d pham (they/them)
    d pham (they/them)

    📖
    Aleksandr Hovhannisyan
    Aleksandr Hovhannisyan

    💻
    jg-rp
    jg-rp

    💻
    Ameya Apte
    Ameya Apte

    💻
    tbdrz
    tbdrz

    📖
    Santi Albo
    Santi Albo

    📖 💻
    Yahang Wu
    Yahang Wu

    📖
    hongl
    hongl

    📖
    zxx-457
    zxx-457

    📖
    prassie
    prassie

    📖
    Slav Ivanov
    Slav Ivanov

    💻
    Daniel Rosenberg
    Daniel Rosenberg

    💻
    bobgubko
    bobgubko

    💻
    BaNgan
    BaNgan

    📖
    Mahyar Pasarzangene
    Mahyar Pasarzangene

    📖
    Tomáš Hübelbauer
    Tomáš Hübelbauer

    💻 📖
    Jason Garber
    Jason Garber

    💻
    Nick Reilingh
    Nick Reilingh

    📖
    Francisco Soto
    Francisco Soto

    💻
    David LJ
    David LJ

    📖
    Rasmus Wriedt Larsen
    Rasmus Wriedt Larsen

    📖
    Bruno Carvalho
    Bruno Carvalho

    💻
    傅鹏
    傅鹏

    💻
    Joel Hamilton
    Joel Hamilton

    💻
    Max Medve
    Max Medve

    💻
    Cosmin Popovici
    Cosmin Popovici

    📖
    Adam Tanner
    Adam Tanner

    💻
    Guillermo Casal Caro
    Guillermo Casal Caro

    💻
    Josh Soref
    Josh Soref

    📖
    Koen
    Koen

    💻
    Matthieu Bacconnier
    Matthieu Bacconnier

    📖
    Tim van Dam
    Tim van Dam

    💻
    Ed Hanton
    Ed Hanton

    📖
    Vlad GURDIGA
    Vlad GURDIGA

    📖
    裸奔狂甩丁丁
    裸奔狂甩丁丁

    📖
    Ihor Panasiuk
    Ihor Panasiuk

    💻
    Omri Rosner
    Omri Rosner

    💻
    immerrr again
    immerrr again

    📖
    Loo Rong Jie
    Loo Rong Jie

    💻
    MorielHarush
    MorielHarush

    💻
    Peak Twilight
    Peak Twilight

    💻
    Joe Cottam
    Joe Cottam

    💻
    Timmy Braun
    Timmy Braun

    💻
    Tal
    Tal

    💻
    Vladimir Filonov
    Vladimir Filonov

    💻
    + + + + + + +[shopify/liquid]: https://shopify.github.io/liquid/ +[plugins]: https://liquidjs.com/tutorials/plugins.html#Plugin-List +[setup]: https://liquidjs.com/tutorials/setup.html +[doc]: https://liquidjs.com +[github]: https://github.com/harttle/liquidjs +[oc]: https://opencollective.com/liquidjs/ +[contribution]: https://liquidjs.com/tutorials/contribution-guidelines.html diff --git a/node_modules/liquidjs/bin/liquid.js b/node_modules/liquidjs/bin/liquid.js new file mode 100755 index 0000000..9d54b86 --- /dev/null +++ b/node_modules/liquidjs/bin/liquid.js @@ -0,0 +1,139 @@ +#!/usr/bin/env node + +const fs = require('fs/promises') +const Liquid = require('..').Liquid + +// Preserve compatibility by falling back to legacy CLI behavior if: +// - stdin is redirected (i.e. not connected to a terminal) AND +// - there are either no arguments, or only a single argument which does not start with a dash +// TODO: Remove this fallback for 11.0 + +let renderPromise = null +if (!process.stdin.isTTY && (process.argv.length === 2 || (process.argv.length === 3 && !process.argv[2].startsWith('-')))) { + renderPromise = renderLegacy() +} else { + renderPromise = render() +} + +renderPromise.catch(err => { + process.stderr.write(`${err.message}\n`) + process.exitCode = 1 +}) + +async function render () { + const { program } = require('commander') + + program + .name('liquidjs') + .description('Render a Liquid template') + .requiredOption('-t, --template ', 'liquid template to render (@- to read from stdin)') // TODO: Change to argument in 11.0 + .option('-c, --context ', 'input context in JSON format (@- to read from stdin)') + .option('-o, --output ', 'write rendered output to file (omit to write to stdout)') + .option('--cache [size]', 'cache previously parsed template structures (default cache size: 1024)') + .option('--extname ', 'use a default filename extension when resolving partials and layouts') + .option('--jekyll-include', 'use jekyll-style include (pass parameters to include variable of current scope)') + .option('--js-truthy', 'use JavaScript-style truthiness') + .option('--layouts ', 'directories from where to resolve layouts (defaults to --root)') + .option('--lenient-if', 'do not throw on undefined variables in conditional expressions (when using --strict-variables)') + .option('--no-dynamic-partials', 'always treat file paths for partials and layouts as a literal value') + .option('--no-greedy', 'disable greedy matching for --trim* options') + .option('--no-relative-reference', 'require absolute file paths for partials and layouts') + .option('--ordered-filter-parameters', 'respect parameter order when using filters') + .option('--output-delimiter-left ', 'left delimiter to use for liquid outputs') + .option('--output-delimiter-right ', 'right delimiter to use for liquid outputs') + .option('--partials ', 'directories from where to resolve partials (defaults to --root)') + .option('--preserve-timezones', 'preserve input timezone in date filter') + .option('--root ', 'directories from where to resolve partials and layouts (defaults to ".")') + .option('--strict-filters', 'throw on undefined filters instead of skipping them') + .option('--strict-variables', 'throw on undefined variables instead of rendering them as empty string') + .option('--tag-delimiter-left', 'left delimiter to use for liquid tags') + .option('--tag-delimiter-right', 'right delimiter to use for liquid tags') + .option('--timezone-offset ', 'JavaScript timezone name or timezoneOffset value to use in date filter (defaults to local timezone)') + .option('--trim-output-left', 'trim whitespace from left of liquid outputs') + .option('--trim-output-right', 'trim whitespace from right of liquid outputs') + .option('--trim-tag-left', 'trim whitespace from left of liquid tags') + .option('--trim-tag-right', 'trim whitespace from right of liquid tags') + .showHelpAfterError('Use -h or --help for additional information.') + .parse() + + const options = program.opts() + + if (Object.values(options).filter((value) => value === '@-').length > 1) { + throw new Error(`The stdin input specifier '@-' must only be used once.`) + } + + const template = await resolveInputOption(options.template) + const context = await resolveContext(options.context) + const liquid = new Liquid(options) + const output = liquid.parseAndRenderSync(template, context) + if (options.output) { + await fs.writeFile(options.output, output) + } else { + process.stdout.write(output) + } +} + +async function resolveContext (contextOption) { + let contextJson = '{}' + if (contextOption) { + contextJson = await resolveInputOption(contextOption) + } + const context = JSON.parse(contextJson) + return context +} + +async function resolveInputOption (option) { + let content = null + if (option) { + if (option === '@-') { + content = await readStream(process.stdin) + } else if (option.startsWith('@')) { + const filePath = option.slice(1) + const stat = await fs.stat(filePath, { throwIfNoEntry: false }) + if (!stat || !stat.isFile) { + throw new Error(`'${filePath}' does not exist or is not a file`) + } + content = await fs.readFile(filePath, 'utf8') + } else { + content = option + } + } + return content +} + +async function readStream (stream) { + const chunks = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + return Buffer.concat(chunks).toString('utf8') +} + +// TODO: Remove for 11.0 +async function renderLegacy () { + process.stderr.write('Reading template from stdin. This mode will be removed in next major version, use --template option instead.\n') + const contextArg = process.argv.slice(2)[0] + let context = {} + if (contextArg) { + const contextJson = await resolveInputOptionLegacy(contextArg) + context = JSON.parse(contextJson) + } + const template = await readStream(process.stdin) + const liquid = new Liquid() + const output = liquid.parseAndRenderSync(template, context) + process.stdout.write(output) +} + +// TODO: Remove for 11.0 +async function resolveInputOptionLegacy (option) { + let content = null + if (option) { + const stat = await fs.stat(option).catch(e => null) + if (stat && stat.isFile) { + content = await fs.readFile(option, 'utf8') + } else { + content = option + } + } + return content +} diff --git a/node_modules/liquidjs/dist/build/base64-impl-browser.d.ts b/node_modules/liquidjs/dist/build/base64-impl-browser.d.ts new file mode 100644 index 0000000..36d3eb7 --- /dev/null +++ b/node_modules/liquidjs/dist/build/base64-impl-browser.d.ts @@ -0,0 +1,2 @@ +export declare function base64Encode(str: string): string; +export declare function base64Decode(str: string): string; diff --git a/node_modules/liquidjs/dist/build/base64-impl-browser.spec.d.ts b/node_modules/liquidjs/dist/build/base64-impl-browser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/build/base64-impl-browser.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/build/crypto-impl-browser.d.ts b/node_modules/liquidjs/dist/build/crypto-impl-browser.d.ts new file mode 100644 index 0000000..5d473e1 --- /dev/null +++ b/node_modules/liquidjs/dist/build/crypto-impl-browser.d.ts @@ -0,0 +1,2 @@ +export declare function sha256(str: string): Promise; +export declare function hmacSha256(str: string, key: string): Promise; diff --git a/node_modules/liquidjs/dist/build/crypto-impl-browser.spec.d.ts b/node_modules/liquidjs/dist/build/crypto-impl-browser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/build/crypto-impl-browser.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/build/fs-impl-browser.d.ts b/node_modules/liquidjs/dist/build/fs-impl-browser.d.ts new file mode 100644 index 0000000..094df8d --- /dev/null +++ b/node_modules/liquidjs/dist/build/fs-impl-browser.d.ts @@ -0,0 +1,7 @@ +export declare function resolve(root: string, filepath: string, ext: string): string; +export declare function readFile(url: string): Promise; +export declare function readFileSync(url: string): string; +export declare function exists(filepath: string): Promise; +export declare function existsSync(filepath: string): boolean; +export declare function dirname(filepath: string): string; +export declare const sep = "/"; diff --git a/node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts b/node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts b/node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts new file mode 100644 index 0000000..19883ca --- /dev/null +++ b/node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts @@ -0,0 +1,10 @@ +/// +import { Emitter } from '../emitters'; +export declare class StreamedEmitter implements Emitter { + buffer: string; + stream: NodeJS.ReadableStream; + constructor(); + write: (html: any) => void; + error: (err: Error) => void; + end: () => void; +} diff --git a/node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts b/node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/cache/cache.d.ts b/node_modules/liquidjs/dist/cache/cache.d.ts new file mode 100644 index 0000000..57debad --- /dev/null +++ b/node_modules/liquidjs/dist/cache/cache.d.ts @@ -0,0 +1,7 @@ +import type { Template } from '../template/template'; +export interface Cache { + write(key: string, value: T): void | Promise; + read(key: string): T | undefined | Promise; + remove(key: string): void | Promise; +} +export type LiquidCache = Cache>; diff --git a/node_modules/liquidjs/dist/cache/index.d.ts b/node_modules/liquidjs/dist/cache/index.d.ts new file mode 100644 index 0000000..66fd9cb --- /dev/null +++ b/node_modules/liquidjs/dist/cache/index.d.ts @@ -0,0 +1,2 @@ +export * from './cache'; +export * from './lru'; diff --git a/node_modules/liquidjs/dist/cache/lru.d.ts b/node_modules/liquidjs/dist/cache/lru.d.ts new file mode 100644 index 0000000..9532ed1 --- /dev/null +++ b/node_modules/liquidjs/dist/cache/lru.d.ts @@ -0,0 +1,14 @@ +import { Cache } from './cache'; +export declare class LRU implements Cache { + limit: number; + size: number; + private cache; + private head; + private tail; + constructor(limit: number, size?: number); + write(key: string, value: T): void; + read(key: string): T | undefined; + remove(key: string): void; + clear(): void; + private ensureLimit; +} diff --git a/node_modules/liquidjs/dist/cache/lru.spec.d.ts b/node_modules/liquidjs/dist/cache/lru.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/cache/lru.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/context/block-mode.d.ts b/node_modules/liquidjs/dist/context/block-mode.d.ts new file mode 100644 index 0000000..428746e --- /dev/null +++ b/node_modules/liquidjs/dist/context/block-mode.d.ts @@ -0,0 +1,4 @@ +export declare enum BlockMode { + OUTPUT = 0, + STORE = 1 +} diff --git a/node_modules/liquidjs/dist/context/context.d.ts b/node_modules/liquidjs/dist/context/context.d.ts new file mode 100644 index 0000000..e8da61a --- /dev/null +++ b/node_modules/liquidjs/dist/context/context.d.ts @@ -0,0 +1,64 @@ +import { Drop } from '../drop/drop'; +import { NormalizedFullOptions, RenderOptions } from '../liquid-options'; +import { Scope } from './scope'; +import { Limiter } from '../util'; +type PropertyKey = string | number; +export declare class Context { + /** + * insert a Context-level empty scope, + * for tags like `{% capture %}` `{% assign %}` to operate + */ + private scopes; + private registers; + /** + * user passed in scope + * `{% increment %}`, `{% decrement %}` changes this scope, + * whereas `{% capture %}`, `{% assign %}` only hide this scope + */ + environments: Scope; + /** + * global scope used as fallback for missing variables + */ + globals: Scope; + sync: boolean; + breakCalled: boolean; + continueCalled: boolean; + /** + * The normalized liquid options object + */ + opts: NormalizedFullOptions; + /** + * Throw when accessing undefined variable? + */ + strictVariables: boolean; + ownPropertyOnly: boolean; + memoryLimit: Limiter; + renderLimit: Limiter; + constructor(env?: object, opts?: NormalizedFullOptions, renderOptions?: RenderOptions, { memoryLimit, renderLimit }?: { + [key: string]: Limiter; + }); + getRegister(key: string, defaultValue?: T): T; + setRegister(key: string, value: any): any; + saveRegister(...keys: string[]): [string, any][]; + restoreRegister(keyValues: [string, any][]): void; + getAll(): Scope; + /** + * @deprecated use `_get()` or `getSync()` instead + */ + get(paths: PropertyKey[]): unknown; + getSync(paths: PropertyKey[]): unknown; + _get(paths: (PropertyKey | Drop)[]): IterableIterator; + /** + * @deprecated use `_get()` instead + */ + getFromScope(scope: unknown, paths: PropertyKey[] | string): IterableIterator; + _getFromScope(scope: unknown, paths: (PropertyKey | Drop)[] | string, strictVariables?: boolean): IterableIterator; + push(ctx: object): number; + pop(): Scope | undefined; + bottom(): Scope; + spawn(scope?: {}): Context; + private findScope; + readProperty(obj: Scope, key: (PropertyKey | Drop)): any; +} +export declare function readJSProperty(obj: Scope, key: PropertyKey, ownPropertyOnly: boolean): any; +export {}; diff --git a/node_modules/liquidjs/dist/context/context.spec.d.ts b/node_modules/liquidjs/dist/context/context.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/context/context.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/context/index.d.ts b/node_modules/liquidjs/dist/context/index.d.ts new file mode 100644 index 0000000..2a8b56f --- /dev/null +++ b/node_modules/liquidjs/dist/context/index.d.ts @@ -0,0 +1,3 @@ +export * from './context'; +export * from './scope'; +export * from './block-mode'; diff --git a/node_modules/liquidjs/dist/context/scope.d.ts b/node_modules/liquidjs/dist/context/scope.d.ts new file mode 100644 index 0000000..786b177 --- /dev/null +++ b/node_modules/liquidjs/dist/context/scope.d.ts @@ -0,0 +1,6 @@ +import { Drop } from '../drop/drop'; +export interface ScopeObject extends Record { + toLiquid?: () => any; +} +export type Scope = ScopeObject | Drop; +export declare function createScope(from?: ScopeObject): ScopeObject; diff --git a/node_modules/liquidjs/dist/drop/blank-drop.d.ts b/node_modules/liquidjs/dist/drop/blank-drop.d.ts new file mode 100644 index 0000000..fb6e678 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/blank-drop.d.ts @@ -0,0 +1,5 @@ +import { EmptyDrop } from '../drop'; +export declare class BlankDrop extends EmptyDrop { + equals(value: any): boolean; + static is(value: unknown): boolean; +} diff --git a/node_modules/liquidjs/dist/drop/block-drop.d.ts b/node_modules/liquidjs/dist/drop/block-drop.d.ts new file mode 100644 index 0000000..882ec5e --- /dev/null +++ b/node_modules/liquidjs/dist/drop/block-drop.d.ts @@ -0,0 +1,11 @@ +import { Emitter } from '../emitters'; +import { Drop } from './drop'; +export declare class BlockDrop extends Drop { + private superBlockRender; + constructor(superBlockRender?: (emitter: Emitter) => IterableIterator | string); + /** + * Provide parent access in child block by + * {{ block.super }} + */ + super(): IterableIterator; +} diff --git a/node_modules/liquidjs/dist/drop/comparable.d.ts b/node_modules/liquidjs/dist/drop/comparable.d.ts new file mode 100644 index 0000000..fc0e1e0 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/comparable.d.ts @@ -0,0 +1,8 @@ +export interface Comparable { + equals: (rhs: any) => boolean; + gt: (rhs: any) => boolean; + geq: (rhs: any) => boolean; + lt: (rhs: any) => boolean; + leq: (rhs: any) => boolean; +} +export declare function isComparable(arg: any): arg is Comparable; diff --git a/node_modules/liquidjs/dist/drop/drop.d.ts b/node_modules/liquidjs/dist/drop/drop.d.ts new file mode 100644 index 0000000..33060d0 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/drop.d.ts @@ -0,0 +1,4 @@ +import { Context } from '../context'; +export declare abstract class Drop { + liquidMethodMissing(key: string | number, context: Context): Promise | any; +} diff --git a/node_modules/liquidjs/dist/drop/empty-drop.d.ts b/node_modules/liquidjs/dist/drop/empty-drop.d.ts new file mode 100644 index 0000000..125550c --- /dev/null +++ b/node_modules/liquidjs/dist/drop/empty-drop.d.ts @@ -0,0 +1,11 @@ +import { Drop } from './drop'; +import { Comparable } from './comparable'; +export declare class EmptyDrop extends Drop implements Comparable { + equals(value: any): boolean; + gt(): boolean; + geq(): boolean; + lt(): boolean; + leq(): boolean; + valueOf(): string; + static is(value: unknown): boolean; +} diff --git a/node_modules/liquidjs/dist/drop/forloop-drop.d.ts b/node_modules/liquidjs/dist/drop/forloop-drop.d.ts new file mode 100644 index 0000000..517c014 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/forloop-drop.d.ts @@ -0,0 +1,15 @@ +import { Drop } from './drop'; +export declare class ForloopDrop extends Drop { + protected i: number; + name: string; + length: number; + constructor(length: number, collection: string, variable: string); + next(): void; + index0(): number; + index(): number; + first(): boolean; + last(): boolean; + rindex(): number; + rindex0(): number; + valueOf(): string; +} diff --git a/node_modules/liquidjs/dist/drop/index.d.ts b/node_modules/liquidjs/dist/drop/index.d.ts new file mode 100644 index 0000000..411b24d --- /dev/null +++ b/node_modules/liquidjs/dist/drop/index.d.ts @@ -0,0 +1,7 @@ +export * from './drop'; +export * from './null-drop'; +export * from './empty-drop'; +export * from './blank-drop'; +export * from './forloop-drop'; +export * from './block-drop'; +export * from './comparable'; diff --git a/node_modules/liquidjs/dist/drop/null-drop.d.ts b/node_modules/liquidjs/dist/drop/null-drop.d.ts new file mode 100644 index 0000000..e4af427 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/null-drop.d.ts @@ -0,0 +1,10 @@ +import { Drop } from './drop'; +import { Comparable } from './comparable'; +export declare class NullDrop extends Drop implements Comparable { + equals(value: any): boolean; + gt(): boolean; + geq(): boolean; + lt(): boolean; + leq(): boolean; + valueOf(): null; +} diff --git a/node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts b/node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts new file mode 100644 index 0000000..e04c807 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts @@ -0,0 +1,10 @@ +import { ForloopDrop } from './forloop-drop'; +export declare class TablerowloopDrop extends ForloopDrop { + private cols; + constructor(length: number, cols: number, collection: string, variable: string); + row(): number; + col0(): number; + col(): number; + col_first(): boolean; + col_last(): boolean; +} diff --git a/node_modules/liquidjs/dist/emitters/emitter.d.ts b/node_modules/liquidjs/dist/emitters/emitter.d.ts new file mode 100644 index 0000000..6f6fd00 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/emitter.d.ts @@ -0,0 +1,11 @@ +export interface Emitter { + /** + * Write a html value into emitter + * @param html string, Drop or other primitive value + */ + write(html: any): void; + /** + * Buffered string + */ + buffer: string; +} diff --git a/node_modules/liquidjs/dist/emitters/index.d.ts b/node_modules/liquidjs/dist/emitters/index.d.ts new file mode 100644 index 0000000..37a5506 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/index.d.ts @@ -0,0 +1,4 @@ +export * from './emitter'; +export * from './simple-emitter'; +export * from '../build/streamed-emitter-browser'; +export * from './keeping-type-emitter'; diff --git a/node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts b/node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts new file mode 100644 index 0000000..86ced10 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts @@ -0,0 +1,5 @@ +import { Emitter } from './emitter'; +export declare class KeepingTypeEmitter implements Emitter { + buffer: any; + write(html: any): void; +} diff --git a/node_modules/liquidjs/dist/emitters/simple-emitter.d.ts b/node_modules/liquidjs/dist/emitters/simple-emitter.d.ts new file mode 100644 index 0000000..c1c0788 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/simple-emitter.d.ts @@ -0,0 +1,5 @@ +import { Emitter } from './emitter'; +export declare class SimpleEmitter implements Emitter { + buffer: string; + write(html: any): void; +} diff --git a/node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts b/node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts new file mode 100644 index 0000000..31ab2ce --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts @@ -0,0 +1,9 @@ +/// +import { Emitter } from './emitter'; +export declare class StreamedEmitter implements Emitter { + buffer: string; + stream: NodeJS.ReadWriteStream; + write(html: any): void; + error(err: Error): void; + end(): void; +} diff --git a/node_modules/liquidjs/dist/filters/array.d.ts b/node_modules/liquidjs/dist/filters/array.d.ts new file mode 100644 index 0000000..319bb11 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/array.d.ts @@ -0,0 +1,32 @@ +import { FilterImpl } from '../template'; +import type { Scope } from '../context'; +export declare const join: (this: unknown, v: any[], arg: string) => any; +export declare const last: (this: unknown, v: any) => any; +export declare const first: (this: unknown, v: any) => any; +export declare const reverse: (this: unknown, v: any[]) => any; +export declare function sort(this: FilterImpl, arr: T[], property?: string): IterableIterator; +export declare function sort_natural(this: FilterImpl, arr: T[], property?: string): IterableIterator; +export declare const size: (v: string | any[]) => number; +export declare function map(this: FilterImpl, arr: Scope[], property: string): IterableIterator; +export declare function sum(this: FilterImpl, arr: Scope[], property?: string): IterableIterator; +export declare function compact(this: FilterImpl, arr: T[]): any[]; +export declare function concat(this: FilterImpl, v: T1[], arg?: T2[]): (T1 | T2)[]; +export declare function push(this: FilterImpl, v: T[], arg: T): T[]; +export declare function unshift(this: FilterImpl, v: T[], arg: T): T[]; +export declare function pop(v: T[]): T[]; +export declare function shift(this: FilterImpl, v: T[]): T[]; +export declare function slice(this: FilterImpl, v: T[] | string, begin: number, length?: number): T[] | string; +export declare function where(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator; +export declare function reject(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator; +export declare function where_exp(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator; +export declare function reject_exp(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator; +export declare function group_by(this: FilterImpl, arr: T[], property: string): IterableIterator; +export declare function group_by_exp(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator; +export declare function has(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator; +export declare function has_exp(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator; +export declare function find_index(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator; +export declare function find_index_exp(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator; +export declare function find(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator; +export declare function find_exp(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator; +export declare function uniq(this: FilterImpl, arr: T[]): T[]; +export declare function sample(this: FilterImpl, v: T[] | string, count?: number): T | string | (T | string)[]; diff --git a/node_modules/liquidjs/dist/filters/base64-impl.d.ts b/node_modules/liquidjs/dist/filters/base64-impl.d.ts new file mode 100644 index 0000000..36d3eb7 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/base64-impl.d.ts @@ -0,0 +1,2 @@ +export declare function base64Encode(str: string): string; +export declare function base64Decode(str: string): string; diff --git a/node_modules/liquidjs/dist/filters/base64.d.ts b/node_modules/liquidjs/dist/filters/base64.d.ts new file mode 100644 index 0000000..f32c85e --- /dev/null +++ b/node_modules/liquidjs/dist/filters/base64.d.ts @@ -0,0 +1,9 @@ +/** + * Base64 related filters + * + * Implements base64_encode and base64_decode filters for Shopify compatibility + */ +/// +import { FilterImpl } from '../template'; +export declare function base64_encode(this: FilterImpl, value: string | Buffer): string; +export declare function base64_decode(this: FilterImpl, value: string): string; diff --git a/node_modules/liquidjs/dist/filters/crypto-impl.d.ts b/node_modules/liquidjs/dist/filters/crypto-impl.d.ts new file mode 100644 index 0000000..b74e03f --- /dev/null +++ b/node_modules/liquidjs/dist/filters/crypto-impl.d.ts @@ -0,0 +1,2 @@ +export declare function sha256(str: string): string; +export declare function hmacSha256(str: string, key: string): string; diff --git a/node_modules/liquidjs/dist/filters/crypto.d.ts b/node_modules/liquidjs/dist/filters/crypto.d.ts new file mode 100644 index 0000000..83277cf --- /dev/null +++ b/node_modules/liquidjs/dist/filters/crypto.d.ts @@ -0,0 +1,8 @@ +/** + * Crypto related filters + * + * Implements sha256 and hmac_sha256 filters for Shopify compatibility + */ +import { FilterImpl } from '../template'; +export declare function sha256(this: FilterImpl, value: unknown): string | Promise; +export declare function hmac_sha256(this: FilterImpl, value: unknown, key: unknown): string | Promise; diff --git a/node_modules/liquidjs/dist/filters/date.d.ts b/node_modules/liquidjs/dist/filters/date.d.ts new file mode 100644 index 0000000..56357a7 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/date.d.ts @@ -0,0 +1,6 @@ +import { FilterImpl } from '../template'; +export declare function date(this: FilterImpl, v: string | Date, format?: string, timezoneOffset?: number | string): string | Date; +export declare function date_to_xmlschema(this: FilterImpl, v: string | Date): string | Date; +export declare function date_to_rfc822(this: FilterImpl, v: string | Date): string | Date; +export declare function date_to_string(this: FilterImpl, v: string | Date, type?: string, style?: string): string | Date; +export declare function date_to_long_string(this: FilterImpl, v: string | Date, type?: string, style?: string): string | Date; diff --git a/node_modules/liquidjs/dist/filters/html.d.ts b/node_modules/liquidjs/dist/filters/html.d.ts new file mode 100644 index 0000000..71a020a --- /dev/null +++ b/node_modules/liquidjs/dist/filters/html.d.ts @@ -0,0 +1,6 @@ +import { FilterImpl } from '../template'; +export declare function escape(this: FilterImpl, str: string): string; +export declare function xml_escape(this: FilterImpl, str: string): string; +export declare function escape_once(this: FilterImpl, str: string): string; +export declare function newline_to_br(this: FilterImpl, v: string): string; +export declare function strip_html(this: FilterImpl, v: string): string; diff --git a/node_modules/liquidjs/dist/filters/index.d.ts b/node_modules/liquidjs/dist/filters/index.d.ts new file mode 100644 index 0000000..95cf6a2 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/index.d.ts @@ -0,0 +1,2 @@ +import { FilterImplOptions } from '../template'; +export declare const filters: Record; diff --git a/node_modules/liquidjs/dist/filters/math.d.ts b/node_modules/liquidjs/dist/filters/math.d.ts new file mode 100644 index 0000000..7574b0a --- /dev/null +++ b/node_modules/liquidjs/dist/filters/math.d.ts @@ -0,0 +1,11 @@ +export declare const abs: (this: unknown, x: number) => any; +export declare const at_least: (this: unknown, ...args: number[]) => any; +export declare const at_most: (this: unknown, ...args: number[]) => any; +export declare const ceil: (this: unknown, x: number) => any; +export declare const divided_by: (this: unknown, dividend: number, divisor: number, integerArithmetic?: any) => any; +export declare const floor: (this: unknown, x: number) => any; +export declare const minus: (this: unknown, v: number, arg: number) => any; +export declare const plus: (this: unknown, lhs: number, rhs: number) => any; +export declare const modulo: (this: unknown, v: number, arg: number) => any; +export declare const times: (this: unknown, v: number, arg: number) => any; +export declare function round(v: number, arg?: number): number; diff --git a/node_modules/liquidjs/dist/filters/misc.d.ts b/node_modules/liquidjs/dist/filters/misc.d.ts new file mode 100644 index 0000000..237dc21 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/misc.d.ts @@ -0,0 +1,18 @@ +import { identify } from '../util/underscore'; +import { FilterImpl } from '../template'; +declare function defaultFilter(this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2; +declare function json(value: any, space?: number): string; +declare function inspect(value: any, space?: number): string; +declare function to_integer(value: any): number; +declare const _default: { + default: typeof defaultFilter; + raw: { + raw: boolean; + handler: typeof identify; + }; + jsonify: typeof json; + to_integer: typeof to_integer; + json: typeof json; + inspect: typeof inspect; +}; +export default _default; diff --git a/node_modules/liquidjs/dist/filters/string.d.ts b/node_modules/liquidjs/dist/filters/string.d.ts new file mode 100644 index 0000000..f1a0006 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/string.d.ts @@ -0,0 +1,27 @@ +/** + * String related filters + * + * * prefer stringify() to String() since `undefined`, `null` should eval '' + */ +import { FilterImpl } from '../template'; +export declare function append(this: FilterImpl, v: string, arg: string): string; +export declare function prepend(this: FilterImpl, v: string, arg: string): string; +export declare function lstrip(this: FilterImpl, v: string, chars?: string): string; +export declare function downcase(this: FilterImpl, v: string): string; +export declare function upcase(this: FilterImpl, v: string): string; +export declare function remove(this: FilterImpl, v: string, arg: string): string; +export declare function remove_first(this: FilterImpl, v: string, l: string): string; +export declare function remove_last(this: FilterImpl, v: string, l: string): string; +export declare function rstrip(this: FilterImpl, str: string, chars?: string): string; +export declare function split(this: FilterImpl, v: string, arg: string): string[]; +export declare function strip(this: FilterImpl, v: string, chars?: string): string; +export declare function strip_newlines(this: FilterImpl, v: string): string; +export declare function capitalize(this: FilterImpl, str: string): string; +export declare function replace(this: FilterImpl, v: string, pattern: string, replacement: string): string; +export declare function replace_first(this: FilterImpl, v: string, arg1: string, arg2: string): string; +export declare function replace_last(this: FilterImpl, v: string, arg1: string, arg2: string): string; +export declare function truncate(this: FilterImpl, v: string, l?: number, o?: string): string; +export declare function truncatewords(this: FilterImpl, v: string, words?: number, o?: string): string; +export declare function normalize_whitespace(this: FilterImpl, v: string): string; +export declare function number_of_words(this: FilterImpl, input: string, mode?: 'cjk' | 'auto'): number; +export declare function array_to_sentence_string(this: FilterImpl, array: unknown[], connector?: string): unknown; diff --git a/node_modules/liquidjs/dist/filters/url.d.ts b/node_modules/liquidjs/dist/filters/url.d.ts new file mode 100644 index 0000000..da45394 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/url.d.ts @@ -0,0 +1,14 @@ +export declare const url_decode: (x: string) => string; +export declare const url_encode: (x: string) => string; +export declare const cgi_escape: (x: string) => string; +export declare const uri_escape: (x: string) => string; +declare const rSlugifyReplacers: { + raw: RegExp; + default: RegExp; + pretty: RegExp; + ascii: RegExp; + latin: RegExp; + none: null; +}; +export declare function slugify(str: string, mode?: keyof typeof rSlugifyReplacers, cased?: boolean): string; +export {}; diff --git a/node_modules/liquidjs/dist/fs/fs-impl.d.ts b/node_modules/liquidjs/dist/fs/fs-impl.d.ts new file mode 100644 index 0000000..cfea0f6 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/fs-impl.d.ts @@ -0,0 +1,10 @@ +export declare function exists(filepath: string): Promise; +export declare function readFile(filepath: string): Promise; +export declare function existsSync(filepath: string): boolean; +export declare function readFileSync(filepath: string): string; +export declare function resolve(root: string, file: string, ext: string): string; +export declare function fallback(file: string): string | undefined; +export declare function dirname(filepath: string): string; +export declare function contains(root: string, file: string): Promise; +export declare function containsSync(root: string, file: string): boolean; +export { sep } from 'path'; diff --git a/node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts b/node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/fs/fs.d.ts b/node_modules/liquidjs/dist/fs/fs.d.ts new file mode 100644 index 0000000..5e879a3 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/fs.d.ts @@ -0,0 +1,22 @@ +export interface FS { + /** check if a file exists asynchronously */ + exists: (filepath: string) => Promise; + /** check if a file exists synchronously */ + existsSync: (filepath: string) => boolean; + /** read a file asynchronously */ + readFile: (filepath: string) => Promise; + /** read a file synchronously */ + readFileSync: (filepath: string) => string; + /** resolve a file against directory, for given `ext` option */ + resolve: (dir: string, file: string, ext: string) => string; + /** check if file is contained in `root`. Node default fs uses realpath; if omitted, loader assumes contained. */ + contains?: (root: string, file: string) => Promise; + /** sync check if file is contained in `root`, allows both renderSync and render. */ + containsSync?: (root: string, file: string) => boolean; + /** defaults to "/" */ + sep?: string; + /** required for relative path resolving */ + dirname?: (file: string) => string; + /** fallback file for lookup failure */ + fallback?: (file: string) => string | undefined; +} diff --git a/node_modules/liquidjs/dist/fs/index.d.ts b/node_modules/liquidjs/dist/fs/index.d.ts new file mode 100644 index 0000000..b40725f --- /dev/null +++ b/node_modules/liquidjs/dist/fs/index.d.ts @@ -0,0 +1,2 @@ +export * from './loader'; +export * from './fs'; diff --git a/node_modules/liquidjs/dist/fs/loader.d.ts b/node_modules/liquidjs/dist/fs/loader.d.ts new file mode 100644 index 0000000..fc7468b --- /dev/null +++ b/node_modules/liquidjs/dist/fs/loader.d.ts @@ -0,0 +1,25 @@ +import { FS } from './fs'; +export interface LoaderOptions { + fs: FS; + extname: string; + root: string[]; + partials: string[]; + layouts: string[]; + relativeReference: boolean; +} +export declare enum LookupType { + Partials = "partials", + Layouts = "layouts", + Root = "root" +} +export declare class Loader { + shouldLoadRelative: (referencedFile: string) => boolean; + private options; + private contains; + private exists; + constructor(options: LoaderOptions); + lookup(file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator; + candidates(file: string, dirs: string[], currentFile?: string): Generator; + private dirname; + private lookupError; +} diff --git a/node_modules/liquidjs/dist/fs/loader.spec.d.ts b/node_modules/liquidjs/dist/fs/loader.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/loader.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/fs/map-fs.d.ts b/node_modules/liquidjs/dist/fs/map-fs.d.ts new file mode 100644 index 0000000..c5d6d79 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/map-fs.d.ts @@ -0,0 +1,13 @@ +export declare class MapFS { + private mapping; + constructor(mapping: { + [key: string]: string; + }); + sep: string; + exists(filepath: string): Promise; + existsSync(filepath: string): boolean; + readFile(filepath: string): Promise; + readFileSync(filepath: string): string; + dirname(filepath: string): string; + resolve(dir: string, file: string, ext: string): string; +} diff --git a/node_modules/liquidjs/dist/fs/map-fs.spec.d.ts b/node_modules/liquidjs/dist/fs/map-fs.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/map-fs.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/fs/node-require.d.ts b/node_modules/liquidjs/dist/fs/node-require.d.ts new file mode 100644 index 0000000..6b117df --- /dev/null +++ b/node_modules/liquidjs/dist/fs/node-require.d.ts @@ -0,0 +1 @@ +export declare const requireResolve: (partial: string) => string; diff --git a/node_modules/liquidjs/dist/index.d.ts b/node_modules/liquidjs/dist/index.d.ts new file mode 100644 index 0000000..8c2d482 --- /dev/null +++ b/node_modules/liquidjs/dist/index.d.ts @@ -0,0 +1,20 @@ +export declare const version = "[VI]{version}[/VI]"; +export * as TypeGuards from './util/type-guards'; +export { toValue, createTrie, Trie, toPromise, toValueSync, assert, LiquidError, ParseError, RenderError, UndefinedVariableError, TokenizationError, AssertionError } from './util'; +export type { LiquidErrors } from './util/error'; +export { Drop } from './drop'; +export type { Comparable } from './drop'; +export { Emitter } from './emitters'; +export { defaultOperators, Operators, evalToken, evalQuotedToken, Expression, isFalsy, isTruthy } from './render'; +export { Context, Scope } from './context'; +export { Value, Hash, Template, FilterImplOptions, Tag, Filter, Output, Variable, VariableLocation, VariableSegments, Variables, StaticAnalysis, StaticAnalysisOptions, analyze, analyzeSync, Arguments, PartialScope } from './template'; +export type { TagRenderReturn } from './template'; +export { Token, TopLevelToken, TagToken, ValueToken } from './tokens'; +export type { RangeToken, LiteralToken, QuotedToken, PropertyAccessToken, NumberToken } from './tokens'; +export { TokenKind, Tokenizer, ParseStream, Parser } from './parser'; +export { filters } from './filters'; +export * from './tags'; +export { defaultOptions } from './liquid-options'; +export type { LiquidOptions, RenderOptions, RenderFileOptions } from './liquid-options'; +export { FS, LookupType } from './fs'; +export { Liquid } from './liquid'; diff --git a/node_modules/liquidjs/dist/liquid-options.d.ts b/node_modules/liquidjs/dist/liquid-options.d.ts new file mode 100644 index 0000000..fac12b2 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid-options.d.ts @@ -0,0 +1,159 @@ +import { LiquidCache } from './cache'; +import { FS, LookupType } from './fs'; +import { Operators } from './render'; +type OutputEscape = (value: any) => string; +type OutputEscapeOption = 'escape' | 'json' | OutputEscape; +export interface LiquidOptions { + /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `["."]` */ + root?: string | string[]; + /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */ + partials?: string | string[]; + /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */ + layouts?: string | string[]; + /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */ + relativeReference?: boolean; + /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */ + jekyllInclude?: boolean; + /** Use jekyll style where filter, enables array item match. Defaults to `false`. */ + jekyllWhere?: boolean; + /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `".html"` will allow including file by basename. Defaults to `""`. */ + extname?: string; + /** Whether or not to cache resolved templates. Defaults to `false`. */ + cache?: boolean | number | LiquidCache; + /** Use JavaScript Truthiness. Defaults to `false`. */ + jsTruthy?: boolean; + /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */ + dynamicPartials?: boolean; + /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */ + strictFilters?: boolean; + /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */ + strictVariables?: boolean; + /** Catch all errors instead of exit upon one. Please note that render errors won't be reached when parse fails. */ + catchAllErrors?: boolean; + /** Hide scope variables from prototypes, useful when you're passing a not sanitized object into LiquidJS or need to hide prototypes from templates. */ + ownPropertyOnly?: boolean; + /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/ + lenientIf?: boolean; + /** JavaScript timezone name or timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to `-600` or `Australia/Lindeman` */ + timezoneOffset?: number | string; + /** Default date format to use if the date filter doesn't include a format. Defaults to `%A, %B %-e, %Y at %-l:%M %P %z`. */ + dateFormat?: string; + /** Default locale, will be used by date filter. Defaults to system locale. */ + locale?: string; + /** Strip blank characters (including ` `, `\t`, and `\r`) from the right of tags (`{% %}`) until `\n` (inclusive). Defaults to `false`. */ + trimTagRight?: boolean; + /** Similar to `trimTagRight`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ + trimTagLeft?: boolean; + /** Strip blank characters (including ` `, `\t`, and `\r`) from the right of values (`{{ }}`) until `\n` (inclusive). Defaults to `false`. */ + trimOutputRight?: boolean; + /** Similar to `trimOutputRight`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ + trimOutputLeft?: boolean; + /** The left delimiter for liquid tags. **/ + tagDelimiterLeft?: string; + /** The right delimiter for liquid tags. **/ + tagDelimiterRight?: string; + /** The left delimiter for liquid outputs. **/ + outputDelimiterLeft?: string; + /** The right delimiter for liquid outputs. **/ + outputDelimiterRight?: string; + /** Whether input strings to date filter preserve the given timezone **/ + preserveTimezones?: boolean; + /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\n` will be trimmed regardless of line breaks. Defaults to `true`. */ + greedy?: boolean; + /** `fs` is used to override the default file-system module with a custom implementation. */ + fs?: FS; + /** keyValue separator */ + keyValueSeparator?: string; + /** Render from in-memory `templates` mapping instead of file system. File system related options like `fs`, 'root', and `relativeReference` will be ignored when `templates` is specified. */ + templates?: { + [key: string]: string; + }; + /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */ + globals?: object; + /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */ + keepOutputType?: boolean; + /** Default escape filter applied to output values, when set, you'll have to add `| raw` for values don't need to be escaped. Defaults to `undefined`. */ + outputEscape?: OutputEscapeOption; + /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */ + operators?: Operators; + /** Respect parameter order when using filters like "for ... reversed limit", Defaults to `false`. */ + orderedFilterParameters?: boolean; + /** For DoS handling, limit total length of templates parsed in one `parse()` call. A typical PC can handle 1e8 (100M) characters without issues. */ + parseLimit?: number; + /** For DoS handling, limit total time (in ms) for each `render()` call. */ + renderLimit?: number; + /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue. */ + memoryLimit?: number; +} +export interface RenderOptions { + /** + * This call is sync or async? It's used by Liquid internal methods, you'll not need this. + */ + sync?: boolean; + /** + * Same as `globals` on LiquidOptions, but only for current render() call + */ + globals?: object; + /** + * Same as `strictVariables` on LiquidOptions, but only for current render() call + */ + strictVariables?: boolean; + /** + * Same as `ownPropertyOnly` on LiquidOptions, but only for current render() call + */ + ownPropertyOnly?: boolean; + /** For DoS handling, limit total renders of tag/HTML/output in one `render()` call. A typical PC can handle 1e5 renders of typical templates per second. */ + templateLimit?: number; + /** For DoS handling, limit total time (in ms) for each `render()` call. */ + renderLimit?: number; + /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue.. */ + memoryLimit?: number; +} +export interface RenderFileOptions extends RenderOptions { + lookupType?: LookupType; +} +interface NormalizedOptions extends LiquidOptions { + root?: string[]; + partials?: string[]; + layouts?: string[]; + cache?: LiquidCache; + outputEscape?: OutputEscape; +} +export interface NormalizedFullOptions extends NormalizedOptions { + root: string[]; + partials: string[]; + layouts: string[]; + relativeReference: boolean; + jekyllInclude: boolean; + extname: string; + cache?: LiquidCache; + jsTruthy: boolean; + dynamicPartials: boolean; + fs: FS; + strictFilters: boolean; + strictVariables: boolean; + ownPropertyOnly: boolean; + lenientIf: boolean; + dateFormat: string; + locale: string; + trimTagRight: boolean; + trimTagLeft: boolean; + trimOutputRight: boolean; + trimOutputLeft: boolean; + tagDelimiterLeft: string; + tagDelimiterRight: string; + outputDelimiterLeft: string; + outputDelimiterRight: string; + preserveTimezones: boolean; + greedy: boolean; + globals: object; + keepOutputType: boolean; + operators: Operators; + parseLimit: number; + renderLimit: number; + memoryLimit: number; +} +export declare const defaultOptions: NormalizedFullOptions; +export declare function normalize(options: LiquidOptions): NormalizedFullOptions; +export declare function normalizeDirectoryList(value: any): string[]; +export {}; diff --git a/node_modules/liquidjs/dist/liquid-options.spec.d.ts b/node_modules/liquidjs/dist/liquid-options.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid-options.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/liquid.browser.min.js b/node_modules/liquidjs/dist/liquid.browser.min.js new file mode 100644 index 0000000..b79b5af --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).liquidjs={})}(this,function(h){"use strict";var E=function(e,t){return(E=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}E(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var T=function(){return(T=Object.assign||function(e){for(var t,r=1,n=arguments.length;ra[0]&&t[1]=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function ee(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,s=r.call(e),o=[];try{for(;(void 0===t||0> ":" ",r=Z(String(e),String(o).length),t="".concat(t).concat(r,"| "),r=e===n?"\n"+Z("^",i+t.length):"";return t+s[e-1]+r}).join("\n")),enumerable:!1}),this.message=(e=this.message,(t=this.token).file&&(e+=", file:".concat(t.file)),t=ee(t.getPosition(),2),r=t[0],t=t[1],e+=", line:".concat(r,", col:").concat(t)),this.stack=this.message+"\n"+this.context+"\n"+this.stack,this.originalError&&(this.stack+="\nFrom "+this.originalError.stack)},ue.is=function(e){return"LiquidError"===(null==e?void 0:e[oe])},ue);function ue(e,t){var r=se.call(this,"string"==typeof e?e:e.message)||this;return r.context="","string"!=typeof e&&Object.defineProperty(r,"originalError",{value:e,enumerable:!1}),Object.defineProperty(r,"token",{value:t,enumerable:!1}),Object.defineProperty(r,oe,{value:"LiquidError",enumerable:!1}),r}s(he,ce=ae);var ce,le=he;function he(e,t){e=ce.call(this,e,t)||this;return e.name="TokenizationError",ce.prototype.update.call(e),e}s(de,pe=ae);var pe,fe=de;function de(e,t){t=pe.call(this,e,t)||this;return t.name="ParseError",t.message=e.message,pe.prototype.update.call(t),t}s(ge,ye=ae),ge.is=function(e){return"RenderError"===e.name};var ye,ve=ge;function ge(e,t){t=ye.call(this,e,t.token)||this;return t.name="RenderError",t.message=e.message,ye.prototype.update.call(t),t}s(we,me=ae),we.is=function(e){return"LiquidErrors"===e.name};var me,be=we;function we(e){var t=me.call(this,e[0],e[0].token)||this,r=(t.errors=e,t.name="LiquidErrors",1":2,"<":2,">=":2,"<=":2,contains:2,not:1,and:0,or:0},Bt={"==":0,"!=":0,">":0,"<":0,">=":0,"<=":0,contains:0,not:1,and:0,or:0},It=(s(Ht,Pt=e),Ht.prototype.getPrecedence=function(){var e=this.getText();return e in Ct?Ct[e]:1},Ht);function Ht(e,t,r,n){var i=Pt.call(this,h.TokenKind.Operator,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.operator=i.getText(),i}s(Wt,Ut=e);var Ut,Kt=Wt;function Wt(e,t,r,n,i,s){r=Ut.call(this,h.TokenKind.PropertyAccess,r,n,i,s)||this;return r.variable=e,r.props=t,r}s(Jt,Yt=e);var Yt,Zt=Jt;function Jt(e,t,r,n,i,s){r=Yt.call(this,h.TokenKind.Filter,r,n,i,s)||this;return r.name=e,r.args=t,r}s(Gt,Qt=e);var Qt,$t=Gt;function Gt(e,t,r,n,i,s){var o=Qt.call(this,h.TokenKind.Hash,e,t,r,s)||this;return o.input=e,o.begin=t,o.end=r,o.name=n,o.value=i,o.file=s,o}var Xt=/[\da-fA-F]/,er=/[0-7]/,tr={b:"\b",f:"\f",n:"\n",r:"\r",t:"\t",v:"\v"};function rr(e){e=e.charCodeAt(0);return 97<=e?e-87:65<=e?e-55:e-48}s(sr,nr=e);var nr,ir=sr;function sr(e,t,r,n){var i=nr.call(this,h.TokenKind.Quoted,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.content=function(e){for(var t="",r=1;rs.getPrecedence()?[4,r.pop()]:[3,5];case 4:return e.sent(),[3,3];case 5:return r.push(s),[3,8];case 6:return[4,s];case 7:e.sent(),e.label=8;case 8:return i=n.next(),[3,2];case 9:return[3,12];case 10:return o=e.sent(),o={error:o},[3,12];case 11:try{i&&!i.done&&(a=n.return)&&a.call(n)}finally{if(o)throw o.error}return[7];case 12:return r.length?[4,r.pop()]:[3,14];case 13:return e.sent(),[3,12];case 14:return[2]}})}(e)),!1)}function S(t,r,n){return void 0===n&&(n=!1),G(this,function(e){switch(e.label){case 0:return t?"content"in t?[2,t.content]:zn(t)?[4,function(t,r,n){var i,s,o,a,u,c,l,h,p;return G(this,function(e){switch(e.label){case 0:i=[],e.label=1;case 1:e.trys.push([1,6,7,8]),s=X(t.props),o=s.next(),e.label=2;case 2:return o.done?[3,5]:(c=o.value,u=(a=i).push,[4,S(c,r,!1)]);case 3:u.apply(a,[e.sent()]),e.label=4;case 4:return o=s.next(),[3,2];case 5:return[3,8];case 6:return c=e.sent(),h={error:c},[3,8];case 7:try{o&&!o.done&&(p=s.return)&&p.call(s)}finally{if(h)throw h.error}return[7];case 8:return(e.trys.push([8,14,,15]),t.variable)?[4,S(t.variable,r,n)]:[3,11];case 9:return l=e.sent(),[4,r._getFromScope(l,i)];case 10:return[2,e.sent()];case 11:return[4,r._get(i)];case 12:return[2,e.sent()];case 13:return[3,15];case 14:if(l=e.sent(),n&&"InternalUndefinedVariableError"===l.name)return[2,null];throw new Te(l,t);case 15:return[2]}})}(t,r,n)]:[3,2]:[2];case 1:return[2,e.sent()];case 2:return Rn(t)?[4,function(t,r){var n,i;return G(this,function(e){switch(e.label){case 0:return[4,S(t.lhs,r)];case 1:return n=e.sent(),[4,S(t.rhs,r)];case 2:return i=e.sent(),r.memoryLimit.use(i-n+1),[2,Y(+n,+i+1)]}})}(t,r)]:[3,4];case 3:return[2,e.sent()];case 4:return[2]}})}function kr(e){return e.content}function Tr(e,t){return!xr(e,t)}function xr(e,t){return e=g(e),t.opts.jsTruthy?!e:!1===e||null==e}Ce={"==":Sr,"!=":function(e,t){return!Sr(e,t)},">":function(e,t){return l(e)?e.gt(t):l(t)?t.lt(e):g(e)>g(t)},"<":function(e,t){return l(e)?e.lt(t):l(t)?t.gt(e):g(e)=":function(e,t){return l(e)?e.geq(t):l(t)?t.leq(e):g(e)>=g(t)},"<=":function(e,t){return l(e)?e.leq(t):l(t)?t.geq(e):g(e)<=g(t)},contains:function(e,t){return i(e=g(e))?e.some(function(e){return Sr(e,t)}):!!u(null==e?void 0:e.indexOf)&&-1this.limit&&this.remove(this.tail.prev.key)},Or);function Or(e,t){void 0===t&&(t=0),this.limit=e,this.size=t,this.cache={},this.head=new Lr("HEAD",null,null,null),this.tail=new Lr("TAIL",null,null,null),this.head.next=this.tail,this.tail.prev=this.head}function _r(e,t){var r=document.createElement("base"),e=(r.href=e,document.getElementsByTagName("head")[0]),n=(e.insertBefore(r,e.firstChild),document.createElement("a")),t=(n.href=t,n.href);return e.removeChild(r),t}r=Object.freeze({__proto__:null,resolve:function(e,t,i){return e.length&&"/"!==K(e)&&(e+="/"),_r(e,t).replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/,function(e,t,r){var n=r.split("/").pop();return/\.\w+$/.test(n)?e:t+r+i})},readFile:function(n){return a(this,void 0,void 0,function(){return G(this,function(e){return[2,new Promise(function(e,t){var r=new XMLHttpRequest;r.onload=function(){200<=r.status&&r.status<300?e(r.responseText):t(new Error(r.statusText))},r.onerror=function(){t(new Error("An error occurred whilst receiving the response."))},r.open("GET",n),r.send()})]})})},readFileSync:function(e){var t=new XMLHttpRequest;if(t.open("GET",e,!1),t.send(),t.status<200||300<=t.status)throw new Error(t.statusText);return t.responseText},exists:function(e){return a(this,void 0,void 0,function(){return G(this,function(e){return[2,!0]})})},existsSync:function(e){return!0},dirname:function(e){return _r(e,".")},sep:"/"});function zr(e,t){return void 0===t&&(t=0),JSON.stringify(e,null,t)}var jr={default:function(e,t){for(var r=[],n=2;n":">",'"':""","'":"'"},Er={"&":"&","<":"<",">":">",""":'"',"'":"'"};function qr(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/&|<|>|"|'/g,function(e){return Rr[e]})}var Ar=Object.freeze({__proto__:null,escape:qr,xml_escape:function(e){return qr.call(this,e)},escape_once:function(e){return qr.call(this,function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/&(amp|lt|gt|#34|#39);/g,function(e){return Er[e]})}.call(this,e))},newline_to_br:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/\r?\n/gm,"
    \n")},strip_html:function(e){for(var t,r,n=y(e),i=(this.context.memoryLimit.use(n.length),new Map([[""],[""],["\x3c!--","--\x3e"],["<",">"]])),s="",o=0;ot?e.slice(0,t-3)+"...":e));var t},k.prototype.readWord=function(){return this.readIdentifier()},k.prototype.readIdentifier=function(){this.skipBlank();for(var e=this.p;!this.end()&&qe(this.peek());)++this.p;return new At(this.input,e,this.p,this.file)},k.prototype.readNonEmptyIdentifier=function(){var e=this.readIdentifier();return e.size()?e:void 0},k.prototype.readTagName=function(){return this.skipBlank(),"#"===this.input[this.p]?this.input.slice(this.p,++this.p):this.readIdentifier().getText()},k.prototype.readHashes=function(e){for(var t=[];;){var r=this.readHash(e);if(!r)return t;t.push(r)}},k.prototype.readHash=function(e){this.skipBlank(),","===this.peek()&&++this.p;var t,r=this.p,n=this.readNonEmptyIdentifier();if(n)return this.skipBlank(),e=te(e)?e:e?"=":":",this.peek()===e&&(++this.p,t=this.readValue()),new $t(this.input,r,this.p,n,t,this.file)},k.prototype.remaining=function(){return this.input.slice(this.p,this.N)},k.prototype.advance=function(e){this.p+=e=void 0===e?1:e},k.prototype.end=function(){return this.p>=this.N},k.prototype.read=function(){return this.input[this.p++]},k.prototype.readTo=function(e){for(;this.p=this.N?0:p[this.input.charCodeAt(this.p+e)]},k.prototype.peek=function(e){return this.p+(e=void 0===e?0:e)>=this.N?"":this.input[this.p+e]},k.prototype.skipBlank=function(){for(;this.peekType()ℜ)++this.p};var w=k;function k(e,t,r,n){void 0===t&&(t=Nr.operators),this.input=e,this.file=r,this.rawBeginAt=-1,this.p=n?n[0]:0,this.N=n?n[1]:e.length,this.opTrie=Xe(t),this.literalTrie=Xe(Ge)}Ir.prototype.on=function(e,t){return this.handlers[e]=t,this},Ir.prototype.trigger=function(e,t){e=this.handlers[e];return!!e&&(e.call(this,t),!0)},Ir.prototype.start=function(){var e,t;for(this.trigger("start");!this.stopRequested&&(e=this.tokens.shift());)this.trigger("token",e)||Fn(e)&&this.trigger("tag:".concat(e.name),e)||(t=this.parseToken(e,this.tokens),this.trigger("template",t));return this.stopRequested||this.trigger("end"),this},Ir.prototype.stop=function(){return this.stopRequested=!0,this};var Br=Ir;function Ir(e,t){this.handlers={},this.stopRequested=!1,this.tokens=e,this.parseToken=t}function Hr(e){this.token=e}s(Kr,Ur=Hr);var Ur,L=Kr;function Kr(e,t,r){var n=Ur.call(this,e)||this;return n.name=e.name,n.liquid=r,n.tokenizer=e.tokenizer,n}Yr.prototype.render=function(t){var r,n,i,s,o,a,u,c,l;return G(this,function(e){switch(e.label){case 0:r={},e.label=1;case 1:e.trys.push([1,8,9,10]),n=X(Object.keys(this.hash)),i=n.next(),e.label=2;case 2:return i.done?[3,7]:(s=i.value,o=r,a=s,void 0!==this.hash[s]?[3,3]:(u=!0,[3,5]));case 3:return[4,S(this.hash[s],t)];case 4:u=e.sent(),e.label=5;case 5:o[a]=u,e.label=6;case 6:return i=n.next(),[3,2];case 7:return[3,10];case 8:return c=e.sent(),c={error:c},[3,10];case 9:try{i&&!i.done&&(l=n.return)&&l.call(n)}finally{if(c)throw c.error}return[7];case 10:return[2,r]}})};var Wr=Yr;function Yr(e,t){this.hash={};var r,n,e=e instanceof w?e:new w(e,{});try{for(var i=X(e.readHashes(t)),s=i.next();!s.done;s=i.next()){var o=s.value;this.hash[o.name.content]=o.value}}catch(e){r={error:e}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}}function Zr(e){return i(e)}Qr.prototype.render=function(t,r){var n,i,s,o,a,u,c,l,h,p,f;return G(this,function(e){switch(e.label){case 0:n=[],e.label=1;case 1:e.trys.push([1,8,9,10]),i=X(this.args),s=i.next(),e.label=2;case 2:return s.done?[3,7]:Zr(o=s.value)?(u=(a=n).push,c=[o[0]],[4,S(o[1],r)]):[3,4];case 3:return u.apply(a,[c.concat([e.sent()])]),[3,6];case 4:return h=(l=n).push,[4,S(o,r)];case 5:h.apply(l,[e.sent()]),e.label=6;case 6:return s=i.next(),[3,2];case 7:return[3,10];case 8:return p=e.sent(),p={error:p},[3,10];case 9:try{s&&!s.done&&(f=i.return)&&f.call(i)}finally{if(p)throw p.error}return[7];case 10:return[4,this.handler.apply({context:r,token:this.token,liquid:this.liquid},d([t],ee(n),!1))];case 11:return[2,e.sent()]}})};var Jr=Qr;function Qr(e,t,r){this.token=e,this.name=e.name,this.handler=u(t)?t:u(null==t?void 0:t.handler)?t.handler:Q,this.raw=!u(t)&&!(null==t||!t.raw),this.args=e.args,this.liquid=r}$r.prototype.value=function(t,r){var n,i,s,o,a;return G(this,function(e){switch(e.label){case 0:return r=r||t.opts.lenientIf&&0=t&&(n+=r),n},normalize_whitespace:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/\s+/g," ")},number_of_words:function(e,t){var r=y(e);if(this.context.memoryLimit.use(r.length),!(e=r.trim()))return 0;switch(t){case"cjk":return(e.match(ri)||[]).length+(e.match(ni)||[]).length;case"auto":return ri.test(e)?e.match(ri).length+(e.match(ni)||[]).length:e.split(/\s+/).length;default:return e.split(/\s+/).length}},array_to_sentence_string:function(e,t){switch(t=y(t=void 0===t?"and":t),this.context.memoryLimit.use(e.length+t.length),e.length){case 0:return"";case 1:return e[0];case 2:return"".concat(e[0]," ").concat(t," ").concat(e[1]);default:return"".concat(e.slice(0,-1).join(", "),", ").concat(t," ").concat(e[e.length-1])}}});Dn=Object.freeze({__proto__:null,base64_encode:function(e){return"undefined"!=typeof Buffer&&Buffer.isBuffer(e)?(this.context.memoryLimit.use(e.byteLength),e.toString("base64")):(e=y(e),this.context.memoryLimit.use(e.length),e=e,btoa(String.fromCharCode.apply(String,d([],ee((new TextEncoder).encode(e)),!1))))},base64_decode:function(e){var e=y(e);return this.context.memoryLimit.use(e.length),e=e,(new TextDecoder).decode(Uint8Array.from(atob(e),function(e){return e.charCodeAt(0)}))}});function ii(e){for(var t=new Uint8Array(e),r="",n=0;n"),r.write(''))),r.write('')),[4,s.renderTemplates(this.templates,t,r)]):[3,6];case 4:e.sent(),r.write(""),e.label=5;case 5:return u++,o.next(),[3,3];case 6:return n.length&&r.write(""),t.pop(),[2]}})},Wi.prototype.children=function(){return G(this,function(e){return[2,this.templates]})},Wi.prototype.arguments=function(){var t,r,n,i,s;return G(this,function(e){switch(e.label){case 0:return[4,this.collection];case 1:e.sent(),e.label=2;case 2:e.trys.push([2,7,8,9]),t=X(Object.values(this.args.hash)),r=t.next(),e.label=3;case 3:return r.done?[3,6]:_(n=r.value)?[4,n]:[3,5];case 4:e.sent(),e.label=5;case 5:return r=t.next(),[3,3];case 6:return[3,9];case 7:return n=e.sent(),i={error:n},[3,9];case 8:try{r&&!r.done&&(s=t.return)&&s.call(t)}finally{if(i)throw i.error}return[7];case 9:return[2]}})},Wi.prototype.blockScope=function(){return[this.variable,"tablerowloop"]};var Ui,Ki=Wi;function Wi(e,t,r,n){var i,s=Ui.call(this,e,t,r)||this,o=s.tokenizer.readIdentifier(),a=(s.tokenizer.skipBlank(),s.tokenizer.readIdentifier()),u=s.tokenizer.readValue();if("in"!==a.content||!u)throw new Error("illegal tag: ".concat(e.getText()));s.variable=o.content,s.collection=u,s.args=new Wr(s.tokenizer,r.options.keyValueSeparator),s.templates=[];var c=n.parseStream(t).on("start",function(){return i=s.templates}).on("tag:endtablerow",function(){return c.stop()}).on("template",function(e){return i.push(e)}).on("end",function(){throw new Error("tag ".concat(e.getText()," not closed"))});return c.start(),s}s(Ji,Yi=L),Ji.prototype.render=function(t,r){var n,i,s,o,a,u,c,l;return G(this,function(e){switch(e.label){case 0:n=this.liquid.renderer,e.label=1;case 1:e.trys.push([1,7,8,9]),i=X(this.branches),s=i.next(),e.label=2;case 2:return s.done?[3,6]:(a=s.value,u=a.value,o=a.test,a=a.templates,[4,u.value(t,t.opts.lenientIf)]);case 3:return(u=e.sent(),o(u,t))?[4,n.renderTemplates(a,t,r)]:[3,5];case 4:return e.sent(),[2];case 5:return s=i.next(),[3,2];case 6:return[3,9];case 7:return c=e.sent(),c={error:c},[3,9];case 8:try{s&&!s.done&&(l=i.return)&&l.call(i)}finally{if(c)throw c.error}return[7];case 9:return[4,n.renderTemplates(this.elseTemplates,t,r)];case 10:return e.sent(),[2]}})},Ji.prototype.children=function(){var t;return G(this,function(e){return t=this.branches.flatMap(function(e){return e.templates}),this.elseTemplates&&t.push.apply(t,d([],ee(this.elseTemplates),!1)),[2,t]})},Ji.prototype.arguments=function(){return this.branches.map(function(e){return e.value})};var Yi,Zi=Ji;function Ji(e,t,r,n){var i=Yi.call(this,e,t,r)||this,s=(i.branches=[],i.elseTemplates=[],[]),o=0;return n.parseStream(t).on("start",function(){return i.branches.push({value:new F(e.tokenizer.readFilteredValue(),i.liquid),test:xr,templates:s=[]})}).on("tag:elsif",function(e){0 | any {\n return undefined\n }\n}\n","import { Drop } from '../drop/drop'\n\nexport const toString = Object.prototype.toString\nconst toLowerCase = String.prototype.toLowerCase\n\nexport const hasOwnProperty = Object.hasOwnProperty\n\nexport function isString (value: any): value is string {\n return typeof value === 'string'\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function isPromise (val: any): val is Promise {\n return val && isFunction(val.then)\n}\n\nexport function isIterator (val: any): val is IterableIterator {\n return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return)\n}\n\nexport function promisify (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise;\nexport function promisify (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise;\nexport function promisify (fn: any) {\n return function (...args: any[]) {\n return new Promise((resolve, reject) => {\n fn(...args, (err: Error, result: any) => {\n err ? reject(err) : resolve(result)\n })\n })\n }\n}\n\nexport function stringify (value: any): string {\n value = toValue(value)\n if (isString(value)) return value\n if (isNil(value)) return ''\n if (isArray(value)) return value.map(x => stringify(x)).join('')\n return String(value)\n}\n\nexport function toEnumerable (val: any): T[] {\n val = toValue(val)\n if (isArray(val)) return val\n if (isString(val) && val.length > 0) return [val] as unknown as T[]\n if (isIterable(val)) return Array.from(val)\n if (isObject(val)) return Object.keys(val).map((key) => [key, val[key]]) as unknown as T[]\n return []\n}\n\nexport function toArray (val: any) {\n val = toValue(val)\n if (isNil(val)) return []\n if (isArray(val)) return val\n return [ val ]\n}\n\nexport function toValue (value: any): any {\n return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value\n}\n\nexport function toNumber (value: any): number {\n return +toValue(value) || 0\n}\n\nexport function isNumber (value: any): value is number {\n return typeof value === 'number'\n}\n\nexport function toLiquid (value: any): any {\n if (value && isFunction(value.toLiquid)) return toLiquid(value.toLiquid())\n return value\n}\n\nexport function isNil (value: any): boolean {\n return value == null\n}\n\nexport function isUndefined (value: any): boolean {\n return value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toString.call(value) === '[object Array]'\n}\n\nexport function isArrayLike (value: any): value is any[] {\n return value && isNumber(value.length)\n}\n\nexport function isIterable (value: any): value is Iterable {\n return isObject(value) && Symbol.iterator in value\n}\n\n/*\n * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.\n * The iteratee is invoked with three arguments: (value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning false.\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @return {Object} Returns object.\n */\nexport function forOwn (\n obj: Record | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n obj = obj || {}\n for (const k in obj) {\n if (hasOwnProperty.call(obj, k)) {\n if (iteratee(obj[k], k, obj) === false) break\n }\n }\n return obj\n}\n\nexport function last (arr: T[]): T;\nexport function last (arr: string): string;\nexport function last (arr: any[] | string): any | string {\n return arr[arr.length - 1]\n}\n\n/*\n * Checks if value is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is an object, else false.\n */\nexport function isObject (value: any): value is object {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nexport function range (start: number, stop: number, step = 1) {\n const arr: number[] = []\n for (let i = start; i < stop; i += step) {\n arr.push(i)\n }\n return arr\n}\n\nexport function padStart (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => ch + str)\n}\n\nexport function padEnd (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => str + ch)\n}\n\nexport function pad (str: any, length: number, ch: string, add: (str: string, ch: string) => string) {\n str = String(str)\n const n = length - str.length\n if (n <= 0) return str\n return add(str, ch.repeat(n))\n}\n\nexport function identify (val: T): T {\n return val\n}\n\nexport function changeCase (str: string): string {\n const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z')\n return hasLowerCase ? str.toUpperCase() : str.toLowerCase()\n}\n\nexport function ellipsis (str: string, N: number): string {\n return str.length > N ? str.slice(0, N - 3) + '...' : str\n}\n\nexport function orderedCompare (a: any, b: any) {\n if (isNil(a) && isNil(b)) return 0\n if (isNil(a)) return 1\n if (isNil(b)) return -1\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\n// compare string in case-insensitive way, undefined values to the tail\nexport function caseInsensitiveCompare (a: any, b: any) {\n if (isNil(a) && isNil(b)) return 0\n if (isNil(a)) return 1\n if (isNil(b)) return -1\n a = toLowerCase.call(a)\n b = toLowerCase.call(b)\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\nexport function argumentsToValue any, T> (fn: F) {\n return function (this: T, ...args: Parameters) { return fn.call(this, ...args.map(toValue)) }\n}\n\nexport function argumentsToNumber any, T> (fn: F) {\n return function (this: T, ...args: Parameters) { return fn.call(this, ...args.map(toNumber)) }\n}\n\nexport function escapeRegExp (text: string) {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\n/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */\nexport function * strictUniq (array: Array): Generator {\n const seen = new Set()\n\n for (const element of array) {\n const key = JSON.stringify(element)\n if (!seen.has(key)) {\n seen.add(key)\n yield element\n }\n }\n}\n","import * as _ from './underscore'\nimport { Token } from '../tokens/token'\nimport { Template } from '../template/template'\n\n/**\n * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes\n */\nconst TRAIT = '__liquidClass__'\n\nexport abstract class LiquidError extends Error {\n public token!: Token\n public context = ''\n public originalError?: Error\n public constructor (err: Error | string, token: Token) {\n /**\n * note: for ES5 targeting, `this` will be replaced by return value of Error(),\n * thus everything on `this` will be lost, avoid calling `LiquidError` methods here\n */\n super(typeof err === 'string' ? err : err.message)\n if (typeof err !== 'string') Object.defineProperty(this, 'originalError', { value: err, enumerable: false })\n Object.defineProperty(this, 'token', { value: token, enumerable: false })\n Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false })\n }\n protected update () {\n Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false })\n this.message = mkMessage(this.message, this.token)\n this.stack = this.message + '\\n' + this.context +\n '\\n' + this.stack\n if (this.originalError) this.stack += '\\nFrom ' + this.originalError.stack\n }\n static is (obj: unknown): obj is LiquidError {\n return obj?.[TRAIT] === 'LiquidError'\n }\n}\n\nexport class TokenizationError extends LiquidError {\n public constructor (message: string, token: Token) {\n super(message, token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'ParseError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderError extends LiquidError {\n public constructor (err: Error, tpl: Template) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n public static is (obj: any): obj is RenderError {\n return obj.name === 'RenderError'\n }\n}\n\nexport class LiquidErrors extends LiquidError {\n public constructor (public errors: RenderError[]) {\n super(errors[0], errors[0].token)\n this.name = 'LiquidErrors'\n const s = errors.length > 1 ? 's' : ''\n this.message = `${errors.length} error${s} found`\n super.update()\n }\n public static is (obj: any): obj is LiquidErrors {\n return obj.name === 'LiquidErrors'\n }\n}\n\nexport class UndefinedVariableError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'UndefinedVariableError'\n this.message = err.message\n super.update()\n }\n}\n\n// only used internally; raised where we don't have token information,\n// so it can't be an UndefinedVariableError.\nexport class InternalUndefinedVariableError extends Error {\n variableName: string\n\n public constructor (variableName: string) {\n super(`undefined variable: ${variableName}`)\n this.name = 'InternalUndefinedVariableError'\n this.variableName = variableName\n }\n}\n\nexport class AssertionError extends Error {\n public constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const [line, col] = token.getPosition()\n const lines = token.input.split('\\n')\n const begin = Math.max(line - 2, 1)\n const end = Math.min(line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const rowIndicator = (lineNumber === line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n let text = `${rowIndicator}${num}| `\n\n const colIndicator = lineNumber === line\n ? '\\n' + _.padStart('^', col + text.length)\n : ''\n\n text += lines[lineNumber - 1]\n text += colIndicator\n return text\n })\n .join('\\n')\n\n return context\n}\n\nfunction mkMessage (msg: string, token: Token) {\n if (token.file) msg += `, file:${token.file}`\n const [line, col] = token.getPosition()\n msg += `, line:${line}, col:${col}`\n return msg\n}\n","// **DO NOT CHANGE THIS FILE**\n//\n// This file is generated by bin/character-gen.js\n// bitmask character types to boost performance\nexport const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]\nexport const WORD = 1\nexport const OPERATOR = 2\nexport const BLANK = 4\nexport const QUOTE = 8\nexport const INLINE_BLANK = 16\nexport const NUMBER = 32\nexport const SIGN = 64\nexport const PUNCTUATION = 128\n\nexport function isWord (char: string): boolean {\n const code = char.charCodeAt(0)\n return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD)\n}\nTYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK\nTYPES[8220] = TYPES[8221] = PUNCTUATION\n","import { AssertionError } from './error'\n\nexport function assert (predicate: T | null | undefined, message?: string | (() => string)) {\n if (!predicate) {\n const msg = typeof message === 'function'\n ? message()\n : (message || `expect ${predicate} to be true`)\n throw new AssertionError(msg)\n }\n}\n\nexport function assertEmpty (predicate: T | null | undefined, message = `unexpected ${JSON.stringify(predicate)}`) {\n assert(!predicate, message)\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isNil, toValue } from '../util'\n\nexport class NullDrop extends Drop implements Comparable {\n public equals (value: any) {\n return isNil(toValue(value))\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return null\n }\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isObject, isString, isArray, toValue } from '../util'\n\nexport class EmptyDrop extends Drop implements Comparable {\n public equals (value: any) {\n if (value instanceof EmptyDrop) return false\n value = toValue(value)\n if (isString(value) || isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return ''\n }\n static is (value: unknown) {\n return value instanceof EmptyDrop\n }\n}\n","import { isNil, isString, toValue } from '../util'\nimport { EmptyDrop } from '../drop'\n\nexport class BlankDrop extends EmptyDrop {\n public equals (value: any) {\n if (value === false) return true\n if (isNil(toValue(value))) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n static is (value: unknown) {\n return value instanceof BlankDrop\n }\n}\n","import { Drop } from './drop'\n\nexport class ForloopDrop extends Drop {\n protected i = 0\n public name: string\n public length: number\n public constructor (length: number, collection: string, variable: string) {\n super()\n this.length = length\n this.name = `${variable}-${collection}`\n }\n public next () {\n this.i++\n }\n public index0 () {\n return this.i\n }\n public index () {\n return this.i + 1\n }\n public first () {\n return this.i === 0\n }\n public last () {\n return this.i === this.length - 1\n }\n public rindex () {\n return this.length - this.i\n }\n public rindex0 () {\n return this.length - this.i - 1\n }\n public valueOf () {\n return JSON.stringify(this)\n }\n}\n","import { stringify } from '../util'\nimport { Emitter } from './emitter'\n\nexport class SimpleEmitter implements Emitter {\n public buffer = '';\n\n public write (html: any) {\n this.buffer += stringify(html)\n }\n}\n","import { Emitter } from '../emitters'\n\nexport class StreamedEmitter implements Emitter {\n public buffer = '';\n public stream: NodeJS.ReadableStream = null as any\n constructor () {\n throw new Error('streaming not supported in browser')\n }\n public write: (html: any) => void\n public error: (err: Error) => void\n public end: () => void\n}\n","import { stringify, toValue } from '../util'\nimport { Emitter } from './emitter'\n\nexport class KeepingTypeEmitter implements Emitter {\n public buffer: any = '';\n\n public write (html: any) {\n html = toValue(html)\n // This will only preserve the type if the value is isolated.\n // I.E:\n // {{ my-port }} -> 42\n // {{ my-host }}:{{ my-port }} -> 'host:42'\n if (typeof html !== 'string' && this.buffer === '') {\n this.buffer = html\n } else {\n this.buffer = stringify(this.buffer) + stringify(html)\n }\n }\n}\n","import { Emitter, SimpleEmitter } from '../emitters'\nimport { Drop } from './drop'\n\nexport class BlockDrop extends Drop {\n constructor (\n // the block render from layout template\n private superBlockRender: (emitter: Emitter) => IterableIterator | string = () => ''\n ) {\n super()\n }\n /**\n * Provide parent access in child block by\n * {{ block.super }}\n */\n public * super (): IterableIterator {\n const emitter = new SimpleEmitter()\n yield this.superBlockRender(emitter)\n return emitter.buffer\n }\n}\n","import { isFunction } from '../util'\n\nexport interface Comparable {\n equals: (rhs: any) => boolean;\n gt: (rhs: any) => boolean;\n geq: (rhs: any) => boolean;\n lt: (rhs: any) => boolean;\n leq: (rhs: any) => boolean;\n}\n\nexport function isComparable (arg: any): arg is Comparable {\n return (\n arg &&\n isFunction(arg.equals) &&\n isFunction(arg.gt) &&\n isFunction(arg.geq) &&\n isFunction(arg.lt) &&\n isFunction(arg.leq)\n )\n}\n","import { BlankDrop, EmptyDrop, NullDrop } from '../drop'\n\nconst nil = new NullDrop()\nexport const literalValues = {\n 'true': true,\n 'false': false,\n 'nil': nil,\n 'null': nil,\n 'empty': new EmptyDrop(),\n 'blank': new BlankDrop()\n}\n\nexport type LiteralKey = keyof typeof literalValues\nexport type LiteralValue = typeof literalValues[LiteralKey]\n","import { isWord } from '../util/character'\n\ninterface TrieInput {\n [key: string]: T\n}\n\ninterface TrieLeafNode {\n data: T;\n end: true;\n needBoundary?: true;\n}\n\nexport interface Trie {\n [key: string]: Trie | TrieLeafNode;\n}\n\nexport type TrieNode = Trie | TrieLeafNode\n\nexport function createTrie (input: TrieInput): Trie {\n const trie: Trie = {}\n for (const [name, data] of Object.entries(input)) {\n let node: Trie | TrieLeafNode = trie\n\n for (let i = 0; i < name.length; i++) {\n const c = name[i]\n node[c] = node[c] || {}\n\n if (i === name.length - 1 && isWord(name[i])) {\n node[c].needBoundary = true\n }\n\n node = node[c]\n }\n\n node.data = data\n node.end = true\n }\n return trie\n}\n","import { isPromise, isIterator } from './underscore'\n\nexport type LiquidAsync any> =\n (sync: boolean, ...args: Parameters) => ReturnType | Promise>\n\nexport function toLiquidAsync any> (\n asyncFn: (...args: Parameters) => Promise>,\n syncFn?: F\n): LiquidAsync {\n const syncImpl = syncFn || asyncFn as any\n return (sync: boolean, ...args: any[]) => {\n return sync ? syncImpl(...args as Parameters) : asyncFn(...args as Parameters)\n }\n}\n\n// convert an async iterator to a Promise\nexport async function toPromise (val: Generator | Promise | T): Promise {\n if (!isIterator(val)) return val\n let value: unknown\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n try {\n if (isIterator(value)) value = toPromise(value)\n if (isPromise(value)) value = await value\n } catch (err) {\n next = 'throw'\n value = err\n }\n } while (!done)\n return value as T\n}\n\n// convert an async iterator to a value in a synchronous manner\nexport function toValueSync (val: Generator | T): T {\n if (!isIterator(val)) return val\n let value: any\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n if (isIterator(value)) {\n try {\n value = toValueSync(value)\n } catch (err) {\n next = 'throw'\n value = err\n }\n }\n } while (!done)\n return value\n}\n","import { changeCase, padStart, padEnd } from './underscore'\nimport { LiquidDate } from './liquid-date'\nimport type { Limiter } from './limiter'\n\nconst rFormat = /%([-_0^#:]+)?(\\d+)?([EO])?(.)/\ninterface FormatOptions {\n flags: object;\n width?: string;\n modifier?: string;\n memoryLimit?: Pick;\n}\n\n// prototype extensions\nfunction daysInMonth (d: LiquidDate) {\n const feb = isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n}\nfunction getDayOfYear (d: LiquidDate) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += daysInMonth(d)[i]\n }\n return num + d.getDate()\n}\nfunction getWeekOfYear (d: LiquidDate, startDay: number) {\n // Skip to startDay of this week\n const now = getDayOfYear(d) + (startDay - d.getDay())\n // Find the first startDay of the year\n const jan1 = new Date(d.getFullYear(), 0, 1)\n const then = (7 - jan1.getDay() + startDay)\n return String(Math.floor((now - then) / 7) + 1)\n}\nfunction isLeapYear (d: LiquidDate) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n}\nfunction ordinal (d: LiquidDate) {\n const date = d.getDate()\n if ([11, 12, 13].includes(date)) return 'th'\n\n switch (date % 10) {\n case 1: return 'st'\n case 2: return 'nd'\n case 3: return 'rd'\n default: return 'th'\n }\n}\nfunction century (d: LiquidDate) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n}\n\n// default to 0\nconst padWidths = {\n d: 2,\n e: 2,\n H: 2,\n I: 2,\n j: 3,\n k: 2,\n l: 2,\n L: 3,\n m: 2,\n M: 2,\n S: 2,\n U: 2,\n W: 2\n}\n\nconst padSpaceChars = new Set('aAbBceklpP')\n\nfunction getTimezoneOffset (d: LiquidDate, opts: FormatOptions) {\n const nOffset = Math.abs(d.getTimezoneOffset())\n const h = Math.floor(nOffset / 60)\n const m = nOffset % 60\n return (d.getTimezoneOffset() > 0 ? '-' : '+') +\n padStart(h, 2, '0') +\n (opts.flags[':'] ? ':' : '') +\n padStart(m, 2, '0')\n}\nconst formatCodes = {\n a: (d: LiquidDate) => d.getShortWeekdayName(),\n A: (d: LiquidDate) => d.getLongWeekdayName(),\n b: (d: LiquidDate) => d.getShortMonthName(),\n B: (d: LiquidDate) => d.getLongMonthName(),\n c: (d: LiquidDate) => d.toLocaleString(),\n C: (d: LiquidDate) => century(d),\n d: (d: LiquidDate) => d.getDate(),\n e: (d: LiquidDate) => d.getDate(),\n H: (d: LiquidDate) => d.getHours(),\n I: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n j: (d: LiquidDate) => getDayOfYear(d),\n k: (d: LiquidDate) => d.getHours(),\n l: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n L: (d: LiquidDate) => d.getMilliseconds(),\n m: (d: LiquidDate) => d.getMonth() + 1,\n M: (d: LiquidDate) => d.getMinutes(),\n N: (d: LiquidDate, opts: FormatOptions) => {\n const width = Number(opts.width) || 9\n const str = String(d.getMilliseconds()).slice(0, width)\n opts.memoryLimit?.use(width - str.length)\n return padEnd(str, width, '0')\n },\n p: (d: LiquidDate) => (d.getHours() < 12 ? 'AM' : 'PM'),\n P: (d: LiquidDate) => (d.getHours() < 12 ? 'am' : 'pm'),\n q: (d: LiquidDate) => ordinal(d),\n s: (d: LiquidDate) => Math.round(d.getTime() / 1000),\n S: (d: LiquidDate) => d.getSeconds(),\n u: (d: LiquidDate) => d.getDay() || 7,\n U: (d: LiquidDate) => getWeekOfYear(d, 0),\n w: (d: LiquidDate) => d.getDay(),\n W: (d: LiquidDate) => getWeekOfYear(d, 1),\n x: (d: LiquidDate) => d.toLocaleDateString(),\n X: (d: LiquidDate) => d.toLocaleTimeString(),\n y: (d: LiquidDate) => d.getFullYear().toString().slice(2, 4),\n Y: (d: LiquidDate) => d.getFullYear(),\n z: getTimezoneOffset,\n Z: (d: LiquidDate, opts: FormatOptions) => d.getTimeZoneName() || getTimezoneOffset(d, opts),\n 't': () => '\\t',\n 'n': () => '\\n',\n '%': () => '%'\n};\n(formatCodes as any).h = formatCodes.b\n\nexport function strftime (d: LiquidDate, formatStr: string, memoryLimit?: Pick) {\n let output = ''\n let remaining = formatStr\n let match\n while ((match = rFormat.exec(remaining))) {\n output += remaining.slice(0, match.index)\n remaining = remaining.slice(match.index + match[0].length)\n output += format(d, match, memoryLimit)\n }\n return output + remaining\n}\n\nfunction format (d: LiquidDate, match: RegExpExecArray, memoryLimit?: Pick) {\n const [input, flagStr = '', width, modifier, conversion] = match\n const convert = formatCodes[conversion]\n if (!convert) return input\n const flags = {}\n for (const flag of flagStr) flags[flag] = true\n let ret = String(convert(d, { flags, width, modifier, memoryLimit }))\n let padChar = padSpaceChars.has(conversion) ? ' ' : '0'\n let padWidth = width || padWidths[conversion] || 0\n if (flags['^']) ret = ret.toUpperCase()\n else if (flags['#']) ret = changeCase(ret)\n if (flags['_']) padChar = ' '\n else if (flags['0']) padChar = '0'\n if (flags['-']) padWidth = 0\n memoryLimit?.use(Number(padWidth) - ret.length)\n return padStart(ret, padWidth, padChar)\n}\n","export function getDateTimeFormat () {\n return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined)\n}\n","import { getDateTimeFormat } from './intl'\nimport { isString } from './underscore'\n\n// one minute in milliseconds\nconst OneMinute = 60000\n/**\n * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS\n * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3\n */\nconst TIMEZONE_PATTERN = /([zZ]|([+-])(\\d{2}):?(\\d{2}))$/\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst monthNamesShort = monthNames.map(name => name.slice(0, 3))\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst dayNamesShort = dayNames.map(name => name.slice(0, 3))\n\n/**\n * A date implementation with timezone info, just like Ruby date\n *\n * Implementation:\n * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods\n * - rewrite getTimezoneOffset() to trick strftime\n */\nexport class LiquidDate {\n private timezoneOffset: number\n private timezoneName: string\n private date: Date\n private displayDate: Date\n private DateTimeFormat = getDateTimeFormat()\n public timezoneFixed: boolean\n constructor (\n init: string | number | Date,\n private locale: string,\n timezone?: number | string\n ) {\n this.date = new Date(init)\n this.timezoneFixed = timezone !== undefined\n if (timezone === undefined) {\n timezone = this.date.getTimezoneOffset()\n }\n this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone\n this.timezoneName = isString(timezone) ? timezone : ''\n\n const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute\n const time = this.date.getTime() + diff\n this.displayDate = new Date(time)\n }\n\n getTime () {\n return this.displayDate.getTime()\n }\n getMilliseconds () {\n return this.displayDate.getMilliseconds()\n }\n getSeconds () {\n return this.displayDate.getSeconds()\n }\n getMinutes () {\n return this.displayDate.getMinutes()\n }\n getHours () {\n return this.displayDate.getHours()\n }\n getDay () {\n return this.displayDate.getDay()\n }\n getDate () {\n return this.displayDate.getDate()\n }\n getMonth () {\n return this.displayDate.getMonth()\n }\n getFullYear () {\n return this.displayDate.getFullYear()\n }\n toLocaleString (locale?: string, init?: any) {\n if (init?.timeZone) {\n return this.date.toLocaleString(locale, init)\n }\n return this.displayDate.toLocaleString(locale, init)\n }\n toLocaleTimeString (locale?: string) {\n return this.displayDate.toLocaleTimeString(locale)\n }\n toLocaleDateString (locale?: string) {\n return this.displayDate.toLocaleDateString(locale)\n }\n getTimezoneOffset () {\n return this.timezoneOffset!\n }\n getTimeZoneName () {\n if (this.timezoneFixed) return this.timezoneName\n if (!this.DateTimeFormat) return\n return this.DateTimeFormat().resolvedOptions().timeZone\n }\n getLongMonthName () {\n return this.format({ month: 'long' }) ?? monthNames[this.getMonth()]\n }\n getShortMonthName () {\n return this.format({ month: 'short' }) ?? monthNamesShort[this.getMonth()]\n }\n getLongWeekdayName () {\n return this.format({ weekday: 'long' }) ?? dayNames[this.displayDate.getDay()]\n }\n getShortWeekdayName () {\n return this.format({ weekday: 'short' }) ?? dayNamesShort[this.displayDate.getDay()]\n }\n valid () {\n return !isNaN(this.getTime())\n }\n private format (options: Intl.DateTimeFormatOptions) {\n return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate)\n }\n\n /**\n * Create a Date object fixed to it's declared Timezone. Both\n * - 2021-08-06T02:29:00.000Z and\n * - 2021-08-06T02:29:00.000+08:00\n * will always be displayed as\n * - 2021-08-06 02:29:00\n * regardless timezoneOffset in JavaScript realm\n *\n * The implementation hack:\n * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,\n * we create a different Date to trick strftime, it's both simpler and more performant.\n * Given that a template is expected to be parsed fewer times than rendered.\n */\n static createDateFixedToTimezone (dateString: string, locale: string): LiquidDate {\n const m = dateString.match(TIMEZONE_PATTERN)\n // representing a UTC timestamp\n if (m && m[1] === 'Z') {\n return new LiquidDate(+new Date(dateString), locale, 0)\n }\n // has a timezone specified\n if (m && m[2] && m[3] && m[4]) {\n const [, , sign, hours, minutes] = m\n const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10))\n return new LiquidDate(+new Date(dateString), locale, offset)\n }\n return new LiquidDate(dateString, locale)\n }\n private static getTimezoneOffset (timezoneName: string, date: Date) {\n const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName })\n const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' })\n\n const localDate = new Date(localDateString)\n const utcDate = new Date(utcDateString)\n return (+utcDate - +localDate) / (60 * 1000)\n }\n}\n","import { assert } from './assert'\n\nexport class Limiter {\n private message: string\n private base = 0\n private limit: number\n constructor (resource: string, limit: number) {\n this.message = `${resource} limit exceeded`\n this.limit = limit\n }\n use (count: number) {\n if (+count > 0) {\n assert(this.base + +count <= this.limit, this.message)\n this.base += +count\n }\n }\n check (count: number) {\n if (+count > 0) {\n assert(+count <= this.limit, this.message)\n }\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { TYPES, BLANK } from '../util'\n\nexport abstract class DelimitedToken extends Token {\n public trimLeft = false\n public trimRight = false\n public contentRange: [number, number]\n public constructor (\n kind: TokenKind,\n [contentBegin, contentEnd]: [number, number],\n input: string,\n begin: number,\n end: number,\n trimLeft: boolean,\n trimRight: boolean,\n file?: string\n ) {\n super(kind, input, begin, end, file)\n const tl = input[contentBegin] === '-'\n const tr = input[contentEnd - 1] === '-'\n\n let l = tl ? contentBegin + 1 : contentBegin\n let r = tr ? contentEnd - 1 : contentEnd\n while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) l++\n while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) r--\n\n this.contentRange = [l, r]\n this.trimLeft = tl || trimLeft\n this.trimRight = tr || trimRight\n }\n get content () {\n return this.input.slice(this.contentRange[0], this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { Tokenizer, TokenKind } from '../parser'\nimport type { NormalizedFullOptions } from '../liquid-options'\n\nexport class TagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public readonly args: string;\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options\n const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]\n super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file)\n\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`)\n this.tokenizer.skipBlank()\n this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser'\n\nexport class OutputToken extends DelimitedToken {\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options\n const valueRange: [number, number] = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]\n super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class HTMLToken extends Token {\n trimLeft = 0\n trimRight = 0\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.HTML, input, begin, end, file)\n }\n public getContent () {\n return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class NumberToken extends Token {\n public content: number\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Number, input, begin, end, file)\n this.content = Number(this.getText())\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class IdentifierToken extends Token {\n public content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Word, input, begin, end, file)\n this.content = this.getText()\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { literalValues, LiteralValue } from '../util'\n\nexport class LiteralToken extends Token {\n public content: LiteralValue\n public literal: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Literal, input, begin, end, file)\n this.literal = this.getText()\n this.content = literalValues[this.literal]\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport const enum OperatorType {\n Binary,\n Unary\n}\n\nexport const operatorPrecedences = {\n '==': 2,\n '!=': 2,\n '>': 2,\n '<': 2,\n '>=': 2,\n '<=': 2,\n 'contains': 2,\n 'not': 1,\n 'and': 0,\n 'or': 0\n}\n\nexport const operatorTypes = {\n '==': OperatorType.Binary,\n '!=': OperatorType.Binary,\n '>': OperatorType.Binary,\n '<': OperatorType.Binary,\n '>=': OperatorType.Binary,\n '<=': OperatorType.Binary,\n 'contains': OperatorType.Binary,\n 'not': OperatorType.Unary,\n 'and': OperatorType.Binary,\n 'or': OperatorType.Binary\n}\n\nexport class OperatorToken extends Token {\n public operator: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Operator, input, begin, end, file)\n this.operator = this.getText()\n }\n getPrecedence () {\n const key = this.getText()\n return key in operatorPrecedences ? operatorPrecedences[key] : 1\n }\n}\n","import { Token } from './token'\nimport { LiteralToken } from './literal-token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { NumberToken } from './number-token'\nimport { RangeToken } from './range-token'\nimport { QuotedToken } from './quoted-token'\nimport { TokenKind } from '../parser'\n\nexport class PropertyAccessToken extends Token {\n constructor (\n public variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined,\n public props: (ValueToken | IdentifierToken)[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.PropertyAccess, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { FilterArg } from '../parser/filter-arg'\nimport { TokenKind } from '../parser'\n\nexport class FilterToken extends Token {\n public constructor (\n public name: string,\n public args: FilterArg[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.Filter, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { TokenKind } from '../parser'\n\nexport class HashToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public name: IdentifierToken,\n public value?: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Hash, input, begin, end, file)\n }\n}\n","const rHex = /[\\da-fA-F]/\nconst rOct = /[0-7]/\nconst escapeChar = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\x0B'\n}\n\nfunction hexVal (c: string) {\n const code = c.charCodeAt(0)\n if (code >= 97) return code - 87\n if (code >= 65) return code - 55\n return code - 48\n}\n\nexport function parseStringLiteral (str: string): string {\n let ret = ''\n for (let i = 1; i < str.length - 1; i++) {\n if (str[i] !== '\\\\') {\n ret += str[i]\n continue\n }\n if (escapeChar[str[i + 1]] !== undefined) {\n ret += escapeChar[str[++i]]\n } else if (str[i + 1] === 'u') {\n let val = 0\n let j = i + 2\n while (j <= i + 5 && rHex.test(str[j])) {\n val = val * 16 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n } else if (!rOct.test(str[i + 1])) {\n ret += str[++i]\n } else {\n let j = i + 1\n let val = 0\n while (j <= i + 3 && rOct.test(str[j])) {\n val = val * 8 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n }\n }\n return ret\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { parseStringLiteral } from '../render/string'\n\nexport class QuotedToken extends Token {\n public readonly content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Quoted, input, begin, end, file)\n this.content = parseStringLiteral(this.getText())\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { TokenKind } from '../parser'\n\nexport class RangeToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public lhs: ValueToken,\n public rhs: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Range, input, begin, end, file)\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { Tokenizer, TokenKind } from '../parser'\n\n/**\n * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`\n */\nexport class LiquidTagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file)\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, 'illegal liquid tag syntax')\n this.tokenizer.skipBlank()\n }\n\n get args (): string {\n return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { Token } from './token'\nimport { FilterToken } from './filter-token'\nimport { TokenKind } from '../parser'\nimport { Expression } from '../render'\n\n/**\n * value expression with optional filters\n * e.g.\n * {% assign foo=\"bar\" | append: \"coo\" %}\n */\nexport class FilteredValueToken extends Token {\n constructor (\n public initial: Expression,\n public filters: FilterToken[],\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.FilteredValue, input, begin, end, file)\n }\n}\n","interface LiquidPerformance {\n now: () => number\n}\n\nconst polyfill: LiquidPerformance = {\n now: () => Date.now()\n}\n\nexport function getPerformance (): LiquidPerformance {\n return (typeof global === 'object' && global.performance) ||\n (typeof window === 'object' && window.performance) ||\n polyfill\n}\n","import { getPerformance } from '../util/performance'\nimport { toPromise, RenderError, LiquidErrors, LiquidError } from '../util'\nimport { Context } from '../context'\nimport { Template } from '../template'\nimport { Emitter, KeepingTypeEmitter, StreamedEmitter, SimpleEmitter } from '../emitters'\n\nexport class Render {\n public renderTemplatesToNodeStream (templates: Template[], ctx: Context): NodeJS.ReadableStream {\n const emitter = new StreamedEmitter()\n Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))\n .then(() => emitter.end(), err => emitter.error(err))\n return emitter.stream\n }\n public * renderTemplates (templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator {\n if (!emitter) {\n emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()\n }\n ctx.renderLimit.check(getPerformance().now())\n const errors = []\n for (const tpl of templates) {\n ctx.renderLimit.check(getPerformance().now())\n try {\n // if tpl.render supports emitter, it'll return empty `html`\n const html = yield tpl.render(ctx, emitter)\n // if not, it'll return an `html`, write to the emitter for it\n html && emitter.write(html)\n if (ctx.breakCalled || ctx.continueCalled) break\n } catch (e) {\n const err = LiquidError.is(e) ? e : new RenderError(e as Error, tpl)\n if (ctx.opts.catchAllErrors) errors.push(err)\n else throw err\n }\n }\n if (errors.length) {\n throw new LiquidErrors(errors)\n }\n return emitter.buffer\n }\n}\n","import { QuotedToken, RangeToken, OperatorToken, Token, PropertyAccessToken, OperatorType, operatorTypes } from '../tokens'\nimport { isRangeToken, isPropertyAccessToken, UndefinedVariableError, range, isOperatorToken, assert } from '../util'\nimport type { Context } from '../context'\nimport type { UnaryOperatorHandler } from '../render'\nimport { Drop } from '../drop'\n\nexport class Expression {\n readonly postfix: Token[]\n\n public constructor (tokens: IterableIterator) {\n this.postfix = [...toPostfix(tokens)]\n }\n public * evaluate (ctx: Context, lenient?: boolean): Generator {\n assert(ctx, 'unable to evaluate: context not defined')\n const operands: any[] = []\n for (const token of this.postfix) {\n if (isOperatorToken(token)) {\n const r = operands.pop()\n let result\n if (operatorTypes[token.operator] === OperatorType.Unary) {\n result = yield (ctx.opts.operators[token.operator] as UnaryOperatorHandler)(r, ctx)\n } else {\n const l = operands.pop()\n result = yield ctx.opts.operators[token.operator](l, r, ctx)\n }\n operands.push(result)\n } else {\n operands.push(yield evalToken(token, ctx, lenient))\n }\n }\n return operands[0]\n }\n public valid () {\n return !!this.postfix.length\n }\n}\n\nexport function * evalToken (token: Token | undefined, ctx: Context, lenient = false): IterableIterator {\n if (!token) return\n if ('content' in token) return token.content\n if (isPropertyAccessToken(token)) return yield evalPropertyAccessToken(token, ctx, lenient)\n if (isRangeToken(token)) return yield evalRangeToken(token, ctx)\n}\n\nfunction * evalPropertyAccessToken (token: PropertyAccessToken, ctx: Context, lenient: boolean): IterableIterator {\n const props: (string | number | Drop)[] = []\n for (const prop of token.props) {\n props.push((yield evalToken(prop, ctx, false)) as unknown as string | number | Drop)\n }\n try {\n if (token.variable) {\n const variable = yield evalToken(token.variable, ctx, lenient)\n return yield ctx._getFromScope(variable, props)\n } else {\n return yield ctx._get(props)\n }\n } catch (e) {\n if (lenient && (e as Error).name === 'InternalUndefinedVariableError') return null\n throw (new UndefinedVariableError(e as Error, token))\n }\n}\n\nexport function evalQuotedToken (token: QuotedToken) {\n return token.content\n}\n\nfunction * evalRangeToken (token: RangeToken, ctx: Context) {\n const low: number = yield evalToken(token.lhs, ctx)\n const high: number = yield evalToken(token.rhs, ctx)\n ctx.memoryLimit.use(high - low + 1)\n return range(+low, +high + 1)\n}\n\nfunction * toPostfix (tokens: IterableIterator): IterableIterator {\n const ops: OperatorToken[] = []\n for (const token of tokens) {\n if (isOperatorToken(token)) {\n while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {\n yield ops.pop()!\n }\n ops.push(token)\n } else yield token\n }\n while (ops.length) {\n yield ops.pop()!\n }\n}\n","import { Context } from '../context/context'\nimport { toValue } from '../util'\n\nexport function isTruthy (val: any, ctx: Context): boolean {\n return !isFalsy(val, ctx)\n}\n\nexport function isFalsy (val: any, ctx: Context): boolean {\n val = toValue(val)\n\n if (ctx.opts.jsTruthy) {\n return !val\n } else {\n return val === false || undefined === val || val === null\n }\n}\n","import { isComparable } from '../drop/comparable'\nimport { Context } from '../context'\nimport { toValue } from '../util'\nimport { isFalsy, isTruthy } from '../render/boolean'\nimport { isArray, isFunction } from '../util/underscore'\n\nexport type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean;\nexport type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean;\nexport type OperatorHandler = UnaryOperatorHandler | BinaryOperatorHandler;\nexport type Operators = Record\n\nexport const defaultOperators: Operators = {\n '==': equals,\n '!=': (l: any, r: any) => !equals(l, r),\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return toValue(l) > toValue(r)\n },\n '<': (l: any, r: any) => {\n if (isComparable(l)) return l.lt(r)\n if (isComparable(r)) return r.gt(l)\n return toValue(l) < toValue(r)\n },\n '>=': (l: any, r: any) => {\n if (isComparable(l)) return l.geq(r)\n if (isComparable(r)) return r.leq(l)\n return toValue(l) >= toValue(r)\n },\n '<=': (l: any, r: any) => {\n if (isComparable(l)) return l.leq(r)\n if (isComparable(r)) return r.geq(l)\n return toValue(l) <= toValue(r)\n },\n 'contains': (l: any, r: any) => {\n l = toValue(l)\n if (isArray(l)) return l.some((i) => equals(i, r))\n if (isFunction(l?.indexOf)) return l.indexOf(toValue(r)) > -1\n return false\n },\n 'not': (v: any, ctx: Context) => isFalsy(toValue(v), ctx),\n 'and': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),\n 'or': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)\n}\n\nexport function equals (lhs: any, rhs: any): boolean {\n if (isComparable(lhs)) return lhs.equals(rhs)\n if (isComparable(rhs)) return rhs.equals(lhs)\n lhs = toValue(lhs)\n rhs = toValue(rhs)\n if (isArray(lhs)) {\n return isArray(rhs) && arrayEquals(lhs, rhs)\n }\n return lhs === rhs\n}\n\nfunction arrayEquals (lhs: any[], rhs: any[]): boolean {\n if (lhs.length !== rhs.length) return false\n return !lhs.some((value, i) => !equals(value, rhs[i]))\n}\n\nexport function arrayIncludes (arr: any[], item: any): boolean {\n return arr.some(value => equals(value, item))\n}\n","import { Cache } from './cache'\n\nclass Node {\n constructor (\n public key: string,\n public value: T,\n public next: Node,\n public prev: Node\n ) {}\n}\n\nexport class LRU implements Cache {\n private cache: Record> = {}\n private head: Node\n private tail: Node\n\n constructor (\n public limit: number,\n public size = 0\n ) {\n this.head = new Node('HEAD', null as any, null as any, null as any)\n this.tail = new Node('TAIL', null as any, null as any, null as any)\n this.head.next = this.tail\n this.tail.prev = this.head\n }\n\n write (key: string, value: T) {\n if (this.cache[key]) {\n this.cache[key].value = value\n } else {\n const node = new Node(key, value, this.head.next, this.head)\n this.head.next.prev = node\n this.head.next = node\n\n this.cache[key] = node\n this.size++\n this.ensureLimit()\n }\n }\n\n read (key: string): T | undefined {\n if (!this.cache[key]) return\n const { value } = this.cache[key]\n this.remove(key)\n this.write(key, value)\n return value\n }\n\n remove (key: string) {\n const node = this.cache[key]\n node.prev.next = node.next\n node.next.prev = node.prev\n delete this.cache[key]\n this.size--\n }\n\n clear () {\n this.head.next = this.tail\n this.tail.prev = this.head\n this.size = 0\n this.cache = {}\n }\n\n private ensureLimit () {\n if (this.size > this.limit) this.remove(this.tail.prev.key)\n }\n}\n","import { last } from '../util'\n\nfunction domResolve (root: string, path: string) {\n const base = document.createElement('base')\n base.href = root\n\n const head = document.getElementsByTagName('head')[0]\n head.insertBefore(base, head.firstChild)\n\n const a = document.createElement('a')\n a.href = path\n const resolved = a.href\n head.removeChild(base)\n\n return resolved\n}\n\nexport function resolve (root: string, filepath: string, ext: string) {\n if (root.length && last(root) !== '/') root += '/'\n const url = domResolve(root, filepath)\n return url.replace(/^(\\w+:\\/\\/[^/]+)(\\/[^?]+)/, (str, origin, path) => {\n const last = path.split('/').pop()\n if (/\\.\\w+$/.test(last)) return str\n return origin + path + ext\n })\n}\n\nexport async function readFile (url: string): Promise {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText as string)\n } else {\n reject(new Error(xhr.statusText))\n }\n }\n xhr.onerror = () => {\n reject(new Error('An error occurred whilst receiving the response.'))\n }\n xhr.open('GET', url)\n xhr.send()\n })\n}\n\nexport function readFileSync (url: string): string {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.send()\n if (xhr.status < 200 || xhr.status >= 300) {\n throw new Error(xhr.statusText)\n }\n return xhr.responseText as string\n}\n\nexport async function exists (filepath: string) {\n return true\n}\n\nexport function existsSync (filepath: string) {\n return true\n}\n\nexport function dirname (filepath: string) {\n return domResolve(filepath, '.')\n}\n\nexport const sep = '/'\n","import { isFalsy } from '../render/boolean'\nimport { identify, isArray, isString, toValue } from '../util/underscore'\nimport { FilterImpl } from '../template'\n\nfunction defaultFilter (this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2 {\n value = toValue(value)\n if (isArray(value) || isString(value)) return value.length ? value : defaultValue\n if (value === false && (new Map(args)).get('allow_false')) return false as T1\n return isFalsy(value, this.context) ? defaultValue : value\n}\n\nfunction json (value: any, space = 0) {\n return JSON.stringify(value, null, space)\n}\n\nfunction inspect (value: any, space = 0) {\n const ancestors: object[] = []\n return JSON.stringify(value, function (this: unknown, _key: unknown, value: any) {\n if (typeof value !== 'object' || value === null) return value\n // `this` is the object that value is contained in, i.e., its direct parent.\n while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) ancestors.pop()\n if (ancestors.includes(value)) return '[Circular]'\n ancestors.push(value)\n return value\n }, space)\n}\n\nfunction to_integer (value: any) {\n return Number(value)\n}\n\nconst raw = {\n raw: true,\n handler: identify\n}\n\nexport default {\n default: defaultFilter,\n raw,\n jsonify: json,\n to_integer,\n json,\n inspect\n}\n","import { FilterImpl } from '../template'\nimport { stringify } from '../util/underscore'\n\nconst escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nexport function escape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nexport function xml_escape (this: FilterImpl, str: string) {\n return escape.call(this, str)\n}\n\nfunction unescape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport function escape_once (this: FilterImpl, str: string) {\n return escape.call(this, unescape.call(this, str))\n}\n\nexport function newline_to_br (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '
    \\n')\n}\n\n// Raw-text blocks (HTML5) plus '<...>' as the catch-all kind; a regex\n// equivalent is O(n^2) in V8 on unclosed openers.\nexport function strip_html (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const blocks = new Map([[''], [''], [''], ['<', '>']])\n let out = ''\n let i = 0\n while (i < str.length) {\n const lt = str.indexOf('<', i)\n if (lt < 0) return out + str.slice(i)\n out += str.slice(i, lt)\n for (const [opener, closer] of blocks) {\n if (!str.startsWith(opener, lt)) continue\n const e = str.indexOf(closer, lt + opener.length)\n if (e >= 0) { i = e + closer.length; break }\n blocks.delete(opener)\n }\n if (i === lt) return out + str.slice(lt)\n }\n return out\n}\n","import { isNil } from '../util'\n\nexport class MapFS {\n constructor (private mapping: {[key: string]: string}) {}\n\n public sep = '/'\n\n async exists (filepath: string) {\n return this.existsSync(filepath)\n }\n\n existsSync (filepath: string) {\n return !isNil(this.mapping[filepath])\n }\n\n async readFile (filepath: string) {\n return this.readFileSync(filepath)\n }\n\n readFileSync (filepath: string) {\n const content = this.mapping[filepath]\n if (isNil(content)) throw new Error(`ENOENT: ${filepath}`)\n return content\n }\n\n dirname (filepath: string) {\n const segments = filepath.split(this.sep)\n segments.pop()\n return segments.join(this.sep)\n }\n\n resolve (dir: string, file: string, ext: string) {\n file += ext\n if (dir === '.') return file\n const segments = dir.split(/\\/+/)\n for (const segment of file.split(this.sep)) {\n if (segment === '.' || segment === '') continue\n else if (segment === '..') {\n if (segments.length > 1 || segments[0] !== '') segments.pop()\n } else segments.push(segment)\n }\n return segments.join(this.sep)\n }\n}\n","import { assert, isArray, isString, isFunction } from './util'\nimport { getDateTimeFormat } from './util/intl'\nimport { LRU, LiquidCache } from './cache'\nimport { FS, LookupType } from './fs'\nimport * as fs from './fs/fs-impl'\nimport { defaultOperators, Operators } from './render'\nimport misc from './filters/misc'\nimport { escape } from './filters/html'\nimport { MapFS } from './fs/map-fs'\n\ntype OutputEscape = (value: any) => string\ntype OutputEscapeOption = 'escape' | 'json' | OutputEscape\n\nexport interface LiquidOptions {\n /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[];\n /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n partials?: string | string[];\n /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n layouts?: string | string[];\n /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */\n relativeReference?: boolean;\n /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */\n jekyllInclude?: boolean;\n /** Use jekyll style where filter, enables array item match. Defaults to `false`. */\n jekyllWhere?: boolean;\n /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string;\n /** Whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean | number | LiquidCache;\n /** Use JavaScript Truthiness. Defaults to `false`. */\n jsTruthy?: boolean;\n /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean;\n /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strictFilters?: boolean;\n /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strictVariables?: boolean;\n /** Catch all errors instead of exit upon one. Please note that render errors won't be reached when parse fails. */\n catchAllErrors?: boolean;\n /** Hide scope variables from prototypes, useful when you're passing a not sanitized object into LiquidJS or need to hide prototypes from templates. */\n ownPropertyOnly?: boolean;\n /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/\n lenientIf?: boolean;\n /** JavaScript timezone name or timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to `-600` or `Australia/Lindeman` */\n timezoneOffset?: number | string;\n /** Default date format to use if the date filter doesn't include a format. Defaults to `%A, %B %-e, %Y at %-l:%M %P %z`. */\n dateFormat?: string;\n /** Default locale, will be used by date filter. Defaults to system locale. */\n locale?: string;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trimTagRight?: boolean;\n /** Similar to `trimTagRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimTagLeft?: boolean;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trimOutputRight?: boolean;\n /** Similar to `trimOutputRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimOutputLeft?: boolean;\n /** The left delimiter for liquid tags. **/\n tagDelimiterLeft?: string;\n /** The right delimiter for liquid tags. **/\n tagDelimiterRight?: string;\n /** The left delimiter for liquid outputs. **/\n outputDelimiterLeft?: string;\n /** The right delimiter for liquid outputs. **/\n outputDelimiterRight?: string;\n /** Whether input strings to date filter preserve the given timezone **/\n preserveTimezones?: boolean;\n /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimmed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean;\n /** `fs` is used to override the default file-system module with a custom implementation. */\n fs?: FS;\n /** keyValue separator */\n keyValueSeparator?: string;\n /** Render from in-memory `templates` mapping instead of file system. File system related options like `fs`, 'root', and `relativeReference` will be ignored when `templates` is specified. */\n templates?: {[key: string]: string};\n /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */\n globals?: object;\n /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */\n keepOutputType?: boolean;\n /** Default escape filter applied to output values, when set, you'll have to add `| raw` for values don't need to be escaped. Defaults to `undefined`. */\n outputEscape?: OutputEscapeOption;\n /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */\n operators?: Operators;\n /** Respect parameter order when using filters like \"for ... reversed limit\", Defaults to `false`. */\n orderedFilterParameters?: boolean;\n /** For DoS handling, limit total length of templates parsed in one `parse()` call. A typical PC can handle 1e8 (100M) characters without issues. */\n parseLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue. */\n memoryLimit?: number;\n}\n\nexport interface RenderOptions {\n /**\n * This call is sync or async? It's used by Liquid internal methods, you'll not need this.\n */\n sync?: boolean;\n /**\n * Same as `globals` on LiquidOptions, but only for current render() call\n */\n globals?: object;\n /**\n * Same as `strictVariables` on LiquidOptions, but only for current render() call\n */\n strictVariables?: boolean;\n /**\n * Same as `ownPropertyOnly` on LiquidOptions, but only for current render() call\n */\n ownPropertyOnly?: boolean;\n /** For DoS handling, limit total renders of tag/HTML/output in one `render()` call. A typical PC can handle 1e5 renders of typical templates per second. */\n templateLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue.. */\n memoryLimit?: number;\n}\n\nexport interface RenderFileOptions extends RenderOptions {\n lookupType?: LookupType;\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[];\n partials?: string[];\n layouts?: string[];\n cache?: LiquidCache;\n outputEscape?: OutputEscape;\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n jekyllInclude: boolean;\n extname: string;\n cache?: LiquidCache;\n jsTruthy: boolean;\n dynamicPartials: boolean;\n fs: FS;\n strictFilters: boolean;\n strictVariables: boolean;\n ownPropertyOnly: boolean;\n lenientIf: boolean;\n dateFormat: string;\n locale: string;\n trimTagRight: boolean;\n trimTagLeft: boolean;\n trimOutputRight: boolean;\n trimOutputLeft: boolean;\n tagDelimiterLeft: string;\n tagDelimiterRight: string;\n outputDelimiterLeft: string;\n outputDelimiterRight: string;\n preserveTimezones: boolean;\n greedy: boolean;\n globals: object;\n keepOutputType: boolean;\n operators: Operators;\n parseLimit: number;\n renderLimit: number;\n memoryLimit: number;\n}\n\nexport const defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n layouts: ['.'],\n partials: ['.'],\n relativeReference: true,\n jekyllInclude: false,\n keyValueSeparator: ':',\n cache: undefined,\n extname: '',\n fs: fs,\n dynamicPartials: true,\n jsTruthy: false,\n dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',\n locale: '',\n trimTagRight: false,\n trimTagLeft: false,\n trimOutputRight: false,\n trimOutputLeft: false,\n greedy: true,\n tagDelimiterLeft: '{%',\n tagDelimiterRight: '%}',\n outputDelimiterLeft: '{{',\n outputDelimiterRight: '}}',\n preserveTimezones: false,\n strictFilters: false,\n strictVariables: false,\n ownPropertyOnly: true,\n lenientIf: false,\n globals: {},\n keepOutputType: false,\n operators: defaultOperators,\n memoryLimit: Infinity,\n parseLimit: Infinity,\n renderLimit: Infinity\n}\n\nexport function normalize (options: LiquidOptions): NormalizedFullOptions {\n if (options.hasOwnProperty('root')) {\n if (!options.hasOwnProperty('partials')) options.partials = options.root\n if (!options.hasOwnProperty('layouts')) options.layouts = options.root\n }\n if (options.hasOwnProperty('cache')) {\n let cache: LiquidCache | undefined\n if (typeof options.cache === 'number') cache = options.cache > 0 ? new LRU(options.cache) : undefined\n else if (typeof options.cache === 'object') cache = options.cache\n else cache = options.cache ? new LRU(1024) : undefined\n options.cache = cache\n }\n options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options }\n if ((!options.fs!.dirname || !options.fs!.sep) && options.relativeReference) {\n console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning')\n options.relativeReference = false\n }\n options.root = normalizeDirectoryList(options.root)\n options.partials = normalizeDirectoryList(options.partials)\n options.layouts = normalizeDirectoryList(options.layouts)\n options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape)\n if (!options.locale) {\n options.locale = getDateTimeFormat()?.().resolvedOptions().locale ?? 'en-US'\n }\n if (options.templates) {\n options.fs = new MapFS(options.templates)\n options.relativeReference = true\n options.root = options.partials = options.layouts = '.'\n }\n return options as NormalizedFullOptions\n}\n\nfunction getOutputEscapeFunction (nameOrFunction: OutputEscapeOption): OutputEscape {\n if (nameOrFunction === 'escape') return escape\n if (nameOrFunction === 'json') return misc.json\n assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function')\n return nameOrFunction\n}\n\nexport function normalizeDirectoryList (value: any): string[] {\n let list: string[] = []\n if (isArray(value)) list = value\n if (isString(value)) list = [value]\n return list\n}\n","import { Token } from '../tokens'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { isTagToken, isHTMLToken, isDelimitedToken, TYPES, INLINE_BLANK, BLANK } from '../util'\n\nexport function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n let inRaw = false\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n if (!isDelimitedToken(token)) continue\n if (!inRaw && token.trimLeft) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (isTagToken(token)) {\n if (token.name === 'raw') inRaw = true\n else if (token.name === 'endraw') inRaw = false\n }\n\n if (!inRaw && token.trimRight) {\n trimRight(tokens[i + 1], options.greedy)\n }\n }\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) token.trimRight++\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) token.trimLeft++\n if (token.input.charAt(token.begin + token.trimLeft) === '\\n') token.trimLeft++\n}\n","import { FilteredValueToken, TagToken, HTMLToken, HashToken, QuotedToken, LiquidTagToken, OutputToken, ValueToken, Token, RangeToken, FilterToken, TopLevelToken, PropertyAccessToken, OperatorToken, LiteralToken, IdentifierToken, NumberToken } from '../tokens'\nimport { OperatorHandler } from '../render/operator'\nimport { TrieNode, LiteralValue, Trie, createTrie, ellipsis, literalValues, TokenizationError, TYPES, QUOTE, BLANK, NUMBER, SIGN, isWord, isString } from '../util'\nimport { Operators, Expression } from '../render'\nimport { NormalizedFullOptions, defaultOptions } from '../liquid-options'\nimport { FilterArg } from './filter-arg'\nimport { whiteSpaceCtrl } from './whitespace-ctrl'\n\nexport class Tokenizer {\n p: number\n N: number\n private rawBeginAt = -1\n private opTrie: Trie\n private literalTrie: Trie\n\n constructor (\n public input: string,\n operators: Operators = defaultOptions.operators,\n public file?: string,\n range?: [number, number]\n ) {\n this.p = range ? range[0] : 0\n this.N = range ? range[1] : input.length\n this.opTrie = createTrie(operators)\n this.literalTrie = createTrie(literalValues)\n }\n\n readExpression () {\n return new Expression(this.readExpressionTokens())\n }\n\n * readExpressionTokens (): IterableIterator {\n while (this.p < this.N) {\n const operator = this.readOperator()\n if (operator) {\n yield operator\n continue\n }\n const operand = this.readValue()\n if (operand) {\n yield operand\n continue\n }\n return\n }\n }\n readOperator (): OperatorToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.opTrie)\n if (end === -1) return\n return new OperatorToken(this.input, this.p, (this.p = end), this.file)\n }\n matchTrie (trie: Trie) {\n let node: TrieNode = trie\n let i = this.p\n let info\n while (node[this.input[i]] && i < this.N) {\n node = node[this.input[i++]]\n if (node['end']) info = node\n }\n if (!info) return -1\n if (info['needBoundary'] && isWord(this.peek(i - this.p))) return -1\n return i\n }\n readFilteredValue (): FilteredValueToken {\n const begin = this.p\n const initial = this.readExpression()\n this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`)\n const filters = this.readFilters()\n return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file)\n }\n readFilters (): FilterToken[] {\n const filters = []\n while (true) {\n const filter = this.readFilter()\n if (!filter) return filters\n filters.push(filter)\n }\n }\n readFilter (): FilterToken | null {\n this.skipBlank()\n if (this.end()) return null\n this.assert(this.read() === '|', `expected \"|\" before filter`)\n const name = this.readIdentifier()\n if (!name.size()) {\n this.assert(this.end(), `expected filter name`)\n return null\n }\n const args = []\n this.skipBlank()\n if (this.peek() === ':') {\n do {\n ++this.p\n const arg = this.readFilterArg()\n arg && args.push(arg)\n this.skipBlank()\n this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`)\n } while (this.peek() === ',')\n } else if (this.peek() === '|' || this.end()) {\n // do nothing\n } else {\n throw this.error('expected \":\" after filter name')\n }\n return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file)\n }\n\n readFilterArg (): FilterArg | undefined {\n const key = this.readValue()\n if (!key) return\n this.skipBlank()\n if (this.peek() !== ':') return key\n ++this.p\n const value = this.readValue()\n return [key.getText(), value]\n }\n\n readTopLevelTokens (options: NormalizedFullOptions = defaultOptions): TopLevelToken[] {\n const tokens: TopLevelToken[] = []\n while (this.p < this.N) {\n const token = this.readTopLevelToken(options)\n tokens.push(token)\n }\n whiteSpaceCtrl(tokens, options)\n return tokens\n }\n\n readTopLevelToken (options: NormalizedFullOptions): TopLevelToken {\n const { tagDelimiterLeft, outputDelimiterLeft } = options\n if (this.rawBeginAt > -1) return this.readEndrawOrRawContent(options)\n if (this.match(tagDelimiterLeft)) return this.readTagToken(options)\n if (this.match(outputDelimiterLeft)) return this.readOutputToken(options)\n return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft])\n }\n\n readHTMLToken (stopStrings: string[]): HTMLToken {\n const begin = this.p\n while (this.p < this.N) {\n if (stopStrings.some(str => this.match(str))) break\n ++this.p\n }\n return new HTMLToken(this.input, begin, this.p, this.file)\n }\n\n readTagToken (options: NormalizedFullOptions): TagToken {\n const { file, input } = this\n const begin = this.p\n if (this.readToDelimiter(options.tagDelimiterRight) === -1) {\n throw this.error(`tag ${this.snapshot(begin)} not closed`, begin)\n }\n const token = new TagToken(input, begin, this.p, options, file)\n if (token.name === 'raw') this.rawBeginAt = begin\n return token\n }\n\n readToDelimiter (delimiter: string, respectQuoted = false) {\n this.skipBlank()\n while (this.p < this.N) {\n if (respectQuoted && (this.peekType() & QUOTE)) {\n this.readQuoted()\n continue\n }\n ++this.p\n if (this.rmatch(delimiter)) return this.p\n }\n return -1\n }\n\n readOutputToken (options: NormalizedFullOptions = defaultOptions): OutputToken {\n const { file, input } = this\n const { outputDelimiterRight } = options\n const begin = this.p\n if (this.readToDelimiter(outputDelimiterRight, true) === -1) {\n throw this.error(`output ${this.snapshot(begin)} not closed`, begin)\n }\n return new OutputToken(input, begin, this.p, options, file)\n }\n\n readEndrawOrRawContent (options: NormalizedFullOptions): HTMLToken | TagToken {\n const { tagDelimiterLeft, tagDelimiterRight } = options\n const begin = this.p\n let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n while (this.p < this.N) {\n if (this.readIdentifier().getText() !== 'endraw') {\n leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n continue\n }\n while (this.p <= this.N) {\n if (this.rmatch(tagDelimiterRight)) {\n const end = this.p\n if (begin === leftPos) {\n this.rawBeginAt = -1\n return new TagToken(this.input, begin, end, options, this.file)\n } else {\n this.p = leftPos\n return new HTMLToken(this.input, begin, leftPos, this.file)\n }\n }\n if (this.rmatch(tagDelimiterLeft)) break\n this.p++\n }\n }\n throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin)\n }\n\n readLiquidTagTokens (options: NormalizedFullOptions = defaultOptions): LiquidTagToken[] {\n const tokens: LiquidTagToken[] = []\n while (this.p < this.N) {\n const token = this.readLiquidTagToken(options)\n token && tokens.push(token)\n }\n return tokens\n }\n\n readLiquidTagToken (options: NormalizedFullOptions): LiquidTagToken | undefined {\n this.skipBlank()\n if (this.end()) return\n\n const begin = this.p\n this.readToDelimiter('\\n')\n const end = this.p\n return new LiquidTagToken(this.input, begin, end, options, this.file)\n }\n\n error (msg: string, pos: number = this.p) {\n return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file))\n }\n\n assert (pred: unknown, msg: string | (() => string), pos?: number) {\n if (!pred) throw this.error(typeof msg === 'function' ? msg() : msg, pos)\n }\n\n snapshot (begin: number = this.p) {\n return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32))\n }\n\n /**\n * @deprecated use #readIdentifier instead\n */\n readWord () {\n return this.readIdentifier()\n }\n\n readIdentifier (): IdentifierToken {\n this.skipBlank()\n const begin = this.p\n while (!this.end() && isWord(this.peek())) ++this.p\n return new IdentifierToken(this.input, begin, this.p, this.file)\n }\n\n readNonEmptyIdentifier (): IdentifierToken | undefined {\n const id = this.readIdentifier()\n return id.size() ? id : undefined\n }\n\n readTagName (): string {\n this.skipBlank()\n // Handle inline comment tags\n if (this.input[this.p] === '#') return this.input.slice(this.p, ++this.p)\n return this.readIdentifier().getText()\n }\n\n readHashes (jekyllStyle?: boolean | string) {\n const hashes = []\n while (true) {\n const hash = this.readHash(jekyllStyle)\n if (!hash) return hashes\n hashes.push(hash)\n }\n }\n\n readHash (jekyllStyle?: boolean | string): HashToken | undefined {\n this.skipBlank()\n if (this.peek() === ',') ++this.p\n const begin = this.p\n const name = this.readNonEmptyIdentifier()\n if (!name) return\n let value\n\n this.skipBlank()\n const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':')\n if (this.peek() === sep) {\n ++this.p\n value = this.readValue()\n }\n return new HashToken(this.input, begin, this.p, name, value, this.file)\n }\n\n remaining () {\n return this.input.slice(this.p, this.N)\n }\n\n advance (step = 1) {\n this.p += step\n }\n\n end () {\n return this.p >= this.N\n }\n read () {\n return this.input[this.p++]\n }\n readTo (end: string): number {\n while (this.p < this.N) {\n ++this.p\n if (this.rmatch(end)) return this.p\n }\n return -1\n }\n\n readValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber()\n const props = this.readProperties(!variable)\n if (!props.length) return variable\n return new PropertyAccessToken(variable, props, this.input, begin, this.p)\n }\n\n readScopeValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const props = this.readProperties()\n if (!props.length) return undefined\n return new PropertyAccessToken(undefined, props, this.input, begin, this.p)\n }\n\n private readProperties (isBegin = true): (ValueToken | IdentifierToken)[] {\n const props: (ValueToken | IdentifierToken)[] = []\n while (true) {\n if (this.peek() === '[') {\n this.p++\n const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file)\n this.assert(this.readTo(']') !== -1, '[ not closed')\n props.push(prop)\n continue\n }\n if (isBegin && !props.length) {\n const prop = this.readNonEmptyIdentifier()\n if (prop) {\n props.push(prop)\n continue\n }\n }\n if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax\n this.p++\n const prop = this.readNonEmptyIdentifier()\n if (!prop) break\n props.push(prop)\n continue\n }\n break\n }\n return props\n }\n\n readNumber (): NumberToken | undefined {\n this.skipBlank()\n let decimalFound = false\n let digitFound = false\n let n = 0\n if (this.peekType() & SIGN) n++\n while (this.p + n <= this.N) {\n if (this.peekType(n) & NUMBER) {\n digitFound = true\n n++\n } else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {\n if (decimalFound || !digitFound) return\n decimalFound = true\n n++\n } else break\n }\n if (digitFound && !isWord(this.peek(n))) {\n const num = new NumberToken(this.input, this.p, this.p + n, this.file)\n this.advance(n)\n return num\n }\n }\n\n readLiteral (): LiteralToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.literalTrie)\n if (end === -1) return\n const literal = new LiteralToken(this.input, this.p, end, this.file)\n this.p = end\n return literal\n }\n\n readRange (): RangeToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (this.peek() !== '(') return\n ++this.p\n const lhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax')\n const rhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === ')', 'invalid range syntax')\n return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file)\n }\n\n readValueOrThrow (): ValueToken {\n const value = this.readValue()\n this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`)\n return value!\n }\n\n readQuoted (): QuotedToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (!(this.peekType() & QUOTE)) return\n ++this.p\n let escaped = false\n while (this.p < this.N) {\n ++this.p\n if (this.input[this.p - 1] === this.input[begin] && !escaped) break\n if (escaped) escaped = false\n else if (this.input[this.p - 1] === '\\\\') escaped = true\n }\n return new QuotedToken(this.input, begin, this.p, this.file)\n }\n\n * readFileNameTemplate (options: NormalizedFullOptions): IterableIterator {\n const { outputDelimiterLeft } = options\n const htmlStopStrings = [',', ' ', '\\r', '\\n', '\\t', outputDelimiterLeft]\n const htmlStopStringSet = new Set(htmlStopStrings)\n // break on ',' and ' ', outputDelimiterLeft only stops HTML token\n while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {\n yield this.match(outputDelimiterLeft)\n ? this.readOutputToken(options)\n : this.readHTMLToken(htmlStopStrings)\n }\n }\n\n match (word: string) {\n for (let i = 0; i < word.length; i++) {\n if (word[i] !== this.input[this.p + i]) return false\n }\n return true\n }\n\n rmatch (pattern: string) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) return false\n }\n return true\n }\n\n peekType (n = 0) {\n return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]\n }\n\n peek (n = 0): string {\n return this.p + n >= this.N ? '' : this.input[this.p + n]\n }\n\n skipBlank () {\n while (this.peekType() & BLANK) ++this.p\n }\n}\n","import { Token, TopLevelToken } from '../tokens'\nimport { Template } from '../template'\nimport { isTagToken } from '../util'\n\ntype ParseToken = ((token: T, remainTokens: T[]) => Template)\n\nexport class ParseStream {\n private tokens: T[]\n private handlers: Record void> = {}\n private stopRequested = false\n private parseToken: ParseToken\n\n public constructor (tokens: T[], parseToken: ParseToken) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n public on (name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream {\n this.handlers[name] = cb\n return this\n }\n private trigger (event: string, arg?: T) {\n const h = this.handlers[event]\n return h ? (h.call(this, arg), true) : false\n }\n public start () {\n this.trigger('start')\n let token: T | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) {\n continue\n }\n const template = this.parseToken(token, this.tokens)\n this.trigger('template', template)\n }\n if (!this.stopRequested) this.trigger('end')\n return this\n }\n public stop () {\n this.stopRequested = true\n return this\n }\n}\n","export abstract class TemplateImpl {\n public token: T;\n public constructor (token: T) {\n this.token = token\n }\n}\n","import { TemplateImpl } from './template-impl'\nimport type { Emitter } from '../emitters/emitter'\nimport type { Parser, Tokenizer } from '../parser'\nimport type { Context } from '../context/context'\nimport type { TopLevelToken, TagToken } from '../tokens'\nimport type { Template } from './template'\nimport type { Liquid } from '../liquid'\n\nexport type TagRenderReturn = Generator | Promise | unknown\n\nexport abstract class Tag extends TemplateImpl implements Template {\n public name: string\n public liquid: Liquid\n protected tokenizer: Tokenizer\n\n public constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token)\n this.name = token.name\n this.liquid = liquid\n this.tokenizer = token.tokenizer\n }\n public abstract render (ctx: Context, emitter: Emitter): TagRenderReturn;\n}\n\nexport interface TagClass {\n new(token: TagToken, tokens: TopLevelToken[], liquid: Liquid, parser: Parser): Tag\n}\n","import { evalToken } from '../render/expression'\nimport { Context } from '../context/context'\nimport { Tokenizer } from '../parser/tokenizer'\nimport { Token } from '../tokens/token'\n\ntype HashValueTokens = Record\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `, foo:'bar', coo:2 reversed %}`,\n * hash['foo'] === 'bar'\n * hash['coo'] === 2\n * hash['reversed'] === undefined\n */\nexport class Hash {\n hash: HashValueTokens = {}\n\n constructor (input: string | Tokenizer, jekyllStyle?: boolean | string) {\n const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {})\n for (const hash of tokenizer.readHashes(jekyllStyle)) {\n this.hash[hash.name.content] = hash.value\n }\n }\n\n * render (ctx: Context): Generator, unknown> {\n const hash = {}\n for (const key of Object.keys(this.hash)) {\n hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx)\n }\n return hash\n }\n}\n","import { isArray } from '../util/underscore'\nimport { ValueToken } from '../tokens/value-token'\n\ntype KeyValuePair = [string?, ValueToken?]\n\nexport type FilterArg = ValueToken | KeyValuePair\n\nexport function isKeyValuePair (arr: FilterArg): arr is KeyValuePair {\n return isArray(arr)\n}\n","import { evalToken } from '../render'\nimport { Context } from '../context'\nimport { identify, isFunction } from '../util/underscore'\nimport { FilterHandler, FilterImplOptions } from './filter-impl-options'\nimport { FilterArg, isKeyValuePair } from '../parser/filter-arg'\nimport { Liquid } from '../liquid'\nimport { FilterToken } from '../tokens'\n\nexport class Filter {\n public name: string\n public args: FilterArg[]\n public readonly raw: boolean\n private handler: FilterHandler\n private liquid: Liquid\n private token: FilterToken\n\n public constructor (token: FilterToken, options: FilterImplOptions | undefined, liquid: Liquid) {\n this.token = token\n this.name = token.name\n this.handler = isFunction(options)\n ? options\n : (isFunction(options?.handler) ? options!.handler : identify)\n this.raw = !isFunction(options) && !!options?.raw\n this.args = token.args\n this.liquid = liquid\n }\n public * render (value: any, context: Context): IterableIterator {\n const argv: any[] = []\n for (const arg of this.args as FilterArg[]) {\n if (isKeyValuePair(arg)) argv.push([arg[0], yield evalToken(arg[1], context)])\n else argv.push(yield evalToken(arg, context))\n }\n return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv])\n }\n}\n","import { Filter } from './filter'\nimport { Expression } from '../render'\nimport { Tokenizer } from '../parser'\nimport { assert } from '../util'\nimport type { FilteredValueToken } from '../tokens'\nimport type { Liquid } from '../liquid'\nimport type { Context } from '../context'\n\nexport class Value {\n public readonly filters: Filter[] = []\n public readonly initial: Expression\n\n /**\n * @param str the value to be valuated, eg.: \"foobar\" | truncate: 3\n */\n public constructor (input: string | FilteredValueToken, liquid: Liquid) {\n const token: FilteredValueToken = typeof input === 'string'\n ? new Tokenizer(input, liquid.options.operators).readFilteredValue()\n : input\n this.initial = token.initial\n this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid))\n }\n\n public * value (ctx: Context, lenient?: boolean): Generator {\n lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default')\n let val = yield this.initial.evaluate(ctx, lenient)\n\n for (const filter of this.filters) {\n val = yield filter.render(val, ctx)\n }\n return val\n }\n\n private getFilter (liquid: Liquid, name: string) {\n const impl = liquid.filters[name]\n assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`)\n return impl\n }\n}\n","import { Value } from './value'\nimport { Arguments, Template, TemplateImpl } from '../template'\nimport { Context } from '../context/context'\nimport { Emitter } from '../emitters/emitter'\nimport { OutputToken } from '../tokens/output-token'\nimport { Tokenizer } from '../parser'\nimport { Liquid } from '../liquid'\nimport { Filter } from './filter'\nimport { FilterToken } from '../tokens'\n\nexport class Output extends TemplateImpl implements Template {\n value: Value\n public constructor (token: OutputToken, liquid: Liquid) {\n super(token)\n const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange)\n this.value = new Value(tokenizer.readFilteredValue(), liquid)\n const filters = this.value.filters\n const outputEscape = liquid.options.outputEscape\n if (!filters[filters.length - 1]?.raw && outputEscape) {\n const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0)\n filters.push(new Filter(token, outputEscape, liquid))\n }\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator {\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n}\n","import { TemplateImpl, Template } from '../template'\nimport { HTMLToken } from '../tokens'\nimport { Context } from '../context'\nimport { Emitter } from '../emitters'\n\nexport class HTML extends TemplateImpl implements Template {\n private str: string\n public constructor (token: HTMLToken) {\n super(token)\n this.str = token.getContent()\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator {\n emitter.write(this.str)\n }\n}\n","import { Argument, Template, Value } from '.'\nimport { isKeyValuePair } from '../parser/filter-arg'\nimport { PropertyAccessToken, ValueToken } from '../tokens'\nimport {\n isNumberToken,\n isPropertyAccessToken,\n isQuotedToken,\n isRangeToken,\n isString,\n isValueToken,\n isWordToken,\n toPromise,\n toValueSync\n} from '../util'\n\n/**\n * Row, column and file name where a variable was found.\n */\nexport interface VariableLocation {\n row: number;\n col: number;\n file?: string;\n}\n\n/**\n * A variable's segments as an array, possibly with nested arrays of segments.\n */\nexport type SegmentArray = Array\n\n/**\n * A variable's segments and location, which can be coerced to a string.\n */\nexport class Variable {\n constructor (\n readonly segments: Array,\n readonly location: VariableLocation\n ) {}\n\n public toString (): string {\n return segmentsString(this.segments, true)\n }\n\n /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */\n public toArray (): SegmentArray {\n function * _visit (...segments: Array): Generator {\n for (const segment of segments) {\n if (segment instanceof Variable) {\n yield Array.from(_visit(...segment.segments))\n } else {\n yield segment\n }\n }\n }\n return Array.from(_visit(...this.segments))\n }\n}\n\n/**\n * Property names and array indexes that make up a path to a variable.\n */\nexport type VariableSegments = Array;\n\n/**\n * A mapping of variable names to an array of locations at which the variable was found.\n */\nexport type Variables = { [key: string]: Variable[] };\n\n/**\n * Group variables by the string representation of their root segment.\n */\nexport class VariableMap {\n private map: Map\n\n constructor () {\n this.map = new Map()\n }\n\n public get (key: Variable): Variable[] {\n const k = segmentsString([key.segments[0]])\n if (!this.map.has(k)) {\n this.map.set(k, [])\n }\n return this.map.get(k) as Variable[]\n }\n\n public has (key: Variable): boolean {\n return this.map.has(segmentsString([key.segments[0]]))\n }\n\n public push (variable: Variable): void {\n this.get(variable).push(variable)\n }\n\n public asObject (): Variables {\n return Object.fromEntries(this.map)\n }\n}\n\n/**\n * The result of calling `analyze()` or `analyzeSync()`.\n */\nexport interface StaticAnalysis {\n /**\n * All variables, whether they are in scope or not. Including references to names\n * such as `forloop` from the `for` tag.\n */\n variables: Variables;\n\n /**\n * Variables that are not in scope. These could be a \"global\" variables that are\n * expected to be provided by the application developer, or possible mistakes\n * from the template author.\n *\n * If a variable is referenced before and after assignment, you should expect\n * that variable to be included in `globals`, `variables` and `locals`, each with\n * a different location.\n */\n globals: Variables;\n\n /**\n * Template variables that are added to the template local scope using tags like\n * `assign`, `capture` or `increment`.\n */\n locals: Variables;\n}\n\nexport interface StaticAnalysisOptions {\n /**\n * When `true` (the default), try to load partial templates and analyze them too.\n */\n partials?: boolean;\n}\n\nexport const defaultStaticAnalysisOptions: StaticAnalysisOptions = {\n partials: true\n}\n\nfunction * _analyze (templates: Template[], partials: boolean, sync: boolean): Generator {\n const variables = new VariableMap()\n const globals = new VariableMap()\n const locals = new VariableMap()\n\n const rootScope = new DummyScope(new Set())\n\n // Names of partial templates that we've already analyzed.\n const seen: Set = new Set()\n\n function updateVariables (variable: Variable, scope: DummyScope) {\n variables.push(variable)\n const aliased = scope.alias(variable)\n\n if (aliased !== undefined) {\n const root = aliased.segments[0]\n // TODO: What if a a template renders a rendered template? Do we need scope.parent?\n if (isString(root) && !rootScope.has(root)) {\n globals.push(aliased)\n }\n } else {\n const root = variable.segments[0]\n if (isString(root) && !scope.has(root)) {\n globals.push(variable)\n }\n }\n\n // Recurse for nested Variables\n for (const segment of variable.segments) {\n if (segment instanceof Variable) {\n updateVariables(segment, scope)\n }\n }\n }\n\n function * visit (template: Template, scope: DummyScope): Generator {\n if (template.arguments) {\n for (const arg of template.arguments()) {\n for (const variable of extractVariables(arg)) {\n updateVariables(variable, scope)\n }\n }\n }\n\n if (template.localScope) {\n for (const ident of template.localScope()) {\n scope.add(ident.content)\n scope.deleteAlias(ident.content)\n const [row, col] = ident.getPosition()\n locals.push(new Variable([ident.content], { row, col, file: ident.file }))\n }\n }\n\n if (template.children) {\n if (template.partialScope) {\n const partial = template.partialScope()\n\n if (partial === undefined) {\n // Layouts, for example, can have children that are not partials.\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n return\n }\n\n if (seen.has(partial.name)) return\n\n const partialScopeNames: Set = new Set()\n const partialScope = partial.isolated\n ? new DummyScope(partialScopeNames)\n : scope.push(partialScopeNames)\n\n for (const name of partial.scope) {\n if (isString(name)) {\n partialScopeNames.add(name)\n } else {\n const [alias, argument] = name\n partialScopeNames.add(alias)\n const variables = Array.from(extractVariables(argument))\n if (variables.length) {\n partialScope.setAlias(alias, variables[0].segments)\n }\n }\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, partialScope)\n seen.add(partial.name)\n }\n\n partialScope.pop()\n } else {\n if (template.blockScope) {\n scope.push(new Set(template.blockScope()))\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n\n if (template.blockScope) {\n scope.pop()\n }\n }\n }\n }\n\n for (const template of templates) {\n yield visit(template, rootScope)\n }\n\n return {\n variables: variables.asObject(),\n globals: globals.asObject(),\n locals: locals.asObject()\n }\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required\n return toPromise(_analyze(template, opts.partials, false))\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required\n return toValueSync(_analyze(template, opts.partials, true))\n}\n\ninterface ScopeStackItem {\n names: Set;\n aliases: Map;\n}\n\n/**\n * A stack to manage scopes while traversing templates during static analysis.\n */\nclass DummyScope {\n private stack: Array\n\n constructor (globals: Set) {\n this.stack = [{ names: globals, aliases: new Map() }]\n }\n\n /** Return true if `name` is in scope. */\n public has (name: string): boolean {\n for (const scope of this.stack) {\n if (scope.names.has(name)) {\n return true\n }\n }\n return false\n }\n\n public push (scope: Set): DummyScope {\n this.stack.push({ names: scope, aliases: new Map() })\n return this\n }\n\n public pop (): Set | undefined {\n return this.stack.pop()?.names\n }\n\n // Add a name to the template scope.\n public add (name: string): void {\n this.stack[0].names.add(name)\n }\n\n /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */\n public alias (variable: Variable): Variable | undefined {\n const root = variable.segments[0]\n if (!isString(root)) return undefined\n const alias = this.getAlias(root)\n if (alias === undefined) return undefined\n return new Variable([...alias, ...variable.segments.slice(1)], variable.location)\n }\n\n // TODO: `from` could be a path with multiple segments, like `include.x`.\n public setAlias (from: string, to: VariableSegments): void {\n this.stack[this.stack.length - 1].aliases.set(from, to)\n }\n\n public deleteAlias (name: string): void {\n this.stack[this.stack.length - 1].aliases.delete(name)\n }\n\n private getAlias (name: string): VariableSegments | undefined {\n for (const scope of this.stack) {\n if (scope.aliases.has(name)) {\n return scope.aliases.get(name)\n }\n\n // If a scope has defined `name`, then it masks aliases in parent scopes.\n if (scope.names.has(name)) {\n return undefined\n }\n }\n return undefined\n }\n}\n\nfunction * extractVariables (value: Argument): Generator {\n if (isValueToken(value)) {\n yield * extractValueTokenVariables(value)\n } else if (value instanceof Value) {\n yield * extractFilteredValueVariables(value)\n }\n}\n\nfunction * extractFilteredValueVariables (value: Value): Generator {\n for (const token of value.initial.postfix) {\n if (isValueToken(token)) {\n yield * extractValueTokenVariables(token)\n }\n }\n\n for (const filter of value.filters) {\n for (const arg of filter.args) {\n if (isKeyValuePair(arg) && arg[1]) {\n yield * extractValueTokenVariables(arg[1])\n } else if (isValueToken(arg)) {\n yield * extractValueTokenVariables(arg)\n }\n }\n }\n}\n\nfunction * extractValueTokenVariables (token: ValueToken): Generator {\n if (isRangeToken(token)) {\n yield * extractValueTokenVariables(token.lhs)\n yield * extractValueTokenVariables(token.rhs)\n } else if (isPropertyAccessToken(token)) {\n yield extractPropertyAccessVariable(token)\n }\n}\n\nfunction extractPropertyAccessVariable (token: PropertyAccessToken): Variable {\n const segments: VariableSegments = []\n\n // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.\n let file: string | undefined = token.file\n\n // Here we're flattening the first segment of a path if it is a nested path.\n const root = token.props[0]\n file = file || root.file\n if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {\n segments.push(root.content)\n } else if (isPropertyAccessToken(root)) {\n // Flatten paths that start with a nested path.\n segments.push(...extractPropertyAccessVariable(root).segments)\n }\n\n for (const prop of token.props.slice(1)) {\n file = file || prop.file\n if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {\n segments.push(prop.content)\n } else if (isPropertyAccessToken(prop)) {\n segments.push(extractPropertyAccessVariable(prop))\n }\n }\n\n const [row, col] = token.getPosition()\n return new Variable(segments, {\n row,\n col,\n file\n })\n}\n\n// This is used to detect segments that can be represented with dot notation\n// when creating a string representation of VariableSegments.\nconst RE_PROPERTY = /^[\\u0080-\\uFFFFa-zA-Z_][\\u0080-\\uFFFFa-zA-Z0-9_-]*$/\n\n/**\n * Return a string representation of segments using dot notation where possible.\n * @param segments - The property names and array indices that make up a path to a variable.\n * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.\n */\nfunction segmentsString (segments: VariableSegments, bracketedRoot = false): string {\n const buf: string[] = []\n\n const root = segments[0]\n if (isString(root)) {\n if (!bracketedRoot || root.match(RE_PROPERTY)) {\n buf.push(`${root}`)\n } else {\n buf.push(`['${root}']`)\n }\n }\n\n for (const segment of segments.slice(1)) {\n if (segment instanceof Variable) {\n buf.push(`[${segmentsString(segment.segments)}]`)\n } else if (isString(segment)) {\n if (segment.match(RE_PROPERTY)) {\n buf.push(`.${segment}`)\n } else {\n buf.push(`['${segment}']`)\n }\n } else {\n buf.push(`[${segment}]`)\n }\n }\n\n return buf.join('')\n}\n","import { FS } from './fs'\nimport { assert, LiquidAsync, toLiquidAsync } from '../util'\n\nexport interface LoaderOptions {\n fs: FS;\n extname: string;\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n}\nexport enum LookupType {\n Partials = 'partials',\n Layouts = 'layouts',\n Root = 'root'\n}\nexport class Loader {\n public shouldLoadRelative: (referencedFile: string) => boolean\n private options: LoaderOptions\n private contains: LiquidAsync>\n private exists: LiquidAsync\n\n constructor (options: LoaderOptions) {\n this.options = options\n if (options.relativeReference) {\n const sep = options.fs.sep\n assert(sep, '`fs.sep` is required for relative reference')\n const prefixes = ['.' + sep, '..' + sep, './', '../']\n this.shouldLoadRelative = (referencedFile: string) => prefixes.some(prefix => referencedFile.startsWith(prefix))\n } else {\n this.shouldLoadRelative = (_referencedFile: string) => false\n }\n const fs = options.fs\n this.contains = toLiquidAsync(\n fs.contains?.bind(fs) || (async () => true),\n fs.containsSync?.bind(fs) || (() => true)\n )\n this.exists = toLiquidAsync(\n fs.exists?.bind(fs) || (async () => false),\n fs.existsSync?.bind(fs)\n )\n }\n\n public * lookup (file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator {\n const dirs = this.options[type]\n for (const filepath of this.candidates(file, dirs, currentFile)) {\n let allowed = false\n for (const dir of dirs) {\n if (yield this.contains(!!sync, dir, filepath)) { allowed = true; break }\n }\n if (!allowed) continue\n if (yield this.exists(!!sync, filepath)) return filepath\n }\n throw this.lookupError(file, dirs)\n }\n\n public * candidates (file: string, dirs: string[], currentFile?: string) {\n const { fs, extname } = this.options\n\n if (this.shouldLoadRelative(file) && currentFile) {\n const referenced = fs.resolve(this.dirname(currentFile), file, extname)\n yield referenced\n }\n for (const dir of dirs) {\n const referenced = fs.resolve(dir, file, extname)\n yield referenced\n }\n\n if (fs.fallback !== undefined) {\n const filepath = fs.fallback(file)\n if (filepath !== undefined) yield filepath\n }\n }\n\n private dirname (path: string) {\n const fs = this.options.fs\n assert(fs.dirname, '`fs.dirname` is required for relative reference')\n return fs.dirname!(path)\n }\n\n private lookupError (file: string, roots: string[]) {\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n return err\n }\n}\n","import { Limiter, toPromise, assert, isTagToken, isOutputToken, ParseError, toLiquidAsync, LiquidAsync } from '../util'\nimport { Tokenizer } from './tokenizer'\nimport { ParseStream } from './parse-stream'\nimport { TopLevelToken, OutputToken } from '../tokens'\nimport { Template, Output, HTML } from '../template'\nimport { LiquidCache } from '../cache'\nimport { FS, Loader, LookupType } from '../fs'\nimport { LiquidError, LiquidErrors } from '../util/error'\nimport type { Liquid } from '../liquid'\n\nexport class Parser {\n public parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator\n\n private liquid: Liquid\n private fs: FS\n private cache?: LiquidCache\n private loader: Loader\n private parseLimit: Limiter\n private readFile: LiquidAsync\n\n public constructor (liquid: Liquid) {\n this.liquid = liquid\n this.cache = this.liquid.options.cache\n this.fs = this.liquid.options.fs\n this.parseFile = this.cache ? this._parseFileCached : this._parseFile\n this.loader = new Loader(this.liquid.options)\n this.parseLimit = new Limiter('parse length', liquid.options.parseLimit)\n this.readFile = toLiquidAsync(\n this.fs.readFile?.bind(this.fs) || (async () => { throw new Error('readFile not implemented') }),\n this.fs.readFileSync?.bind(this.fs)\n )\n }\n public parse (html: string, filepath?: string): Template[] {\n html = String(html)\n this.parseLimit.use(html.length)\n const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath)\n const tokens = tokenizer.readTopLevelTokens(this.liquid.options)\n return this.parseTokens(tokens)\n }\n public parseTokens (tokens: TopLevelToken[]) {\n let token\n const templates: Template[] = []\n const errors: LiquidError[] = []\n while ((token = tokens.shift())) {\n try {\n templates.push(this.parseToken(token, tokens))\n } catch (err) {\n if (this.liquid.options.catchAllErrors) errors.push(err as LiquidError)\n else throw err\n }\n }\n if (errors.length) throw new LiquidErrors(errors)\n return templates\n }\n public parseToken (token: TopLevelToken, remainTokens: TopLevelToken[]) {\n try {\n if (isTagToken(token)) {\n const TagClass = this.liquid.tags[token.name]\n assert(TagClass, `tag \"${token.name}\" not found`)\n return new TagClass(token, remainTokens, this.liquid, this)\n }\n if (isOutputToken(token)) {\n return new Output(token as OutputToken, this.liquid)\n }\n return new HTML(token)\n } catch (e) {\n if (LiquidError.is(e)) throw e\n throw new ParseError(e as Error, token)\n }\n }\n public parseStream (tokens: TopLevelToken[]) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n private * _parseFileCached (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator {\n const cache = this.cache!\n const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file\n const tpls = yield cache.read(key)\n if (tpls) return tpls\n\n const task = this._parseFile(file, sync, type, currentFile)\n // sync mode: exec the task and cache the result\n // async mode: cache the task before exec\n const taskOrTpl = sync ? yield task : toPromise(task)\n cache.write(key, taskOrTpl as any)\n // note: concurrent tasks will be reused, cache for failed task is removed until its end\n try { return yield taskOrTpl } catch (err) { cache.remove(key); throw err }\n }\n private * _parseFile (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator {\n const filepath = yield this.loader.lookup(file, type, sync, currentFile)\n return this.parse(yield this.readFile(!!sync, filepath), filepath)\n }\n}\n","import { RangeToken, NumberToken, QuotedToken, LiteralToken, PropertyAccessToken, OutputToken, HTMLToken, TagToken, IdentifierToken, DelimitedToken, OperatorToken, ValueToken } from '../tokens'\nimport { TokenKind } from '../parser'\n\nexport function isDelimitedToken (val: any): val is DelimitedToken {\n return !!(getKind(val) & TokenKind.Delimited)\n}\n\nexport function isOperatorToken (val: any): val is OperatorToken {\n return getKind(val) === TokenKind.Operator\n}\n\nexport function isHTMLToken (val: any): val is HTMLToken {\n return getKind(val) === TokenKind.HTML\n}\n\nexport function isOutputToken (val: any): val is OutputToken {\n return getKind(val) === TokenKind.Output\n}\n\nexport function isTagToken (val: any): val is TagToken {\n return getKind(val) === TokenKind.Tag\n}\n\nexport function isQuotedToken (val: any): val is QuotedToken {\n return getKind(val) === TokenKind.Quoted\n}\n\nexport function isLiteralToken (val: any): val is LiteralToken {\n return getKind(val) === TokenKind.Literal\n}\n\nexport function isNumberToken (val: any): val is NumberToken {\n return getKind(val) === TokenKind.Number\n}\n\nexport function isPropertyAccessToken (val: any): val is PropertyAccessToken {\n return getKind(val) === TokenKind.PropertyAccess\n}\n\nexport function isWordToken (val: any): val is IdentifierToken {\n return getKind(val) === TokenKind.Word\n}\n\nexport function isRangeToken (val: any): val is RangeToken {\n return getKind(val) === TokenKind.Range\n}\n\nexport function isValueToken (val: any): val is ValueToken {\n // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range\n return (getKind(val) & 1667) > 0\n}\n\nfunction getKind (val: any) {\n return val ? val.kind : -1\n}\n","export enum TokenKind {\n Number = 1,\n Literal = 2,\n Tag = 4,\n Output = 8,\n HTML = 16,\n Filter = 32,\n Hash = 64,\n PropertyAccess = 128,\n Word = 256,\n Range = 512,\n Quoted = 1024,\n Operator = 2048,\n FilteredValue = 4096,\n Delimited = Tag | Output\n}\n","import { Drop } from '../drop/drop'\n\nexport interface ScopeObject extends Record {\n toLiquid?: () => any;\n}\n\nexport type Scope = ScopeObject | Drop\n\nexport function createScope (from?: ScopeObject): ScopeObject {\n const scope = Object.create(null)\n if (from) Object.assign(scope, from)\n return scope\n}\n","import { getPerformance } from '../util/performance'\nimport { Drop } from '../drop/drop'\nimport { __assign } from 'tslib'\nimport { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'\nimport { createScope, Scope } from './scope'\nimport { hasOwnProperty, isArray, isNil, isUndefined, isString, isFunction, toLiquid, InternalUndefinedVariableError, toValueSync, isObject, Limiter, toValue } from '../util'\n\ntype PropertyKey = string | number;\n\nexport class Context {\n /**\n * insert a Context-level empty scope,\n * for tags like `{% capture %}` `{% assign %}` to operate\n */\n private scopes: Scope[] = [createScope()]\n private registers = {}\n /**\n * user passed in scope\n * `{% increment %}`, `{% decrement %}` changes this scope,\n * whereas `{% capture %}`, `{% assign %}` only hide this scope\n */\n public environments: Scope\n /**\n * global scope used as fallback for missing variables\n */\n public globals: Scope\n public sync: boolean\n public breakCalled = false\n public continueCalled = false\n /**\n * The normalized liquid options object\n */\n public opts: NormalizedFullOptions\n /**\n * Throw when accessing undefined variable?\n */\n public strictVariables: boolean;\n public ownPropertyOnly: boolean;\n public memoryLimit: Limiter;\n public renderLimit: Limiter;\n public constructor (env: object = {}, opts: NormalizedFullOptions = defaultOptions, renderOptions: RenderOptions = {}, { memoryLimit, renderLimit }: { [key: string]: Limiter } = {}) {\n this.sync = !!renderOptions.sync\n this.opts = opts\n this.globals = renderOptions.globals ?? opts.globals\n this.environments = isObject(env) ? env : Object(env)\n this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables\n this.ownPropertyOnly = renderOptions.ownPropertyOnly ?? opts.ownPropertyOnly\n this.memoryLimit = memoryLimit ?? new Limiter('memory alloc', renderOptions.memoryLimit ?? opts.memoryLimit)\n this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit))\n }\n public getRegister (key: string, defaultValue: T = undefined as T): T {\n return (this.registers[key] = this.registers[key] || defaultValue)\n }\n public setRegister (key: string, value: any) {\n return (this.registers[key] = value)\n }\n public saveRegister (...keys: string[]): [string, any][] {\n return keys.map(key => [key, this.getRegister(key)])\n }\n public restoreRegister (keyValues: [string, any][]) {\n return keyValues.forEach(([key, value]) => this.setRegister(key, value))\n }\n public getAll () {\n return [this.globals, this.environments, ...this.scopes]\n .reduce((ctx, val) => __assign(ctx, val), {})\n }\n /**\n * @deprecated use `_get()` or `getSync()` instead\n */\n public get (paths: PropertyKey[]): unknown {\n return this.getSync(paths)\n }\n public getSync (paths: PropertyKey[]): unknown {\n return toValueSync(this._get(paths))\n }\n public * _get (paths: (PropertyKey | Drop)[]): IterableIterator {\n const scope = this.findScope(paths[0] as string) // first prop should always be a string\n return yield this._getFromScope(scope, paths)\n }\n /**\n * @deprecated use `_get()` instead\n */\n public getFromScope (scope: unknown, paths: PropertyKey[] | string): IterableIterator {\n return toValueSync(this._getFromScope(scope, paths))\n }\n public * _getFromScope (scope: unknown, paths: (PropertyKey | Drop)[] | string, strictVariables = this.strictVariables): IterableIterator {\n if (isString(paths)) paths = paths.split('.')\n for (let i = 0; i < paths.length; i++) {\n scope = yield this.readProperty(scope as object, paths[i])\n if (strictVariables && isUndefined(scope)) {\n throw new InternalUndefinedVariableError((paths as string[]).slice(0, i + 1).join!('.'))\n }\n }\n return scope\n }\n public push (ctx: object) {\n return this.scopes.push(ctx)\n }\n public pop () {\n return this.scopes.pop()\n }\n public bottom () {\n return this.scopes[0]\n }\n public spawn (scope = {}) {\n return new Context(scope, this.opts, {\n sync: this.sync,\n globals: this.globals,\n strictVariables: this.strictVariables,\n ownPropertyOnly: this.ownPropertyOnly\n }, {\n renderLimit: this.renderLimit,\n memoryLimit: this.memoryLimit\n })\n }\n private findScope (key: string | number) {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const candidate = this.scopes[i]\n if (key in candidate) return candidate\n }\n if (key in this.environments) return this.environments\n return this.globals\n }\n readProperty (obj: Scope, key: (PropertyKey | Drop)) {\n obj = toLiquid(obj)\n key = toValue(key) as PropertyKey\n if (isNil(obj)) return obj\n if (isArray(obj) && (key as number) < 0) return obj[obj.length + +key]\n const value = readJSProperty(obj, key, this.ownPropertyOnly)\n if (value === undefined && obj instanceof Drop) return obj.liquidMethodMissing(key, this)\n if (isFunction(value)) return value.call(obj)\n if (key === 'size') return readSize(obj)\n else if (key === 'first') return readFirst(obj)\n else if (key === 'last') return readLast(obj)\n return value\n }\n}\n\nexport function readJSProperty (obj: Scope, key: PropertyKey, ownPropertyOnly: boolean) {\n if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) return undefined\n return obj[key]\n}\n\nfunction readFirst (obj: Scope) {\n if (isArray(obj)) return obj[0]\n return obj['first']\n}\n\nfunction readLast (obj: Scope) {\n if (isArray(obj)) return obj[obj.length - 1]\n return obj['last']\n}\n\nfunction readSize (obj: Scope) {\n if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) return obj['size']\n if (isArray(obj) || isString(obj)) return obj.length\n if (typeof obj === 'object') return Object.keys(obj).length\n}\n","export enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n","import { toNumber, argumentsToNumber } from '../util/underscore'\n\nexport const abs = argumentsToNumber(Math.abs)\nexport const at_least = argumentsToNumber(Math.max)\nexport const at_most = argumentsToNumber(Math.min)\nexport const ceil = argumentsToNumber(Math.ceil)\nexport const divided_by = argumentsToNumber((dividend: number, divisor: number, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor)\nexport const floor = argumentsToNumber(Math.floor)\nexport const minus = argumentsToNumber((v: number, arg: number) => v - arg)\nexport const plus = argumentsToNumber((lhs: number, rhs: number) => lhs + rhs)\nexport const modulo = argumentsToNumber((v: number, arg: number) => v % arg)\nexport const times = argumentsToNumber((v: number, arg: number) => v * arg)\n\nexport function round (v: number, arg = 0) {\n v = toNumber(v)\n arg = toNumber(arg)\n const amp = Math.pow(10, arg)\n const scaled = v * amp\n // Round half away from zero\n return Math.sign(v) * Math.round(Math.abs(scaled)) / amp\n}\n","import { stringify } from '../util/underscore'\n\nexport const url_decode = (x: string) => decodeURIComponent(stringify(x)).replace(/\\+/g, ' ')\nexport const url_encode = (x: string) => encodeURIComponent(stringify(x)).replace(/%20/g, '+')\nexport const cgi_escape = (x: string) => encodeURIComponent(stringify(x))\n .replace(/%20/g, '+')\n .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase())\nexport const uri_escape = (x: string) => encodeURI(stringify(x))\n .replace(/%5B/g, '[')\n .replace(/%5D/g, ']')\n\nconst rSlugifyDefault = /[^\\p{M}\\p{L}\\p{Nd}]+/ug\nconst rSlugifyReplacers = {\n 'raw': /\\s+/g,\n 'default': rSlugifyDefault,\n 'pretty': /[^\\p{M}\\p{L}\\p{Nd}._~!$&'()+,;=@]+/ug,\n 'ascii': /[^A-Za-z0-9]+/g,\n 'latin': rSlugifyDefault,\n 'none': null\n}\n\nexport function slugify (str: string, mode: keyof typeof rSlugifyReplacers = 'default', cased = false): string {\n str = stringify(str)\n\n const replacer = rSlugifyReplacers[mode]\n if (replacer) {\n if (mode === 'latin') str = removeAccents(str)\n str = str.replace(replacer, '-').replace(/^-|-$/g, '')\n }\n\n return cased ? str : str.toLowerCase()\n}\n\nfunction removeAccents (str: string): string {\n return str.replace(/[àáâãäå]/g, 'a')\n .replace(/[æ]/g, 'ae')\n .replace(/[ç]/g, 'c')\n .replace(/[èéêë]/g, 'e')\n .replace(/[ìíîï]/g, 'i')\n .replace(/[ð]/g, 'd')\n .replace(/[ñ]/g, 'n')\n .replace(/[òóôõöø]/g, 'o')\n .replace(/[ùúûü]/g, 'u')\n .replace(/[ýÿ]/g, 'y')\n .replace(/[ß]/g, 'ss')\n .replace(/[œ]/g, 'oe')\n .replace(/[þ]/g, 'th')\n .replace(/[ẞ]/g, 'SS')\n .replace(/[Œ]/g, 'OE')\n .replace(/[Þ]/g, 'TH')\n}\n","import { toArray, argumentsToValue, toValue, stringify, caseInsensitiveCompare, orderedCompare, isArray, isNil, last as arrayLast, isArrayLike, toEnumerable } from '../util'\nimport { arrayIncludes, equals, evalToken, isTruthy } from '../render'\nimport { Value, FilterImpl } from '../template'\nimport { Tokenizer } from '../parser'\nimport type { Scope } from '../context'\nimport { EmptyDrop } from '../drop'\n\nexport const join = argumentsToValue(function (this: FilterImpl, v: any[], arg: string) {\n const array = toArray(v)\n const sep = isNil(arg) ? ' ' : stringify(arg)\n const complexity = array.length * (1 + sep.length)\n this.context.memoryLimit.use(complexity)\n return array.join(sep)\n})\nexport const last = argumentsToValue((v: any) => isArrayLike(v) ? arrayLast(v) : '')\nexport const first = argumentsToValue((v: any) => isArrayLike(v) ? v[0] : '')\nexport const reverse = argumentsToValue(function (this: FilterImpl, v: any[]) {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n return [...array].reverse()\n})\n\nfunction * sortBy (this: FilterImpl, arr: T[], property: string | undefined, comparator: (a: unknown, b: unknown) => number): IterableIterator {\n const values: [T, unknown][] = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n values.push([\n item,\n property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item\n ])\n }\n return values.sort((lhs, rhs) => comparator(lhs[1], rhs[1])).map(tuple => tuple[0])\n}\n\nexport function * sort (this: FilterImpl, arr: T[], property?: string): IterableIterator {\n return yield * sortBy.call(this, arr, property, orderedCompare)\n}\n\nexport function * sort_natural (this: FilterImpl, arr: T[], property?: string): IterableIterator {\n return yield * sortBy.call(this, arr, property, caseInsensitiveCompare)\n}\n\nexport const size = (v: string | any[]) => (v && v.length) || 0\n\nexport function * map (this: FilterImpl, arr: Scope[], property: string): IterableIterator {\n const results = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n results.push(yield this.context._getFromScope(item, stringify(property), false))\n }\n return results\n}\n\nexport function * sum (this: FilterImpl, arr: Scope[], property?: string): IterableIterator {\n let sum = 0\n const array = toArray(arr)\n for (const item of array) {\n const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item)\n sum += Number.isNaN(data) ? 0 : data\n }\n return sum\n}\n\nexport function compact (this: FilterImpl, arr: T[]) {\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n return array.filter(x => !isNil(toValue(x)))\n}\n\nexport function concat (this: FilterImpl, v: T1[], arg: T2[] = []): (T1 | T2)[] {\n const lhs = toArray(v)\n const rhs = toArray(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs.concat(rhs)\n}\n\nexport function push (this: FilterImpl, v: T[], arg: T): T[] {\n return concat.call(this, v, [arg]) as T[]\n}\n\nexport function unshift (this: FilterImpl, v: T[], arg: T): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.unshift(arg)\n return clone\n}\n\nexport function pop (v: T[]): T[] {\n const clone = [...toArray(v)]\n clone.pop()\n return clone\n}\n\nexport function shift (this: FilterImpl, v: T[]): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.shift()\n return clone\n}\n\nexport function slice (this: FilterImpl, v: T[] | string, begin: number, length = 1): T[] | string {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n begin = begin < 0 ? v.length + begin : begin\n this.context.memoryLimit.use(length)\n return v.slice(begin, begin + length)\n}\n\nfunction expectedMatcher (this: FilterImpl, expected: any): (v: any) => boolean {\n if (this.context.opts.jekyllWhere) {\n return (v: any) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected))\n } else if (expected === undefined) {\n return (v: any) => isTruthy(v, this.context)\n } else {\n return (v: any) => equals(v, expected)\n }\n}\n\nfunction * filter (this: FilterImpl, include: boolean, arr: T[], property: string, expected: any): IterableIterator {\n const values: unknown[] = []\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n for (const item of arr) {\n values.push(yield evalToken(token, this.context.spawn(item)))\n }\n const matcher = expectedMatcher.call(this, expected)\n return arr.filter((_, i) => matcher(values[i]) === include)\n}\n\nfunction * filter_exp (this: FilterImpl, include: boolean, arr: T[], itemName: string, exp: string): IterableIterator {\n const filtered: unknown[] = []\n const keyTemplate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n this.context.push({ [itemName]: item })\n const value = yield keyTemplate.value(this.context)\n this.context.pop()\n if (value === include) filtered.push(item)\n }\n return filtered\n}\n\nexport function * where (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n return yield * filter.call(this, true, arr, property, expected)\n}\n\nexport function * reject (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n return yield * filter.call(this, false, arr, property, expected)\n}\n\nexport function * where_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n return yield * filter_exp.call(this, true, arr, itemName, exp)\n}\n\nexport function * reject_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n return yield * filter_exp.call(this, false, arr, itemName, exp)\n}\n\nexport function * group_by (this: FilterImpl, arr: T[], property: string): IterableIterator {\n const map = new Map()\n arr = toEnumerable(arr)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n const key = yield evalToken(token, this.context.spawn(item))\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nexport function * group_by_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const map = new Map()\n const keyTemplate = new Value(stringify(exp), this.liquid)\n arr = toEnumerable(arr)\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n this.context.push({ [itemName]: item })\n const key = yield keyTemplate.value(this.context)\n this.context.pop()\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nfunction * search (this: FilterImpl, arr: T[], property: string, expected: string): IterableIterator {\n const token = new Tokenizer(stringify(property)).readScopeValue()\n const array = toArray(arr)\n const matcher = expectedMatcher.call(this, expected)\n for (let index = 0; index < array.length; index++) {\n const value = yield evalToken(token, this.context.spawn(array[index]))\n if (matcher(value)) return [index, array[index]]\n }\n}\n\nfunction * search_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const predicate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n for (let index = 0; index < array.length; index++) {\n this.context.push({ [itemName]: array[index] })\n const value = yield predicate.value(this.context)\n this.context.pop()\n if (value) return [index, array[index]]\n }\n}\n\nexport function * has (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n const result = yield * search.call(this, arr, property, expected)\n return !!result\n}\n\nexport function * has_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return !!result\n}\n\nexport function * find_index (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[0] : undefined\n}\n\nexport function * find_index_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[0] : undefined\n}\n\nexport function * find (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[1] : undefined\n}\n\nexport function * find_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[1] : undefined\n}\n\nexport function uniq (this: FilterImpl, arr: T[]): T[] {\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n return [...new Set(arr)]\n}\n\nexport function sample (this: FilterImpl, v: T[] | string, count = 1): T | string | (T | string)[] {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n this.context.memoryLimit.use(count)\n const shuffled = [...v].sort(() => Math.random() - 0.5)\n if (count === 1) return shuffled[0]\n return shuffled.slice(0, count)\n}\n","import { toValue, stringify, isString, isNumber, LiquidDate, strftime, isNil } from '../util'\nimport { FilterImpl } from '../template'\nimport { NormalizedFullOptions } from '../liquid-options'\n\nexport function date (this: FilterImpl, v: string | Date, format?: string, timezoneOffset?: number | string) {\n const size = ((v as string)?.length ?? 0) + ((timezoneOffset as string)?.length ?? 0)\n this.context.memoryLimit.use(size)\n const date = parseDate(v, this.context.opts, timezoneOffset)\n if (!date) return v\n format = toValue(format)\n format = isNil(format) ? this.context.opts.dateFormat : stringify(format)\n this.context.memoryLimit.use(format.length)\n return strftime(date, format, this.context.memoryLimit)\n}\n\nexport function date_to_xmlschema (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z')\n}\n\nexport function date_to_rfc822 (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z')\n}\n\nexport function date_to_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%b', type, style)\n}\n\nexport function date_to_long_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%B', type, style)\n}\n\nfunction stringify_date (this: FilterImpl, v: string | Date, month_type: string, type?: string, style?: string) {\n const date = parseDate(v, this.context.opts)\n if (!date) return v\n const ml = this.context.memoryLimit\n if (type === 'ordinal') {\n const d = date.getDate()\n return style === 'US'\n ? strftime(date, `${month_type} ${d}%q, %Y`, ml)\n : strftime(date, `${d}%q ${month_type} %Y`, ml)\n }\n return strftime(date, `%d ${month_type} %Y`, ml)\n}\n\nfunction parseDate (v: string | Date, opts: NormalizedFullOptions, timezoneOffset?: number | string): LiquidDate | undefined {\n let date: LiquidDate | undefined\n const defaultTimezoneOffset = timezoneOffset ?? opts.timezoneOffset\n const locale = opts.locale\n v = toValue(v)\n if (isNil(v)) {\n return undefined\n } else if (v === 'now' || v === 'today') {\n date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset)\n } else if (isNumber(v)) {\n date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset)\n } else if (isString(v)) {\n if (/^\\d+$/.test(v)) {\n date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset)\n } else if (opts.preserveTimezones && timezoneOffset === undefined) {\n date = LiquidDate.createDateFixedToTimezone(v, locale)\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n return date.valid() ? date : undefined\n}\n","/**\n * String related filters\n *\n * * prefer stringify() to String() since `undefined`, `null` should eval ''\n */\n\n// Han (Chinese) characters: \\u4E00-\\u9FFF\n// Additional Han characters: \\uF900-\\uFAFF (CJK Compatibility Ideographs)\n// Additional Han characters: \\u3400-\\u4DBF (CJK Unified Ideographs Extension A)\n// Katakana (Japanese): \\u30A0-\\u30FF\n// Hiragana (Japanese): \\u3040-\\u309F\n// Hangul (Korean): \\uAC00-\\uD7AF\nimport { FilterImpl } from '../template'\nimport { assert, stringify } from '../util'\n\nconst rCJKWord = /[\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/gu\n\n// Word boundary followed by word characters (for detecting words)\nconst rNonCJKWord = /[^\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF\\s]+/gu\n\nexport function append (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'append expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs + rhs\n}\n\nexport function prepend (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'prepend expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return rhs + lhs\n}\n\nexport function lstrip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = stringify(chars)\n this.context.memoryLimit.use(chars.length)\n for (let i = 0, set = new Set(chars); i < str.length; i++) {\n if (!set.has(str[i])) return str.slice(i)\n }\n return ''\n }\n return str.trimStart()\n}\n\nexport function downcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.toLowerCase()\n}\n\nexport function upcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return stringify(str).toUpperCase()\n}\n\nexport function remove (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n arg = stringify(arg)\n this.context.memoryLimit.use(str.length + arg.length)\n return str.split(arg).join('')\n}\n\nexport function remove_first (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n l = stringify(l)\n this.context.memoryLimit.use(str.length + l.length)\n return str.replace(l, '')\n}\n\nexport function remove_last (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n const pattern = stringify(l)\n this.context.memoryLimit.use(str.length + pattern.length)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n return str.substring(0, index) + str.substring(index + pattern.length)\n}\n\nexport function rstrip (this: FilterImpl, str: string, chars?: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = stringify(chars)\n this.context.memoryLimit.use(chars.length)\n for (let i = str.length - 1, set = new Set(chars); i >= 0; i--) {\n if (!set.has(str[i])) return str.slice(0, i + 1)\n }\n return ''\n }\n return str.trimEnd()\n}\n\nexport function split (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const arr = str.split(stringify(arg))\n // align to ruby split, which is the behavior of shopify/liquid\n // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split\n while (arr.length && arr[arr.length - 1] === '') arr.pop()\n return arr\n}\n\nexport function strip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n const set = new Set(stringify(chars))\n this.context.memoryLimit.use(set.size)\n let i = 0\n let j = str.length - 1\n while (set.has(str[i])) i++\n while (j >= i && set.has(str[j])) j--\n return str.slice(i, j + 1)\n }\n return str.trim()\n}\n\nexport function strip_newlines (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '')\n}\n\nexport function capitalize (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport function replace (this: FilterImpl, v: string, pattern: string, replacement: string) {\n const str = stringify(v)\n pattern = stringify(pattern)\n replacement = stringify(replacement)\n const parts = str.split(pattern)\n const outputSize = str.length + (parts.length - 1) * (replacement.length - pattern.length)\n this.context.memoryLimit.use(outputSize)\n return parts.join(replacement)\n}\n\nexport function replace_first (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n arg1 = stringify(arg1)\n arg2 = stringify(arg2)\n this.context.memoryLimit.use(str.length + arg1.length + arg2.length)\n return str.replace(arg1, () => arg2)\n}\n\nexport function replace_last (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n const pattern = stringify(arg1)\n const replacement = stringify(arg2)\n this.context.memoryLimit.use(str.length + pattern.length + replacement.length)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n return str.substring(0, index) + replacement + str.substring(index + pattern.length)\n}\n\nexport function truncate (this: FilterImpl, v: string, l = 50, o = '...') {\n const str = stringify(v)\n o = stringify(o)\n this.context.memoryLimit.use(str.length + o.length)\n if (str.length <= l) return v\n return str.substring(0, l - o.length) + o\n}\n\nexport function truncatewords (this: FilterImpl, v: string, words = 15, o = '...') {\n const str = stringify(v)\n o = stringify(o)\n this.context.memoryLimit.use(str.length + o.length)\n const arr = str.split(/\\s+/)\n if (words <= 0) words = 1\n let ret = arr.slice(0, words).join(' ')\n if (arr.length >= words) ret += o\n return ret\n}\n\nexport function normalize_whitespace (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\s+/g, ' ')\n}\n\nexport function number_of_words (this: FilterImpl, input: string, mode?: 'cjk' | 'auto') {\n const str = stringify(input)\n this.context.memoryLimit.use(str.length)\n input = str.trim()\n if (!input) return 0\n switch (mode) {\n case 'cjk':\n // Count CJK characters and words\n return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length\n case 'auto':\n // Count CJK characters, if none, count words\n return rCJKWord.test(input)\n ? input.match(rCJKWord)!.length + (input.match(rNonCJKWord) || []).length\n : input.split(/\\s+/).length\n default:\n // Count words only\n return input.split(/\\s+/).length\n }\n}\n\nexport function array_to_sentence_string (this: FilterImpl, array: unknown[], connector = 'and') {\n connector = stringify(connector)\n this.context.memoryLimit.use(array.length + connector.length)\n switch (array.length) {\n case 0:\n return ''\n case 1:\n return array[0]\n case 2:\n return `${array[0]} ${connector} ${array[1]}`\n default:\n return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`\n }\n}\n","/**\n * Base64 related filters\n *\n * Implements base64_encode and base64_decode filters for Shopify compatibility\n */\n\nimport { FilterImpl } from '../template'\nimport { stringify } from '../util'\nimport { base64Encode, base64Decode } from './base64-impl'\n\nexport function base64_encode (this: FilterImpl, value: string | Buffer): string {\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n this.context.memoryLimit.use(value.byteLength)\n return value.toString('base64')\n }\n const str = stringify(value)\n this.context.memoryLimit.use(str.length)\n return base64Encode(str)\n}\n\nexport function base64_decode (this: FilterImpl, value: string): string {\n const str = stringify(value)\n this.context.memoryLimit.use(str.length)\n return base64Decode(str)\n}\n","\nexport function base64Encode (str: string): string {\n return btoa(String.fromCharCode(...new TextEncoder().encode(str)))\n}\n\nexport function base64Decode (str: string): string {\n return new TextDecoder().decode(\n Uint8Array.from(atob(str), c => c.charCodeAt(0))\n )\n}\n","function bufferToHex (buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let hex = ''\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0')\n }\n return hex\n}\n\nexport async function sha256 (str: string): Promise {\n const data = new TextEncoder().encode(str)\n const digest = await crypto.subtle.digest('SHA-256', data)\n return bufferToHex(digest)\n}\n\nexport async function hmacSha256 (str: string, key: string): Promise {\n const encoder = new TextEncoder()\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(key),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(str))\n return bufferToHex(signature)\n}\n","/**\n * Crypto related filters\n *\n * Implements sha256 and hmac_sha256 filters for Shopify compatibility\n */\n\nimport { FilterImpl } from '../template'\nimport { stringify } from '../util'\nimport { sha256 as sha256Impl, hmacSha256 as hmacSha256Impl } from './crypto-impl'\n\nexport function sha256 (this: FilterImpl, value: unknown): string | Promise {\n const str = stringify(value)\n this.context.memoryLimit.use(str.length)\n return sha256Impl(str)\n}\n\nexport function hmac_sha256 (this: FilterImpl, value: unknown, key: unknown): string | Promise {\n const str = stringify(value)\n const keyStr = stringify(key)\n this.context.memoryLimit.use(str.length + keyStr.length)\n return hmacSha256Impl(str, keyStr)\n}\n","import * as htmlFilters from './html'\nimport * as mathFilters from './math'\nimport * as urlFilters from './url'\nimport * as arrayFilters from './array'\nimport * as dateFilters from './date'\nimport * as stringFilters from './string'\nimport * as base64Filters from './base64'\nimport * as cryptoFilters from './crypto'\nimport misc from './misc'\nimport { FilterImplOptions } from '../template'\n\nexport const filters: Record = {\n ...htmlFilters,\n ...mathFilters,\n ...urlFilters,\n ...arrayFilters,\n ...dateFilters,\n ...stringFilters,\n ...base64Filters,\n ...cryptoFilters,\n ...misc\n}\n","import { Value, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private key: string\n private value: Value\n private identifier: IdentifierToken\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.key = this.identifier.content\n this.tokenizer.assert(this.key, 'expected variable name')\n\n this.tokenizer.skipBlank()\n this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected \"=\"')\n\n this.tokenizer.advance()\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n * render (ctx: Context): Generator {\n ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { Hash, ValueToken, Liquid, Tag, evalToken, Emitter, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { assertEmpty, isValueToken, toEnumerable } from '../util'\nimport { createScope } from '../context/scope'\nimport { ForloopDrop } from '../drop/forloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nconst MODIFIERS = ['offset', 'limit', 'reversed']\n\ntype valueOf = T[keyof T]\n\nexport default class extends Tag {\n variable: string\n collection: ValueToken\n hash: Hash\n templates: Template[]\n elseTemplates: Template[]\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n const inStr = this.tokenizer.readIdentifier()\n const collection = this.tokenizer.readValue()\n if (!variable.size() || inStr.content !== 'in' || !collection) {\n throw new Error(`illegal tag: ${token.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collection\n this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates })\n .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${token.getText()} not closed`) })\n\n stream.start()\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n\n if (!collection.length) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n return\n }\n\n const continueKey = 'continue-' + this.variable + '-' + this.collection.getText()\n ctx.push(createScope({ continue: ctx.getRegister(continueKey, {}) }))\n const hash = yield this.hash.render(ctx)\n ctx.pop()\n\n const modifiers = this.liquid.options.orderedFilterParameters\n ? Object.keys(hash).filter(x => MODIFIERS.includes(x))\n : MODIFIERS.filter(x => hash[x] !== undefined)\n\n collection = modifiers.reduce((collection, modifier: valueOf) => {\n if (modifier === 'offset') return offset(collection, hash['offset'])\n if (modifier === 'limit') return limit(collection, hash['limit'])\n return reversed(collection)\n }, collection)\n\n ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length)\n const scope = createScope({ forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) })\n ctx.push(scope)\n for (const item of collection) {\n scope[this.variable] = item\n ctx.continueCalled = ctx.breakCalled = false\n yield r.renderTemplates(this.templates, ctx, emitter)\n if (ctx.breakCalled) break\n scope.forloop.next()\n }\n ctx.continueCalled = ctx.breakCalled = false\n ctx.pop()\n }\n\n public * children (): Generator {\n const templates = this.templates.slice()\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): Iterable {\n return [this.variable, 'forloop']\n }\n}\n\nfunction reversed (arr: Array) {\n return [...arr].reverse()\n}\n\nfunction offset (arr: Array, count: number) {\n return arr.slice(count)\n}\n\nfunction limit (arr: Array, count: number) {\n return arr.slice(0, count)\n}\n","import { Liquid, Tag, Template, Context, TagToken, TopLevelToken } from '..'\nimport { Parser } from '../parser'\nimport { IdentifierToken, QuotedToken } from '../tokens'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n identifier: IdentifierToken | QuotedToken\n variable: string\n templates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.identifier = this.readVariable()\n this.variable = this.identifier.content\n\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcapture') return\n this.templates.push(parser.parseToken(token, remainTokens))\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n\n private readVariable (): IdentifierToken | QuotedToken {\n let ident: IdentifierToken | QuotedToken | undefined = this.tokenizer.readIdentifier()\n if (ident.content) return ident\n ident = this.tokenizer.readQuoted()\n if (ident) return ident\n throw this.tokenizer.error('invalid capture name')\n }\n\n * render (ctx: Context): Generator {\n const r = this.liquid.renderer\n const html = yield r.renderTemplates(this.templates, ctx)\n ctx.bottom()[this.variable] = html\n }\n\n public * children (): Generator {\n return this.templates\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { ValueToken, Liquid, toValue, evalToken, Value, Emitter, TagToken, TopLevelToken, Context, Template, Tag, ParseStream } from '..'\nimport { Parser } from '../parser'\nimport { equals } from '../render'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n value: Value\n branches: { values: ValueToken[], templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n this.elseTemplates = []\n\n let p: Template[] = []\n let elseCount = 0\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n if (elseCount > 0) {\n return\n }\n\n p = []\n\n const values: ValueToken[] = []\n while (!token.tokenizer.end()) {\n values.push(token.tokenizer.readValueOrThrow())\n token.tokenizer.skipBlank()\n if (token.tokenizer.peek() === ',') {\n token.tokenizer.readTo(',')\n } else {\n token.tokenizer.readTo('or')\n }\n }\n this.branches.push({\n values,\n templates: p\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf))\n let branchHit = false\n for (const branch of this.branches) {\n for (const valueToken of branch.values) {\n const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf)\n if (equals(target, value)) {\n yield r.renderTemplates(branch.templates, ctx, emitter)\n branchHit = true\n break\n }\n }\n }\n if (!branchHit) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n }\n\n public * arguments (): Arguments {\n yield this.value\n yield * this.branches.flatMap(b => b.values)\n }\n\n public * children (): Generator {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n}\n","import { Liquid, TopLevelToken, TagToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcomment') return\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {}\n}\n","import { __assign } from 'tslib'\nimport { ForloopDrop } from '../drop'\nimport { isString, isValueToken, toEnumerable } from '../util'\nimport { TopLevelToken, assert, Liquid, Token, Template, evalQuotedToken, TypeGuards, Tokenizer, evalToken, Hash, Emitter, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\n\nexport type ParsedFileName = Template[] | Token | string | undefined\n\nexport default class extends Tag {\n private file: ParsedFileName\n private currentFile?: string\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokenizer = this.tokenizer\n this.file = parseFilePath(tokenizer, this.liquid, parser)\n this.currentFile = token.file\n while (!tokenizer.end()) {\n tokenizer.skipBlank()\n const begin = tokenizer.p\n const keyword = tokenizer.readIdentifier()\n if (keyword.content === 'with' || keyword.content === 'for') {\n tokenizer.skipBlank()\n // can be normal key/value pair, like \"with: true\"\n if (tokenizer.peek() !== ':') {\n const value = tokenizer.readValue()\n // can be normal key, like \"with,\"\n if (value) {\n const beforeAs = tokenizer.p\n const asStr = tokenizer.readIdentifier()\n let alias\n if (asStr.content === 'as') alias = tokenizer.readIdentifier()\n else tokenizer.p = beforeAs\n\n this[keyword.content] = { value, alias: alias && alias.content }\n tokenizer.skipBlank()\n if (tokenizer.peek() === ',') tokenizer.advance()\n continue // matched!\n }\n }\n }\n /**\n * restore cursor if with/for not matched\n */\n tokenizer.p = begin\n break\n }\n this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const { liquid, hash } = this\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const childCtx = ctx.spawn()\n const scope = childCtx.bottom()\n __assign(scope, yield hash.render(ctx))\n if (this['with']) {\n const { value, alias } = this['with']\n scope[alias || filepath] = yield evalToken(value, ctx)\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n const collection = toEnumerable(yield evalToken(value, ctx))\n scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias)\n for (const item of collection) {\n scope[alias] = item\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n scope['forloop'].next()\n }\n } else {\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n }\n }\n\n public * children (partials: boolean, sync: boolean): Generator {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n const names: Array = Object.keys(this.hash.hash)\n\n if (this['with']) {\n const { value, alias } = this['with']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n return { name: this['file'], isolated: true, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (this['with']) {\n const { value } = this['with']\n if (isValueToken(value)) {\n yield value\n }\n }\n\n if (this['for']) {\n const { value } = this['for']\n if (isValueToken(value)) {\n yield value\n }\n }\n }\n}\n\n/**\n * @return null for \"none\",\n * @return Template[] for quoted with tags and/or filters\n * @return Token for expression (not quoted)\n * @throws TypeError if cannot read next token\n */\nexport function parseFilePath (tokenizer: Tokenizer, liquid: Liquid, parser: Parser): ParsedFileName {\n if (liquid.options.dynamicPartials) {\n const file = tokenizer.readValue()\n tokenizer.assert(file, 'illegal file path')\n if (file!.getText() === 'none') return\n if (TypeGuards.isQuotedToken(file)) {\n // for filenames like \"files/{{file}}\", eval as liquid template\n const templates = parser.parse(evalQuotedToken(file))\n return optimize(templates)\n }\n return file\n }\n const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]\n const templates = optimize(parser.parseTokens(tokens))\n return templates === 'none' ? undefined : templates\n}\n\nfunction optimize (templates: Template[]): string | Template[] {\n // for filenames like \"files/file.liquid\", extract the string directly\n if (templates.length === 1 && TypeGuards.isHTMLToken(templates[0].token)) return templates[0].token.getContent()\n return templates\n}\n\nexport function * renderFilePath (file: ParsedFileName, ctx: Context, liquid: Liquid): IterableIterator {\n if (typeof file === 'string') return file\n if (Array.isArray(file)) return liquid.renderer.renderTemplates(file, ctx)\n return yield evalToken(file, ctx)\n}\n","import { Template, ValueToken, TopLevelToken, Liquid, Tag, assert, evalToken, Hash, Emitter, TagToken, Context } from '..'\nimport { BlockMode, createScope, Scope } from '../context'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\nimport { parseFilePath, renderFilePath } from './render'\n\nexport default class extends Tag {\n private withVar?: ValueToken\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const { tokenizer } = token\n this['file'] = parseFilePath(tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n\n const begin = tokenizer.p\n const withStr = tokenizer.readIdentifier()\n if (withStr.content === 'with') {\n tokenizer.skipBlank()\n if (tokenizer.peek() !== ':') {\n this.withVar = tokenizer.readValue()\n } else tokenizer.p = begin\n } else tokenizer.p = begin\n\n this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const { liquid, hash, withVar } = this\n const { renderer } = liquid\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const saved = ctx.saveRegister('blocks', 'blockMode')\n ctx.setRegister('blocks', {})\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n const scope = createScope((yield hash.render(ctx)) as Scope)\n if (withVar) scope[filepath] = yield evalToken(withVar, ctx)\n const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n ctx.push(ctx.opts.jekyllInclude ? createScope({ include: scope }) : scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n ctx.restoreRegister(saved)\n }\n\n public * children (partials: boolean, sync: boolean): Generator {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n let names: Array\n\n if (this.liquid.options.jekyllInclude) {\n names = ['include']\n } else {\n names = Object.keys(this.hash.hash)\n if (this.withVar) {\n names.push([this['file'], this.withVar])\n }\n }\n\n return { name: this['file'], isolated: false, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n yield * Object.values(this.hash.hash).filter(isValueToken)\n\n if (isValueToken(this['file'])) {\n yield this['file']\n }\n\n if (isValueToken(this.withVar)) {\n yield this.withVar\n }\n }\n}\n","import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\nimport { isNumber, stringify } from '../util'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n emitter.write(stringify(--scope[this.variable]))\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { TopLevelToken, Liquid, ValueToken, evalToken, Emitter, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private candidates: ValueToken[] = []\n private group?: ValueToken\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n const group = this.tokenizer.readValue()\n this.tokenizer.skipBlank()\n\n if (group) {\n if (this.tokenizer.peek() === ':') {\n this.group = group\n this.tokenizer.advance()\n } else this.candidates.push(group)\n }\n\n while (!this.tokenizer.end()) {\n const value = this.tokenizer.readValue()\n if (value) this.candidates.push(value)\n this.tokenizer.readTo(',')\n }\n this.tokenizer.assert(this.candidates.length, () => `empty candidates: \"${token.getText()}\"`)\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const group = (yield evalToken(this.group, ctx)) as ValueToken\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = ctx.getRegister('cycle', {} as Record)\n let idx = groups[fingerprint]\n\n if (idx === undefined) {\n idx = groups[fingerprint] = 0\n }\n\n const candidate = this.candidates[idx]\n idx = (idx + 1) % this.candidates.length\n groups[fingerprint] = idx\n return yield evalToken(candidate, ctx)\n }\n\n public * arguments (): Arguments {\n yield * this.candidates\n\n if (this.group) {\n yield this.group\n }\n }\n}\n","import { Liquid, Tag, Value, Emitter, isTruthy, TagToken, TopLevelToken, Context, Template } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\nimport { assert, assertEmpty } from '../util'\n\nexport default class extends Tag {\n branches: { value: Value, templates: Template[] }[] = []\n elseTemplates: Template[] | undefined\n\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n assert(!this.elseTemplates, 'unexpected elsif after else')\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n })\n })\n .on('tag:else', tag => {\n assertEmpty(tag.args)\n assert(!this.elseTemplates, 'duplicated else')\n p = this.elseTemplates = []\n })\n .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n\n for (const { value, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (isTruthy(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n yield r.renderTemplates(this.elseTemplates || [], ctx, emitter)\n }\n\n public * children (): Generator {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { isNumber, stringify } from '../util'\nimport { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n const val = scope[this.variable]\n scope[this.variable]++\n emitter.write(stringify(val))\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { Scope, Template, Liquid, Tag, assert, Emitter, Hash, TagToken, TopLevelToken, Context } from '..'\nimport { BlockMode, createScope } from '../context'\nimport { parseFilePath, renderFilePath, ParsedFileName } from './render'\nimport { BlankDrop } from '../drop'\nimport { Parser } from '../parser'\nimport { Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\n\nexport default class extends Tag {\n args: Hash\n templates: Template[]\n file?: ParsedFileName\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n this.file = parseFilePath(this.tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = parser.parseTokens(remainTokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const { liquid, args, file } = this\n const { renderer } = liquid\n if (file === undefined) {\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n yield renderer.renderTemplates(this.templates, ctx, emitter)\n return\n }\n const filepath = (yield renderFilePath(this.file, ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n\n // render remaining contents and store rendered results\n ctx.setRegister('blockMode', BlockMode.STORE)\n const html = yield renderer.renderTemplates(this.templates, ctx)\n const blocks = ctx.getRegister('blocks', {} as Record)\n\n // set whole content to anonymous block if anonymous doesn't specified\n if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n\n // render the layout file use stored blocks\n ctx.push(createScope((yield args.render(ctx)) as Scope))\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n\n public * children (partials: boolean): Generator {\n const templates = this.templates.slice()\n\n if (partials && isString(this.file)) {\n templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])) as Template[])\n }\n\n return templates\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (isValueToken(this.file)) {\n yield this.file\n }\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this.file)) {\n return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }\n }\n }\n}\n","import { BlockMode, createScope } from '../context'\nimport { isTagToken } from '../util'\nimport { BlockDrop } from '../drop'\nimport { Liquid, TagToken, TopLevelToken, Template, Context, Emitter, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n block: string\n templates: Template[] = []\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endblock') return\n const template = parser.parseToken(token, remainTokens)\n this.templates.push(template)\n }\n throw new Error(`tag ${token.getText()} not closed`)\n }\n\n * render (ctx: Context, emitter: Emitter) {\n const blockRender = this.getBlockRender(ctx)\n if (ctx.getRegister('blockMode') === BlockMode.STORE) {\n ctx.getRegister('blocks', {} as Record)[this.block] = blockRender\n } else {\n yield blockRender(new BlockDrop(), emitter)\n }\n }\n\n private getBlockRender (ctx: Context) {\n const self = this as Tag\n const { liquid, templates } = this\n const renderChild = ctx.getRegister('blocks', {} as Record)[this.block]\n const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {\n const stack: Tag[] = ctx.getRegister('blockStack', [])\n if (stack.includes(self)) throw new Error('block tag cannot be nested')\n\n stack.push(self)\n ctx.push(createScope({ block: superBlock }))\n yield liquid.renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n stack.pop()\n }\n return renderChild\n ? (superBlock: BlockDrop, emitter: Emitter) => renderChild(\n new BlockDrop(\n (emitter: Emitter) => renderCurrent(superBlock, emitter)\n ),\n emitter)\n : renderCurrent\n }\n\n public * children (): Generator {\n return this.templates\n }\n\n public blockScope (): Iterable {\n return ['block']\n }\n}\n","import { Liquid, TagToken, TopLevelToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n private tokens: TopLevelToken[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endraw') return\n this.tokens.push(token)\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {\n return this.tokens.map((token: TopLevelToken) => token.getText()).join('')\n }\n}\n","import { ForloopDrop } from './forloop-drop'\n\nexport class TablerowloopDrop extends ForloopDrop {\n private cols: number\n public constructor (length: number, cols: number, collection: string, variable: string) {\n super(length, collection, variable)\n this.length = length\n this.cols = cols\n }\n public row () {\n return Math.floor(this.i / this.cols) + 1\n }\n public col0 () {\n return (this.i % this.cols)\n }\n public col () {\n return this.col0() + 1\n }\n public col_first () { // eslint-disable-line\n return this.col0() === 0\n }\n public col_last () { // eslint-disable-line\n return this.col() === this.cols\n }\n}\n","import { isValueToken, toEnumerable } from '../util'\nimport { createScope } from '../context/scope'\nimport { ValueToken, Liquid, Tag, evalToken, Emitter, Hash, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { TablerowloopDrop } from '../drop/tablerowloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n variable: string\n args: Hash\n templates: Template[]\n collection: ValueToken\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n this.tokenizer.skipBlank()\n\n const predicate = this.tokenizer.readIdentifier()\n const collectionToken = this.tokenizer.readValue()\n if (predicate.content !== 'in' || !collectionToken) {\n throw new Error(`illegal tag: ${tagToken.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collectionToken\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n const args = (yield this.args.render(ctx)) as Record\n const offset = args.offset || 0\n const limit = (args.limit === undefined) ? collection.length : args.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = args.cols || collection.length\n\n const r = this.liquid.renderer\n const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable)\n const scope = createScope({ tablerowloop })\n ctx.push(scope)\n\n for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {\n scope[this.variable] = collection[idx]\n if (tablerowloop.col0() === 0) {\n if (tablerowloop.row() !== 1) emitter.write('')\n emitter.write(``)\n }\n emitter.write(``)\n yield r.renderTemplates(this.templates, ctx, emitter)\n emitter.write('')\n }\n if (collection.length) emitter.write('')\n ctx.pop()\n }\n\n public * children (): Generator {\n return this.templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): string[] {\n return [this.variable, 'tablerowloop']\n }\n}\n","import { Liquid, Tag, Value, TopLevelToken, Template, Emitter, isTruthy, isFalsy, Context, TagToken } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n branches: { value: Value, test: (val: any, ctx: Context) => boolean, templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n let elseCount = 0\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n test: isFalsy,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n if (elseCount > 0) {\n p = []\n return\n }\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n test: isTruthy,\n templates: (p = [])\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endunless', function () { this.stop() })\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n\n for (const { value, test, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (test(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n\n public * children (): Generator {\n const children = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n children.push(...this.elseTemplates)\n }\n return children\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { Context, Emitter, Tag } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.breakCalled = true\n }\n}\n","import { Tag, Emitter, Context } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.continueCalled = true\n }\n}\n","import { Liquid, TopLevelToken, Emitter, Value, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private value?: Value\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.tokenizer.skipBlank()\n if (!this.tokenizer.end()) {\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n if (!this.value) return\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n if (this.value) {\n yield this.value\n }\n }\n}\n","import { Template, Emitter, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n templates: Template[]\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options)\n this.templates = parser.parseTokens(tokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter)\n }\n\n public * children (): Generator {\n return this.templates\n }\n}\n","import { TagToken, Liquid, TopLevelToken, Tag } from '..'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n if (tagToken.args.search(/\\n\\s*[^#\\s]/g) !== -1) {\n throw new Error('every line of an inline comment must start with a \\'#\\' character')\n }\n }\n render () { }\n}\n","import AssignTag from './assign'\nimport ForTag from './for'\nimport CaptureTag from './capture'\nimport CaseTag from './case'\nimport CommentTag from './comment'\nimport IncludeTag from './include'\nimport RenderTag from './render'\nimport DecrementTag from './decrement'\nimport CycleTag from './cycle'\nimport IfTag from './if'\nimport IncrementTag from './increment'\nimport LayoutTag from './layout'\nimport BlockTag from './block'\nimport RawTag from './raw'\nimport TablerowTag from './tablerow'\nimport UnlessTag from './unless'\nimport BreakTag from './break'\nimport ContinueTag from './continue'\nimport EchoTag from './echo'\nimport LiquidTag from './liquid'\nimport InlineCommentTag from './inline-comment'\nimport type { TagClass } from '../template/tag'\n\nexport const tags: Record = {\n assign: AssignTag,\n 'for': ForTag,\n capture: CaptureTag,\n 'case': CaseTag,\n comment: CommentTag,\n include: IncludeTag,\n render: RenderTag,\n decrement: DecrementTag,\n increment: IncrementTag,\n cycle: CycleTag,\n 'if': IfTag,\n layout: LayoutTag,\n block: BlockTag,\n raw: RawTag,\n tablerow: TablerowTag,\n unless: UnlessTag,\n 'break': BreakTag,\n 'continue': ContinueTag,\n echo: EchoTag,\n liquid: LiquidTag,\n '#': InlineCommentTag\n}\n\nexport { AssignTag, ForTag, CaptureTag, CaseTag, CommentTag, IncludeTag, RenderTag, DecrementTag, IncrementTag, CycleTag, IfTag, LayoutTag, BlockTag, RawTag, TablerowTag, UnlessTag, BreakTag, ContinueTag, EchoTag, LiquidTag, InlineCommentTag }\n","import { Context } from './context'\nimport { toPromise, toValueSync, isFunction, forOwn, isString, strictUniq } from './util'\nimport { TagClass, createTagClass, TagImplOptions, FilterImplOptions, Template, Value, StaticAnalysisOptions, StaticAnalysis, analyze, analyzeSync, SegmentArray } from './template'\nimport { LookupType } from './fs/loader'\nimport { Render } from './render'\nimport { Parser } from './parser'\nimport { tags } from './tags'\nimport { filters } from './filters'\nimport { LiquidOptions, normalizeDirectoryList, NormalizedFullOptions, normalize, RenderOptions, RenderFileOptions } from './liquid-options'\n\nexport class Liquid {\n public readonly options: NormalizedFullOptions\n public readonly renderer = new Render()\n /**\n * @deprecated will be removed. In tags use `this.parser` instead\n */\n public readonly parser: Parser\n public readonly filters: Record = Object.create(null)\n public readonly tags: Record = Object.create(null)\n\n public constructor (opts: LiquidOptions = {}) {\n this.options = normalize(opts)\n // eslint-disable-next-line deprecation/deprecation\n this.parser = new Parser(this)\n forOwn(tags, (conf: TagClass, name: string) => this.registerTag(name, conf))\n forOwn(filters, (handler: FilterImplOptions, name: string) => this.registerFilter(name, handler))\n }\n public parse (html: string, filepath?: string): Template[] {\n const parser = new Parser(this)\n return parser.parse(html, filepath)\n }\n\n public _render (tpl: Template[], scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator {\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplates(tpl, ctx)\n }\n public async render (tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise {\n return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false }))\n }\n public renderSync (tpl: Template[], scope?: object, renderOptions?: RenderOptions): any {\n return toValueSync(this._render(tpl, scope, { ...renderOptions, sync: true }))\n }\n public renderToNodeStream (tpl: Template[], scope?: object, renderOptions: RenderOptions = {}): NodeJS.ReadableStream {\n const ctx = new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplatesToNodeStream(tpl, ctx)\n }\n\n public _parseAndRender (html: string, scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator {\n const tpl = this.parse(html)\n return this._render(tpl, scope, renderOptions)\n }\n public async parseAndRender (html: string, scope?: Context | object, renderOptions?: RenderOptions): Promise {\n return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false }))\n }\n public parseAndRenderSync (html: string, scope?: Context | object, renderOptions?: RenderOptions): any {\n return toValueSync(this._parseAndRender(html, scope, { ...renderOptions, sync: true }))\n }\n\n public _parsePartialFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile)\n }\n public _parseLayoutFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile)\n }\n public _parseFile (file: string, sync?: boolean, lookupType?: LookupType, currentFile?: string): Generator {\n return new Parser(this).parseFile(file, sync, lookupType, currentFile)\n }\n public async parseFile (file: string, lookupType?: LookupType): Promise {\n return toPromise(new Parser(this).parseFile(file, false, lookupType))\n }\n public parseFileSync (file: string, lookupType?: LookupType): Template[] {\n return toValueSync(new Parser(this).parseFile(file, true, lookupType))\n }\n public * _renderFile (file: string, ctx: Context | object | undefined, renderFileOptions: RenderFileOptions): Generator {\n const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)) as Template[]\n return yield this._render(templates, ctx, renderFileOptions)\n }\n public async renderFile (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toPromise(this._renderFile(file, ctx, { ...renderFileOptions, sync: false }))\n }\n public renderFileSync (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toValueSync(this._renderFile(file, ctx, { ...renderFileOptions, sync: true }))\n }\n public async renderFileToNodeStream (file: string, scope?: object, renderOptions?: RenderOptions) {\n const templates = await this.parseFile(file)\n return this.renderToNodeStream(templates, scope, renderOptions)\n }\n\n public _evalValue (str: string, scope?: object | Context): IterableIterator {\n const value = new Value(str, this)\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options)\n return value.value(ctx)\n }\n public async evalValue (str: string, scope?: object | Context): Promise {\n return toPromise(this._evalValue(str, scope))\n }\n public evalValueSync (str: string, scope?: object | Context): any {\n return toValueSync(this._evalValue(str, scope))\n }\n\n public registerFilter (name: string, filter: FilterImplOptions) {\n this.filters[name] = filter\n }\n public registerTag (name: string, tag: TagClass | TagImplOptions) {\n this.tags[name] = isFunction(tag) ? tag : createTagClass(tag)\n }\n public plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n public express () {\n const self = this // eslint-disable-line\n let firstCall = true\n\n return function (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) {\n if (firstCall) {\n firstCall = false\n const dirs = normalizeDirectoryList(this.root)\n self.options.root.unshift(...dirs)\n self.options.layouts.unshift(...dirs)\n self.options.partials.unshift(...dirs)\n }\n self.renderFile(filePath, ctx).then(html => callback(null, html) as any, callback as any)\n }\n }\n\n public async analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise {\n return analyze(template, options)\n }\n\n public analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(template, options)\n }\n\n public async parseAndAnalyze (html: string, filename?: string, options: StaticAnalysisOptions = {}): Promise {\n return analyze(this.parse(html, filename), options)\n }\n\n public parseAndAnalyzeSync (html: string, filename?: string, options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(this.parse(html, filename), options)\n }\n\n /** Return an array of all variables without their properties. */\n public async variables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables without their properties. */\n public variablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables including their properties/paths. */\n public async fullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables including their properties/paths. */\n public fullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public async variableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public variableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables without their properties. */\n public async globalVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables without their properties. */\n public globalVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public async globalFullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public globalFullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public async globalVariableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public globalVariableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n}\n","import { isFunction } from '../util'\nimport { Hash } from './hash'\nimport { Tag, TagClass, TagRenderReturn } from './tag'\nimport { TagToken, TopLevelToken } from '../tokens'\nimport { Emitter } from '../emitters'\nimport { Context } from '../context'\nimport type { Liquid } from '../liquid'\n\nexport interface TagImplOptions {\n [key: string]: any\n parse?: (this: Tag & TagImplOptions, token: TagToken, remainingTokens: TopLevelToken[]) => void;\n render: (this: Tag & TagImplOptions, ctx: Context, emitter: Emitter, hash: Record) => TagRenderReturn;\n}\n\nexport function createTagClass (options: TagImplOptions): TagClass {\n return class extends Tag {\n constructor (token: TagToken, tokens: TopLevelToken[], liquid: Liquid) {\n super(token, tokens, liquid)\n if (isFunction(options.parse)) {\n options.parse.call(this, token, tokens)\n }\n }\n * render (ctx: Context, emitter: Emitter): TagRenderReturn {\n const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)) as Record\n return yield options.render.call(this, ctx, emitter, hash)\n }\n }\n}\n","/* istanbul ignore file */\nexport const version = '[VI]{version}[/VI]'\nexport * as TypeGuards from './util/type-guards'\nexport { toValue, createTrie, Trie, toPromise, toValueSync, assert, LiquidError, ParseError, RenderError, UndefinedVariableError, TokenizationError, AssertionError } from './util'\nexport type { LiquidErrors } from './util/error'\nexport { Drop } from './drop'\nexport type { Comparable } from './drop'\nexport { Emitter } from './emitters'\nexport { defaultOperators, Operators, evalToken, evalQuotedToken, Expression, isFalsy, isTruthy } from './render'\nexport { Context, Scope } from './context'\nexport { Value, Hash, Template, FilterImplOptions, Tag, Filter, Output, Variable, VariableLocation, VariableSegments, Variables, StaticAnalysis, StaticAnalysisOptions, analyze, analyzeSync, Arguments, PartialScope } from './template'\nexport type { TagRenderReturn } from './template'\nexport { Token, TopLevelToken, TagToken, ValueToken } from './tokens'\nexport type { RangeToken, LiteralToken, QuotedToken, PropertyAccessToken, NumberToken } from './tokens'\nexport { TokenKind, Tokenizer, ParseStream, Parser } from './parser'\nexport { filters } from './filters'\nexport * from './tags'\nexport { defaultOptions } from './liquid-options'\nexport type { LiquidOptions, RenderOptions, RenderFileOptions } from './liquid-options'\nexport { FS, LookupType } from './fs'\nexport { Liquid } from './liquid'\n"],"names":["Token","this","input","slice","begin","end","_a","__read","row","col","i","kind","file","Drop","key","context","toString","Object","prototype","toLowerCase","String","hasOwnProperty","isString","value","isFunction","isIterator","val","next","throw","return","stringify","toValue","isNil","isArray","map","join","toEnumerable","length","isObject","Symbol","iterator","Array","from","keys","toArray","valueOf","toNumber","isNumber","call","isArrayLike","forOwn","obj","iteratee","k","last","arr","type","range","start","stop","step","push","padStart","str","ch","pad","add","n","repeat","identify","orderedCompare","a","b","caseInsensitiveCompare","argumentsToValue","fn","_i","args","argumentsToNumber","strictUniq","array","seen","Set","array_1","__values","element","JSON","has","_b","TRAIT","__extends","Error","LiquidError","line","lines","msg","token","defineProperty","getPosition","split","Math","max","min","_\r\n .range","lineNumber","rowIndicator","num","_.padStart","text","colIndicator","enumerable","message","stack","originalError","err","_super","_this","name","update","RenderError","tpl","LiquidErrors","errors","s","variableName","TYPES","WORD","BLANK","INLINE_BLANK","isWord","char","code","charCodeAt","assert","predicate","AssertionError","assertEmpty","NullDrop","EmptyDrop","BlankDrop","test","equals","ForloopDrop","collection","variable","SimpleEmitter","html","buffer","KeepingTypeEmitter","BlockDrop","emitter","superBlockRender","isComparable","arg","gt","geq","lt","leq","nil","literalValues","true","false","null","empty","blank","createTrie","trie","entries","_d","name_1","data","node","c","needBoundary","toLiquidAsync","asyncFn","syncFn","syncImpl","sync","toPromise","done","state","then","err_1","toValueSync","rFormat","daysInMonth","d","year","getFullYear","getDayOfYear","getMonth","getDate","getWeekOfYear","startDay","now","getDay","Date","floor","padWidths","e","H","I","j","l","L","m","M","S","U","W","padSpaceChars","getTimezoneOffset","opts","nOffset","abs","h","flags","formatCodes","getShortWeekdayName","A","getLongWeekdayName","getShortMonthName","B","getLongMonthName","toLocaleString","C","parseInt","substring","getHours","getMilliseconds","getMinutes","N","width","Number","memoryLimit","use","p","P","q","date","includes","round","getTime","getSeconds","u","w","x","toLocaleDateString","X","toLocaleTimeString","y","Y","z","Z","getTimeZoneName","t","%","strftime","formatStr","match","output","remaining","exec","index","_c","flagStr","modifier","conversion","convert","flagStr_1","flag","ret","padChar","padWidth","toUpperCase","__spreadArray","some","getDateTimeFormat","Intl","DateTimeFormat","undefined","TIMEZONE_PATTERN","monthNames","monthNamesShort","dayNames","dayNamesShort","LiquidDate","displayDate","locale","init","timeZone","timezoneOffset","timezoneFixed","timezoneName","resolvedOptions","format","month","weekday","isNaN","options","dateString","hours","offset","sign","minutes","localDateString","utcDateString","localDate","timezone","diff","time","Limiter","count","base","limit","resource","DelimitedToken","contentRange","trimLeft","trimRight","contentBegin","contentEnd","tl","tr","r","trimTagLeft","trimTagRight","tagDelimiterLeft","tagDelimiterRight","valueBegin","valueEnd","TokenKind","Tag","tokenizer","Tokenizer","operators","readTagName","skipBlank","trimOutputLeft","trimOutputRight","outputDelimiterLeft","outputDelimiterRight","valueRange","Output","HTMLToken","HTML","content","getText","Word","Literal","literal","operatorPrecedences","==","!=",">","<",">=","<=","contains","not","and","or","operatorTypes","OperatorToken","Operator","operator","props","PropertyAccess","Filter","Hash","rHex","rOct","escapeChar","f","v","hexVal","Quoted","fromCharCode","lhs","rhs","Range","LiquidTagToken","initial","filters","FilteredValue","polyfill","getPerformance","global","performance","window","Render","templates","ctx","StreamedEmitter","Promise","resolve","renderTemplates","error","stream","keepOutputType","renderLimit","check","templates_1","render","write","breakCalled","continueCalled","is","e_1","catchAllErrors","Expression","lenient","operands","postfix","isOperatorToken","pop","result","_f","evalToken","tokens","ops","tokens_1","getPrecedence","isPropertyAccessToken","prop","_getFromScope","_get","e_3","UndefinedVariableError","isRangeToken","low","high","evalQuotedToken","isTruthy","isFalsy","jsTruthy","defaultOperators","indexOf","prev","LRU","cache","Node","head","size","ensureLimit","remove","tail","domResolve","root","path","document","createElement","href","getElementsByTagName","insertBefore","firstChild","resolved","removeChild","filepath","ext","replace","origin","url","reject","xhr","XMLHttpRequest","onload","status","responseText","statusText","onerror","open","send","json","space","default","defaultValue","Map","get","raw","handler","jsonify","to_integer","inspect","ancestors","_key","escapeMap","&","\"","'","unescapeMap","&","<",">",""","'","escape","blocks","out","blocks_1","opener_1","closer","startsWith","delete","MapFS","existsSync","mapping","readFileSync","segments","sep","dir","segment","defaultOptions","layouts","partials","relativeReference","jekyllInclude","keyValueSeparator","extname","fs","dynamicPartials","dateFormat","greedy","preserveTimezones","strictFilters","strictVariables","ownPropertyOnly","lenientIf","globals","Infinity","parseLimit","normalize","nameOrFunction","dirname","console","warn","normalizeDirectoryList","outputEscape","misc","list","whiteSpaceCtrl","inRaw","isDelimitedToken","mask","isHTMLToken","isTagToken","charAt","readExpressionTokens","readOperator","operand","readValue","matchTrie","opTrie","info","peek","readExpression","valid","snapshot","readFilters","FilteredValueToken","filter","readFilter","read","readIdentifier","readFilterArg","FilterToken","readTopLevelToken","rawBeginAt","readEndrawOrRawContent","readTagToken","readOutputToken","readHTMLToken","stopStrings","readToDelimiter","TagToken","delimiter","respectQuoted","peekType","readQuoted","rmatch","OutputToken","leftPos","readTo","readLiquidTagToken","pos","TokenizationError","IdentifierToken","pred","id","jekyllStyle","hashes","hash","readHash","readNonEmptyIdentifier","HashToken","readLiteral","readRange","readNumber","readProperties","PropertyAccessToken","isBegin","decimalFound","digitFound","NumberToken","advance","literalTrie","LiteralToken","readValueOrThrow","RangeToken","escaped","QuotedToken","htmlStopStrings","htmlStopStringSet","word","pattern","ParseStream","cb","handlers","event","template","trigger","stopRequested","shift","parseToken","TemplateImpl","remainTokens","liquid","_e","_g","readHashes","isKeyValuePair","argv","_j","apply","Value","evaluate","impl","readFilteredValue","getFilter","token_1","getContent","Variable","segmentsString","_visit","segments_1","location","VariableMap","set","fromEntries","defaultStaticAnalysisOptions","_analyze","visit","scope","arguments","extractVariables","updateVariables","variables","aliased","alias","rootScope","localScope","ident","deleteAlias","locals","children","partialScope","partial","_h","_z","partialScopeNames","isolated","DummyScope","_k","_m","argument","variables_1","setAlias","_o","blockScope","_q","asObject","analyze","__assign","analyzeSync","names","aliases","getAlias","to","isValueToken","extractValueTokenVariables","extractPropertyAccessVariable","isQuotedToken","isNumberToken","isWordToken","RE_PROPERTY","bracketedRoot","buf","LookupType","Loader","currentFile","dirs","candidates","allowed","dirs_1","exists","lookupError","shouldLoadRelative","dirs_2","fallback","roots","prefixes_1","referencedFile","prefix","_referencedFile","bind","containsSync","Parser","readTopLevelTokens","parseTokens","TagClass","tags","isOutputToken","ParseError","Root","loader","tpls","task","_parseFile","taskOrTpl","lookup","parse","readFile","parseFile","_parseFileCached","getKind","Delimited","createScope","create","assign","Context","registers","getRegister","keyValues","forEach","setRegister","environments","scopes","reduce","paths","getSync","findScope","readProperty","InternalUndefinedVariableError","candidate","toLiquid","liquidMethodMissing","BlockMode","env","renderOptions","at_least","at_most","ceil","divided_by","dividend","divisor","integerArithmetic","minus","plus","modulo","times","amp","pow","scaled","rSlugifyDefault","rSlugifyReplacers","pretty","ascii","latin","none","decodeURIComponent","encodeURIComponent","encodeURI","mode","cased","replacer","complexity","arrayLast","first","reverse","sortBy","property","comparator","values","item","sort","tuple","concat","expectedMatcher","expected","jekyllWhere","include","readScopeValue","arr_1","spawn","matcher","_","filter_exp","itemName","exp","filtered","keyTemplate","array_4","search","search_exp","results","array_2","sum","array_3","clone","unshift","arr_2","items","arr_3","shuffled","random","parseDate","stringify_date","month_type","style","ml","defaultTimezoneOffset","createDateFixedToTimezone","rCJKWord","rNonCJKWord","chars","trimStart","lastIndexOf","trimEnd","trim","replacement","parts","outputSize","arg1","arg2","o","words","connector","Buffer","isBuffer","byteLength","btoa","TextEncoder","encode","TextDecoder","decode","Uint8Array","atob","bufferToHex","bytes","hex","crypto","subtle","digest","keyStr","encoder","importKey","cryptoKey","htmlFilters","mathFilters","urlFilters","arrayFilters","dateFilters","stringFilters","base64Filters","cryptoFilters","default_1","bottom","identifier","MODIFIERS","renderer","elseTemplates","continueKey","continue","modifiers","orderedFilterParameters","forloop","collection_1","parser","inStr","parseStream","on","tag","tagToken","readVariable","target","branchHit","branches","branch","flatMap","elseCount","renderFilePath","childCtx","_parsePartialFile","parseFilePath","keyword","beforeAs","TypeGuards.isQuotedToken","optimize","readFileNameTemplate","TypeGuards.isHTMLToken","withVar","saved","saveRegister","OUTPUT","restoreRegister","group","fingerprint","groups","idx","_parseLayoutFile","STORE","parent","blockRender","getBlockRender","block","renderCurrent","superBlock","self","renderChild","TablerowloopDrop","cols","col0","tablerowloop","collectionToken","test_1","_emitter","readLiquidTagTokens","AssignTag","for","ForTag","capture","CaptureTag","case","CaseTag","comment","CommentTag","IncludeTag","RenderTag","decrement","DecrementTag","increment","IncrementTag","cycle","CycleTag","if","IfTag","layout","LayoutTag","BlockTag","RawTag","tablerow","TablerowTag","unless","UnlessTag","break","BreakTag","ContinueTag","echo","EchoTag","LiquidTag","#","InlineCommentTag","Liquid","_render","renderTemplatesToNodeStream","_parseAndRender","Partials","Layouts","lookupType","renderFileOptions","_renderFile","renderToNodeStream","_evalValue","class_1","plugin","firstCall","filePath","callback","renderFile","filename","analysis","conf","registerTag","registerFilter"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/liquidjs/dist/liquid.browser.mjs b/node_modules/liquidjs/dist/liquid.browser.mjs new file mode 100644 index 0000000..3c73aaf --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.mjs @@ -0,0 +1,5103 @@ +/* + * liquidjs@10.27.0, https://github.com/harttle/liquidjs + * (c) 2016-2026 harttle + * Released under the MIT License. + */ +class Token { + constructor(kind, input, begin, end, file) { + this.kind = kind; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } + getText() { + return this.input.slice(this.begin, this.end); + } + getPosition() { + let [row, col] = [1, 1]; + for (let i = 0; i < this.begin; i++) { + if (this.input[i] === '\n') { + row++; + col = 1; + } + else + col++; + } + return [row, col]; + } + size() { + return this.end - this.begin; + } +} + +class Drop { + liquidMethodMissing(key, context) { + return undefined; + } +} + +const toString$1 = Object.prototype.toString; +const toLowerCase = String.prototype.toLowerCase; +const hasOwnProperty = Object.hasOwnProperty; +function isString(value) { + return typeof value === 'string'; +} +// eslint-disable-next-line @typescript-eslint/ban-types +function isFunction(value) { + return typeof value === 'function'; +} +function isPromise(val) { + return val && isFunction(val.then); +} +function isIterator(val) { + return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return); +} +function stringify(value) { + value = toValue(value); + if (isString(value)) + return value; + if (isNil(value)) + return ''; + if (isArray(value)) + return value.map(x => stringify(x)).join(''); + return String(value); +} +function toEnumerable(val) { + val = toValue(val); + if (isArray(val)) + return val; + if (isString(val) && val.length > 0) + return [val]; + if (isIterable(val)) + return Array.from(val); + if (isObject(val)) + return Object.keys(val).map((key) => [key, val[key]]); + return []; +} +function toArray(val) { + val = toValue(val); + if (isNil(val)) + return []; + if (isArray(val)) + return val; + return [val]; +} +function toValue(value) { + return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value; +} +function toNumber(value) { + return +toValue(value) || 0; +} +function isNumber(value) { + return typeof value === 'number'; +} +function toLiquid(value) { + if (value && isFunction(value.toLiquid)) + return toLiquid(value.toLiquid()); + return value; +} +function isNil(value) { + return value == null; +} +function isUndefined(value) { + return value === undefined; +} +function isArray(value) { + // be compatible with IE 8 + return toString$1.call(value) === '[object Array]'; +} +function isArrayLike(value) { + return value && isNumber(value.length); +} +function isIterable(value) { + return isObject(value) && Symbol.iterator in value; +} +/* + * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property. + * The iteratee is invoked with three arguments: (value, key, object). + * Iteratee functions may exit iteration early by explicitly returning false. + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @return {Object} Returns object. + */ +function forOwn(obj, iteratee) { + obj = obj || {}; + for (const k in obj) { + if (hasOwnProperty.call(obj, k)) { + if (iteratee(obj[k], k, obj) === false) + break; + } + } + return obj; +} +function last(arr) { + return arr[arr.length - 1]; +} +/* + * Checks if value is the language type of Object. + * (e.g. arrays, functions, objects, regexes, new Number(0), and new String('')) + * @param {any} value The value to check. + * @return {Boolean} Returns true if value is an object, else false. + */ +function isObject(value) { + const type = typeof value; + return value !== null && (type === 'object' || type === 'function'); +} +function range(start, stop, step = 1) { + const arr = []; + for (let i = start; i < stop; i += step) { + arr.push(i); + } + return arr; +} +function padStart(str, length, ch = ' ') { + return pad(str, length, ch, (str, ch) => ch + str); +} +function padEnd(str, length, ch = ' ') { + return pad(str, length, ch, (str, ch) => str + ch); +} +function pad(str, length, ch, add) { + str = String(str); + const n = length - str.length; + if (n <= 0) + return str; + return add(str, ch.repeat(n)); +} +function identify(val) { + return val; +} +function changeCase(str) { + const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z'); + return hasLowerCase ? str.toUpperCase() : str.toLowerCase(); +} +function ellipsis(str, N) { + return str.length > N ? str.slice(0, N - 3) + '...' : str; +} +function orderedCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} +// compare string in case-insensitive way, undefined values to the tail +function caseInsensitiveCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + a = toLowerCase.call(a); + b = toLowerCase.call(b); + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} +function argumentsToValue(fn) { + return function (...args) { return fn.call(this, ...args.map(toValue)); }; +} +function argumentsToNumber(fn) { + return function (...args) { return fn.call(this, ...args.map(toNumber)); }; +} +/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */ +function* strictUniq(array) { + const seen = new Set(); + for (const element of array) { + const key = JSON.stringify(element); + if (!seen.has(key)) { + seen.add(key); + yield element; + } + } +} + +/** + * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes + */ +const TRAIT = '__liquidClass__'; +class LiquidError extends Error { + constructor(err, token) { + /** + * note: for ES5 targeting, `this` will be replaced by return value of Error(), + * thus everything on `this` will be lost, avoid calling `LiquidError` methods here + */ + super(typeof err === 'string' ? err : err.message); + this.context = ''; + if (typeof err !== 'string') + Object.defineProperty(this, 'originalError', { value: err, enumerable: false }); + Object.defineProperty(this, 'token', { value: token, enumerable: false }); + Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false }); + } + update() { + Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false }); + this.message = mkMessage(this.message, this.token); + this.stack = this.message + '\n' + this.context + + '\n' + this.stack; + if (this.originalError) + this.stack += '\nFrom ' + this.originalError.stack; + } + static is(obj) { + return (obj === null || obj === void 0 ? void 0 : obj[TRAIT]) === 'LiquidError'; + } +} +class TokenizationError extends LiquidError { + constructor(message, token) { + super(message, token); + this.name = 'TokenizationError'; + super.update(); + } +} +class ParseError extends LiquidError { + constructor(err, token) { + super(err, token); + this.name = 'ParseError'; + this.message = err.message; + super.update(); + } +} +class RenderError extends LiquidError { + constructor(err, tpl) { + super(err, tpl.token); + this.name = 'RenderError'; + this.message = err.message; + super.update(); + } + static is(obj) { + return obj.name === 'RenderError'; + } +} +class LiquidErrors extends LiquidError { + constructor(errors) { + super(errors[0], errors[0].token); + this.errors = errors; + this.name = 'LiquidErrors'; + const s = errors.length > 1 ? 's' : ''; + this.message = `${errors.length} error${s} found`; + super.update(); + } + static is(obj) { + return obj.name === 'LiquidErrors'; + } +} +class UndefinedVariableError extends LiquidError { + constructor(err, token) { + super(err, token); + this.name = 'UndefinedVariableError'; + this.message = err.message; + super.update(); + } +} +// only used internally; raised where we don't have token information, +// so it can't be an UndefinedVariableError. +class InternalUndefinedVariableError extends Error { + constructor(variableName) { + super(`undefined variable: ${variableName}`); + this.name = 'InternalUndefinedVariableError'; + this.variableName = variableName; + } +} +class AssertionError extends Error { + constructor(message) { + super(message); + this.name = 'AssertionError'; + this.message = message + ''; + } +} +function mkContext(token) { + const [line, col] = token.getPosition(); + const lines = token.input.split('\n'); + const begin = Math.max(line - 2, 1); + const end = Math.min(line + 3, lines.length); + const context = range(begin, end + 1) + .map(lineNumber => { + const rowIndicator = (lineNumber === line) ? '>> ' : ' '; + const num = padStart(String(lineNumber), String(end).length); + let text = `${rowIndicator}${num}| `; + const colIndicator = lineNumber === line + ? '\n' + padStart('^', col + text.length) + : ''; + text += lines[lineNumber - 1]; + text += colIndicator; + return text; + }) + .join('\n'); + return context; +} +function mkMessage(msg, token) { + if (token.file) + msg += `, file:${token.file}`; + const [line, col] = token.getPosition(); + msg += `, line:${line}, col:${col}`; + return msg; +} + +// **DO NOT CHANGE THIS FILE** +// +// This file is generated by bin/character-gen.js +// bitmask character types to boost performance +const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; +const WORD = 1; +const BLANK = 4; +const QUOTE = 8; +const INLINE_BLANK = 16; +const NUMBER = 32; +const SIGN = 64; +const PUNCTUATION = 128; +function isWord(char) { + const code = char.charCodeAt(0); + return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD); +} +TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK; +TYPES[8220] = TYPES[8221] = PUNCTUATION; + +function assert(predicate, message) { + if (!predicate) { + const msg = typeof message === 'function' + ? message() + : (message || `expect ${predicate} to be true`); + throw new AssertionError(msg); + } +} +function assertEmpty(predicate, message = `unexpected ${JSON.stringify(predicate)}`) { + assert(!predicate, message); +} + +class NullDrop extends Drop { + equals(value) { + return isNil(toValue(value)); + } + gt() { + return false; + } + geq() { + return false; + } + lt() { + return false; + } + leq() { + return false; + } + valueOf() { + return null; + } +} + +class EmptyDrop extends Drop { + equals(value) { + if (value instanceof EmptyDrop) + return false; + value = toValue(value); + if (isString(value) || isArray(value)) + return value.length === 0; + if (isObject(value)) + return Object.keys(value).length === 0; + return false; + } + gt() { + return false; + } + geq() { + return false; + } + lt() { + return false; + } + leq() { + return false; + } + valueOf() { + return ''; + } + static is(value) { + return value instanceof EmptyDrop; + } +} + +class BlankDrop extends EmptyDrop { + equals(value) { + if (value === false) + return true; + if (isNil(toValue(value))) + return true; + if (isString(value)) + return /^\s*$/.test(value); + return super.equals(value); + } + static is(value) { + return value instanceof BlankDrop; + } +} + +class ForloopDrop extends Drop { + constructor(length, collection, variable) { + super(); + this.i = 0; + this.length = length; + this.name = `${variable}-${collection}`; + } + next() { + this.i++; + } + index0() { + return this.i; + } + index() { + return this.i + 1; + } + first() { + return this.i === 0; + } + last() { + return this.i === this.length - 1; + } + rindex() { + return this.length - this.i; + } + rindex0() { + return this.length - this.i - 1; + } + valueOf() { + return JSON.stringify(this); + } +} + +class SimpleEmitter { + constructor() { + this.buffer = ''; + } + write(html) { + this.buffer += stringify(html); + } +} + +class StreamedEmitter { + constructor() { + this.buffer = ''; + this.stream = null; + throw new Error('streaming not supported in browser'); + } +} + +class KeepingTypeEmitter { + constructor() { + this.buffer = ''; + } + write(html) { + html = toValue(html); + // This will only preserve the type if the value is isolated. + // I.E: + // {{ my-port }} -> 42 + // {{ my-host }}:{{ my-port }} -> 'host:42' + if (typeof html !== 'string' && this.buffer === '') { + this.buffer = html; + } + else { + this.buffer = stringify(this.buffer) + stringify(html); + } + } +} + +class BlockDrop extends Drop { + constructor( + // the block render from layout template + superBlockRender = () => '') { + super(); + this.superBlockRender = superBlockRender; + } + /** + * Provide parent access in child block by + * {{ block.super }} + */ + *super() { + const emitter = new SimpleEmitter(); + yield this.superBlockRender(emitter); + return emitter.buffer; + } +} + +function isComparable(arg) { + return (arg && + isFunction(arg.equals) && + isFunction(arg.gt) && + isFunction(arg.geq) && + isFunction(arg.lt) && + isFunction(arg.leq)); +} + +const nil = new NullDrop(); +const literalValues = { + 'true': true, + 'false': false, + 'nil': nil, + 'null': nil, + 'empty': new EmptyDrop(), + 'blank': new BlankDrop() +}; + +function createTrie(input) { + const trie = {}; + for (const [name, data] of Object.entries(input)) { + let node = trie; + for (let i = 0; i < name.length; i++) { + const c = name[i]; + node[c] = node[c] || {}; + if (i === name.length - 1 && isWord(name[i])) { + node[c].needBoundary = true; + } + node = node[c]; + } + node.data = data; + node.end = true; + } + return trie; +} + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +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. +***************************************************************************** */ + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function toLiquidAsync(asyncFn, syncFn) { + const syncImpl = syncFn || asyncFn; + return (sync, ...args) => { + return sync ? syncImpl(...args) : asyncFn(...args); + }; +} +// convert an async iterator to a Promise +function toPromise(val) { + return __awaiter(this, void 0, void 0, function* () { + if (!isIterator(val)) + return val; + let value; + let done = false; + let next = 'next'; + do { + const state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + try { + if (isIterator(value)) + value = toPromise(value); + if (isPromise(value)) + value = yield value; + } + catch (err) { + next = 'throw'; + value = err; + } + } while (!done); + return value; + }); +} +// convert an async iterator to a value in a synchronous manner +function toValueSync(val) { + if (!isIterator(val)) + return val; + let value; + let done = false; + let next = 'next'; + do { + const state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + if (isIterator(value)) { + try { + value = toValueSync(value); + } + catch (err) { + next = 'throw'; + value = err; + } + } + } while (!done); + return value; +} + +const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/; +// prototype extensions +function daysInMonth(d) { + const feb = isLeapYear(d) ? 29 : 28; + return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +} +function getDayOfYear(d) { + let num = 0; + for (let i = 0; i < d.getMonth(); ++i) { + num += daysInMonth(d)[i]; + } + return num + d.getDate(); +} +function getWeekOfYear(d, startDay) { + // Skip to startDay of this week + const now = getDayOfYear(d) + (startDay - d.getDay()); + // Find the first startDay of the year + const jan1 = new Date(d.getFullYear(), 0, 1); + const then = (7 - jan1.getDay() + startDay); + return String(Math.floor((now - then) / 7) + 1); +} +function isLeapYear(d) { + const year = d.getFullYear(); + return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year))); +} +function ordinal(d) { + const date = d.getDate(); + if ([11, 12, 13].includes(date)) + return 'th'; + switch (date % 10) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + default: return 'th'; + } +} +function century(d) { + return parseInt(d.getFullYear().toString().substring(0, 2), 10); +} +// default to 0 +const padWidths = { + d: 2, + e: 2, + H: 2, + I: 2, + j: 3, + k: 2, + l: 2, + L: 3, + m: 2, + M: 2, + S: 2, + U: 2, + W: 2 +}; +const padSpaceChars = new Set('aAbBceklpP'); +function getTimezoneOffset(d, opts) { + const nOffset = Math.abs(d.getTimezoneOffset()); + const h = Math.floor(nOffset / 60); + const m = nOffset % 60; + return (d.getTimezoneOffset() > 0 ? '-' : '+') + + padStart(h, 2, '0') + + (opts.flags[':'] ? ':' : '') + + padStart(m, 2, '0'); +} +const formatCodes = { + a: (d) => d.getShortWeekdayName(), + A: (d) => d.getLongWeekdayName(), + b: (d) => d.getShortMonthName(), + B: (d) => d.getLongMonthName(), + c: (d) => d.toLocaleString(), + C: (d) => century(d), + d: (d) => d.getDate(), + e: (d) => d.getDate(), + H: (d) => d.getHours(), + I: (d) => String(d.getHours() % 12 || 12), + j: (d) => getDayOfYear(d), + k: (d) => d.getHours(), + l: (d) => String(d.getHours() % 12 || 12), + L: (d) => d.getMilliseconds(), + m: (d) => d.getMonth() + 1, + M: (d) => d.getMinutes(), + N: (d, opts) => { + var _a; + const width = Number(opts.width) || 9; + const str = String(d.getMilliseconds()).slice(0, width); + (_a = opts.memoryLimit) === null || _a === void 0 ? void 0 : _a.use(width - str.length); + return padEnd(str, width, '0'); + }, + p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'), + P: (d) => (d.getHours() < 12 ? 'am' : 'pm'), + q: (d) => ordinal(d), + s: (d) => Math.round(d.getTime() / 1000), + S: (d) => d.getSeconds(), + u: (d) => d.getDay() || 7, + U: (d) => getWeekOfYear(d, 0), + w: (d) => d.getDay(), + W: (d) => getWeekOfYear(d, 1), + x: (d) => d.toLocaleDateString(), + X: (d) => d.toLocaleTimeString(), + y: (d) => d.getFullYear().toString().slice(2, 4), + Y: (d) => d.getFullYear(), + z: getTimezoneOffset, + Z: (d, opts) => d.getTimeZoneName() || getTimezoneOffset(d, opts), + 't': () => '\t', + 'n': () => '\n', + '%': () => '%' +}; +formatCodes.h = formatCodes.b; +function strftime(d, formatStr, memoryLimit) { + let output = ''; + let remaining = formatStr; + let match; + while ((match = rFormat.exec(remaining))) { + output += remaining.slice(0, match.index); + remaining = remaining.slice(match.index + match[0].length); + output += format(d, match, memoryLimit); + } + return output + remaining; +} +function format(d, match, memoryLimit) { + const [input, flagStr = '', width, modifier, conversion] = match; + const convert = formatCodes[conversion]; + if (!convert) + return input; + const flags = {}; + for (const flag of flagStr) + flags[flag] = true; + let ret = String(convert(d, { flags, width, modifier, memoryLimit })); + let padChar = padSpaceChars.has(conversion) ? ' ' : '0'; + let padWidth = width || padWidths[conversion] || 0; + if (flags['^']) + ret = ret.toUpperCase(); + else if (flags['#']) + ret = changeCase(ret); + if (flags['_']) + padChar = ' '; + else if (flags['0']) + padChar = '0'; + if (flags['-']) + padWidth = 0; + memoryLimit === null || memoryLimit === void 0 ? void 0 : memoryLimit.use(Number(padWidth) - ret.length); + return padStart(ret, padWidth, padChar); +} + +function getDateTimeFormat() { + return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined); +} + +// one minute in milliseconds +const OneMinute = 60000; +/** + * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS + * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3 + */ +const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/; +const monthNames = [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', + 'September', 'October', 'November', 'December' +]; +const monthNamesShort = monthNames.map(name => name.slice(0, 3)); +const dayNames = [ + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' +]; +const dayNamesShort = dayNames.map(name => name.slice(0, 3)); +/** + * A date implementation with timezone info, just like Ruby date + * + * Implementation: + * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods + * - rewrite getTimezoneOffset() to trick strftime + */ +class LiquidDate { + constructor(init, locale, timezone) { + this.locale = locale; + this.DateTimeFormat = getDateTimeFormat(); + this.date = new Date(init); + this.timezoneFixed = timezone !== undefined; + if (timezone === undefined) { + timezone = this.date.getTimezoneOffset(); + } + this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone; + this.timezoneName = isString(timezone) ? timezone : ''; + const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute; + const time = this.date.getTime() + diff; + this.displayDate = new Date(time); + } + getTime() { + return this.displayDate.getTime(); + } + getMilliseconds() { + return this.displayDate.getMilliseconds(); + } + getSeconds() { + return this.displayDate.getSeconds(); + } + getMinutes() { + return this.displayDate.getMinutes(); + } + getHours() { + return this.displayDate.getHours(); + } + getDay() { + return this.displayDate.getDay(); + } + getDate() { + return this.displayDate.getDate(); + } + getMonth() { + return this.displayDate.getMonth(); + } + getFullYear() { + return this.displayDate.getFullYear(); + } + toLocaleString(locale, init) { + if (init === null || init === void 0 ? void 0 : init.timeZone) { + return this.date.toLocaleString(locale, init); + } + return this.displayDate.toLocaleString(locale, init); + } + toLocaleTimeString(locale) { + return this.displayDate.toLocaleTimeString(locale); + } + toLocaleDateString(locale) { + return this.displayDate.toLocaleDateString(locale); + } + getTimezoneOffset() { + return this.timezoneOffset; + } + getTimeZoneName() { + if (this.timezoneFixed) + return this.timezoneName; + if (!this.DateTimeFormat) + return; + return this.DateTimeFormat().resolvedOptions().timeZone; + } + getLongMonthName() { + var _a; + return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()]; + } + getShortMonthName() { + var _a; + return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()]; + } + getLongWeekdayName() { + var _a; + return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()]; + } + getShortWeekdayName() { + var _a; + return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()]; + } + valid() { + return !isNaN(this.getTime()); + } + format(options) { + return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate); + } + /** + * Create a Date object fixed to it's declared Timezone. Both + * - 2021-08-06T02:29:00.000Z and + * - 2021-08-06T02:29:00.000+08:00 + * will always be displayed as + * - 2021-08-06 02:29:00 + * regardless timezoneOffset in JavaScript realm + * + * The implementation hack: + * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`, + * we create a different Date to trick strftime, it's both simpler and more performant. + * Given that a template is expected to be parsed fewer times than rendered. + */ + static createDateFixedToTimezone(dateString, locale) { + const m = dateString.match(TIMEZONE_PATTERN); + // representing a UTC timestamp + if (m && m[1] === 'Z') { + return new LiquidDate(+new Date(dateString), locale, 0); + } + // has a timezone specified + if (m && m[2] && m[3] && m[4]) { + const [, , sign, hours, minutes] = m; + const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10)); + return new LiquidDate(+new Date(dateString), locale, offset); + } + return new LiquidDate(dateString, locale); + } + static getTimezoneOffset(timezoneName, date) { + const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName }); + const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' }); + const localDate = new Date(localDateString); + const utcDate = new Date(utcDateString); + return (+utcDate - +localDate) / (60 * 1000); + } +} + +class Limiter { + constructor(resource, limit) { + this.base = 0; + this.message = `${resource} limit exceeded`; + this.limit = limit; + } + use(count) { + if (+count > 0) { + assert(this.base + +count <= this.limit, this.message); + this.base += +count; + } + } + check(count) { + if (+count > 0) { + assert(+count <= this.limit, this.message); + } + } +} + +class DelimitedToken extends Token { + constructor(kind, [contentBegin, contentEnd], input, begin, end, trimLeft, trimRight, file) { + super(kind, input, begin, end, file); + this.trimLeft = false; + this.trimRight = false; + const tl = input[contentBegin] === '-'; + const tr = input[contentEnd - 1] === '-'; + let l = tl ? contentBegin + 1 : contentBegin; + let r = tr ? contentEnd - 1 : contentEnd; + while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) + l++; + while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) + r--; + this.contentRange = [l, r]; + this.trimLeft = tl || trimLeft; + this.trimRight = tr || trimRight; + } + get content() { + return this.input.slice(this.contentRange[0], this.contentRange[1]); + } +} + +class TagToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options; + const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]; + super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file); + this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange); + this.name = this.tokenizer.readTagName(); + this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`); + this.tokenizer.skipBlank(); + this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + } +} + +class OutputToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options; + const valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]; + super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file); + } +} + +class HTMLToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.HTML, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.trimLeft = 0; + this.trimRight = 0; + } + getContent() { + return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight); + } +} + +class NumberToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Number, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = Number(this.getText()); + } +} + +class IdentifierToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Word, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = this.getText(); + } +} + +class LiteralToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Literal, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.literal = this.getText(); + this.content = literalValues[this.literal]; + } +} + +const operatorPrecedences = { + '==': 2, + '!=': 2, + '>': 2, + '<': 2, + '>=': 2, + '<=': 2, + 'contains': 2, + 'not': 1, + 'and': 0, + 'or': 0 +}; +const operatorTypes = { + '==': 0 /* OperatorType.Binary */, + '!=': 0 /* OperatorType.Binary */, + '>': 0 /* OperatorType.Binary */, + '<': 0 /* OperatorType.Binary */, + '>=': 0 /* OperatorType.Binary */, + '<=': 0 /* OperatorType.Binary */, + 'contains': 0 /* OperatorType.Binary */, + 'not': 1 /* OperatorType.Unary */, + 'and': 0 /* OperatorType.Binary */, + 'or': 0 /* OperatorType.Binary */ +}; +class OperatorToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Operator, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.operator = this.getText(); + } + getPrecedence() { + const key = this.getText(); + return key in operatorPrecedences ? operatorPrecedences[key] : 1; + } +} + +class PropertyAccessToken extends Token { + constructor(variable, props, input, begin, end, file) { + super(TokenKind.PropertyAccess, input, begin, end, file); + this.variable = variable; + this.props = props; + } +} + +class FilterToken extends Token { + constructor(name, args, input, begin, end, file) { + super(TokenKind.Filter, input, begin, end, file); + this.name = name; + this.args = args; + } +} + +class HashToken extends Token { + constructor(input, begin, end, name, value, file) { + super(TokenKind.Hash, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.name = name; + this.value = value; + this.file = file; + } +} + +const rHex = /[\da-fA-F]/; +const rOct = /[0-7]/; +const escapeChar = { + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + v: '\x0B' +}; +function hexVal(c) { + const code = c.charCodeAt(0); + if (code >= 97) + return code - 87; + if (code >= 65) + return code - 55; + return code - 48; +} +function parseStringLiteral(str) { + let ret = ''; + for (let i = 1; i < str.length - 1; i++) { + if (str[i] !== '\\') { + ret += str[i]; + continue; + } + if (escapeChar[str[i + 1]] !== undefined) { + ret += escapeChar[str[++i]]; + } + else if (str[i + 1] === 'u') { + let val = 0; + let j = i + 2; + while (j <= i + 5 && rHex.test(str[j])) { + val = val * 16 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + else if (!rOct.test(str[i + 1])) { + ret += str[++i]; + } + else { + let j = i + 1; + let val = 0; + while (j <= i + 3 && rOct.test(str[j])) { + val = val * 8 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + } + return ret; +} + +class QuotedToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Quoted, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = parseStringLiteral(this.getText()); + } +} + +class RangeToken extends Token { + constructor(input, begin, end, lhs, rhs, file) { + super(TokenKind.Range, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.lhs = lhs; + this.rhs = rhs; + this.file = file; + } +} + +/** + * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}` + */ +class LiquidTagToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file); + this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange); + this.name = this.tokenizer.readTagName(); + this.tokenizer.assert(this.name, 'illegal liquid tag syntax'); + this.tokenizer.skipBlank(); + } + get args() { + return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + } +} + +/** + * value expression with optional filters + * e.g. + * {% assign foo="bar" | append: "coo" %} + */ +class FilteredValueToken extends Token { + constructor(initial, filters, input, begin, end, file) { + super(TokenKind.FilteredValue, input, begin, end, file); + this.initial = initial; + this.filters = filters; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } +} + +const polyfill = { + now: () => Date.now() +}; +function getPerformance() { + return (typeof global === 'object' && global.performance) || + (typeof window === 'object' && window.performance) || + polyfill; +} + +class Render { + renderTemplatesToNodeStream(templates, ctx) { + const emitter = new StreamedEmitter(); + Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter))) + .then(() => emitter.end(), err => emitter.error(err)); + return emitter.stream; + } + *renderTemplates(templates, ctx, emitter) { + if (!emitter) { + emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter(); + } + ctx.renderLimit.check(getPerformance().now()); + const errors = []; + for (const tpl of templates) { + ctx.renderLimit.check(getPerformance().now()); + try { + // if tpl.render supports emitter, it'll return empty `html` + const html = yield tpl.render(ctx, emitter); + // if not, it'll return an `html`, write to the emitter for it + html && emitter.write(html); + if (ctx.breakCalled || ctx.continueCalled) + break; + } + catch (e) { + const err = LiquidError.is(e) ? e : new RenderError(e, tpl); + if (ctx.opts.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) { + throw new LiquidErrors(errors); + } + return emitter.buffer; + } +} + +class Expression { + constructor(tokens) { + this.postfix = [...toPostfix(tokens)]; + } + *evaluate(ctx, lenient) { + assert(ctx, 'unable to evaluate: context not defined'); + const operands = []; + for (const token of this.postfix) { + if (isOperatorToken(token)) { + const r = operands.pop(); + let result; + if (operatorTypes[token.operator] === 1 /* OperatorType.Unary */) { + result = yield ctx.opts.operators[token.operator](r, ctx); + } + else { + const l = operands.pop(); + result = yield ctx.opts.operators[token.operator](l, r, ctx); + } + operands.push(result); + } + else { + operands.push(yield evalToken(token, ctx, lenient)); + } + } + return operands[0]; + } + valid() { + return !!this.postfix.length; + } +} +function* evalToken(token, ctx, lenient = false) { + if (!token) + return; + if ('content' in token) + return token.content; + if (isPropertyAccessToken(token)) + return yield evalPropertyAccessToken(token, ctx, lenient); + if (isRangeToken(token)) + return yield evalRangeToken(token, ctx); +} +function* evalPropertyAccessToken(token, ctx, lenient) { + const props = []; + for (const prop of token.props) { + props.push((yield evalToken(prop, ctx, false))); + } + try { + if (token.variable) { + const variable = yield evalToken(token.variable, ctx, lenient); + return yield ctx._getFromScope(variable, props); + } + else { + return yield ctx._get(props); + } + } + catch (e) { + if (lenient && e.name === 'InternalUndefinedVariableError') + return null; + throw (new UndefinedVariableError(e, token)); + } +} +function evalQuotedToken(token) { + return token.content; +} +function* evalRangeToken(token, ctx) { + const low = yield evalToken(token.lhs, ctx); + const high = yield evalToken(token.rhs, ctx); + ctx.memoryLimit.use(high - low + 1); + return range(+low, +high + 1); +} +function* toPostfix(tokens) { + const ops = []; + for (const token of tokens) { + if (isOperatorToken(token)) { + while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) { + yield ops.pop(); + } + ops.push(token); + } + else + yield token; + } + while (ops.length) { + yield ops.pop(); + } +} + +function isTruthy(val, ctx) { + return !isFalsy(val, ctx); +} +function isFalsy(val, ctx) { + val = toValue(val); + if (ctx.opts.jsTruthy) { + return !val; + } + else { + return val === false || undefined === val || val === null; + } +} + +const defaultOperators = { + '==': equals, + '!=': (l, r) => !equals(l, r), + '>': (l, r) => { + if (isComparable(l)) + return l.gt(r); + if (isComparable(r)) + return r.lt(l); + return toValue(l) > toValue(r); + }, + '<': (l, r) => { + if (isComparable(l)) + return l.lt(r); + if (isComparable(r)) + return r.gt(l); + return toValue(l) < toValue(r); + }, + '>=': (l, r) => { + if (isComparable(l)) + return l.geq(r); + if (isComparable(r)) + return r.leq(l); + return toValue(l) >= toValue(r); + }, + '<=': (l, r) => { + if (isComparable(l)) + return l.leq(r); + if (isComparable(r)) + return r.geq(l); + return toValue(l) <= toValue(r); + }, + 'contains': (l, r) => { + l = toValue(l); + if (isArray(l)) + return l.some((i) => equals(i, r)); + if (isFunction(l === null || l === void 0 ? void 0 : l.indexOf)) + return l.indexOf(toValue(r)) > -1; + return false; + }, + 'not': (v, ctx) => isFalsy(toValue(v), ctx), + 'and': (l, r, ctx) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx), + 'or': (l, r, ctx) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx) +}; +function equals(lhs, rhs) { + if (isComparable(lhs)) + return lhs.equals(rhs); + if (isComparable(rhs)) + return rhs.equals(lhs); + lhs = toValue(lhs); + rhs = toValue(rhs); + if (isArray(lhs)) { + return isArray(rhs) && arrayEquals(lhs, rhs); + } + return lhs === rhs; +} +function arrayEquals(lhs, rhs) { + if (lhs.length !== rhs.length) + return false; + return !lhs.some((value, i) => !equals(value, rhs[i])); +} +function arrayIncludes(arr, item) { + return arr.some(value => equals(value, item)); +} + +class Node { + constructor(key, value, next, prev) { + this.key = key; + this.value = value; + this.next = next; + this.prev = prev; + } +} +class LRU { + constructor(limit, size = 0) { + this.limit = limit; + this.size = size; + this.cache = {}; + this.head = new Node('HEAD', null, null, null); + this.tail = new Node('TAIL', null, null, null); + this.head.next = this.tail; + this.tail.prev = this.head; + } + write(key, value) { + if (this.cache[key]) { + this.cache[key].value = value; + } + else { + const node = new Node(key, value, this.head.next, this.head); + this.head.next.prev = node; + this.head.next = node; + this.cache[key] = node; + this.size++; + this.ensureLimit(); + } + } + read(key) { + if (!this.cache[key]) + return; + const { value } = this.cache[key]; + this.remove(key); + this.write(key, value); + return value; + } + remove(key) { + const node = this.cache[key]; + node.prev.next = node.next; + node.next.prev = node.prev; + delete this.cache[key]; + this.size--; + } + clear() { + this.head.next = this.tail; + this.tail.prev = this.head; + this.size = 0; + this.cache = {}; + } + ensureLimit() { + if (this.size > this.limit) + this.remove(this.tail.prev.key); + } +} + +function domResolve(root, path) { + const base = document.createElement('base'); + base.href = root; + const head = document.getElementsByTagName('head')[0]; + head.insertBefore(base, head.firstChild); + const a = document.createElement('a'); + a.href = path; + const resolved = a.href; + head.removeChild(base); + return resolved; +} +function resolve(root, filepath, ext) { + if (root.length && last(root) !== '/') + root += '/'; + const url = domResolve(root, filepath); + return url.replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/, (str, origin, path) => { + const last = path.split('/').pop(); + if (/\.\w+$/.test(last)) + return str; + return origin + path + ext; + }); +} +function readFile(url) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(xhr.responseText); + } + else { + reject(new Error(xhr.statusText)); + } + }; + xhr.onerror = () => { + reject(new Error('An error occurred whilst receiving the response.')); + }; + xhr.open('GET', url); + xhr.send(); + }); + }); +} +function readFileSync(url) { + const xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(); + if (xhr.status < 200 || xhr.status >= 300) { + throw new Error(xhr.statusText); + } + return xhr.responseText; +} +function exists(filepath) { + return __awaiter(this, void 0, void 0, function* () { + return true; + }); +} +function existsSync(filepath) { + return true; +} +function dirname(filepath) { + return domResolve(filepath, '.'); +} +const sep = '/'; + +var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + resolve: resolve, + readFile: readFile, + readFileSync: readFileSync, + exists: exists, + existsSync: existsSync, + dirname: dirname, + sep: sep +}); + +function defaultFilter(value, defaultValue, ...args) { + value = toValue(value); + if (isArray(value) || isString(value)) + return value.length ? value : defaultValue; + if (value === false && (new Map(args)).get('allow_false')) + return false; + return isFalsy(value, this.context) ? defaultValue : value; +} +function json(value, space = 0) { + return JSON.stringify(value, null, space); +} +function inspect(value, space = 0) { + const ancestors = []; + return JSON.stringify(value, function (_key, value) { + if (typeof value !== 'object' || value === null) + return value; + // `this` is the object that value is contained in, i.e., its direct parent. + while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) + ancestors.pop(); + if (ancestors.includes(value)) + return '[Circular]'; + ancestors.push(value); + return value; + }, space); +} +function to_integer(value) { + return Number(value); +} +const raw = { + raw: true, + handler: identify +}; +var misc = { + default: defaultFilter, + raw, + jsonify: json, + to_integer, + json, + inspect +}; + +const escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +const unescapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" +}; +function escape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&|<|>|"|'/g, m => escapeMap[m]); +} +function xml_escape(str) { + return escape.call(this, str); +} +function unescape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]); +} +function escape_once(str) { + return escape.call(this, unescape.call(this, str)); +} +function newline_to_br(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, '
    \n'); +} +// Raw-text blocks (HTML5) plus '<...>' as the catch-all kind; a regex +// equivalent is O(n^2) in V8 on unclosed openers. +function strip_html(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + const blocks = new Map([[''], [''], [''], ['<', '>']]); + let out = ''; + let i = 0; + while (i < str.length) { + const lt = str.indexOf('<', i); + if (lt < 0) + return out + str.slice(i); + out += str.slice(i, lt); + for (const [opener, closer] of blocks) { + if (!str.startsWith(opener, lt)) + continue; + const e = str.indexOf(closer, lt + opener.length); + if (e >= 0) { + i = e + closer.length; + break; + } + blocks.delete(opener); + } + if (i === lt) + return out + str.slice(lt); + } + return out; +} + +var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html +}); + +class MapFS { + constructor(mapping) { + this.mapping = mapping; + this.sep = '/'; + } + exists(filepath) { + return __awaiter(this, void 0, void 0, function* () { + return this.existsSync(filepath); + }); + } + existsSync(filepath) { + return !isNil(this.mapping[filepath]); + } + readFile(filepath) { + return __awaiter(this, void 0, void 0, function* () { + return this.readFileSync(filepath); + }); + } + readFileSync(filepath) { + const content = this.mapping[filepath]; + if (isNil(content)) + throw new Error(`ENOENT: ${filepath}`); + return content; + } + dirname(filepath) { + const segments = filepath.split(this.sep); + segments.pop(); + return segments.join(this.sep); + } + resolve(dir, file, ext) { + file += ext; + if (dir === '.') + return file; + const segments = dir.split(/\/+/); + for (const segment of file.split(this.sep)) { + if (segment === '.' || segment === '') + continue; + else if (segment === '..') { + if (segments.length > 1 || segments[0] !== '') + segments.pop(); + } + else + segments.push(segment); + } + return segments.join(this.sep); + } +} + +const defaultOptions = { + root: ['.'], + layouts: ['.'], + partials: ['.'], + relativeReference: true, + jekyllInclude: false, + keyValueSeparator: ':', + cache: undefined, + extname: '', + fs: fs, + dynamicPartials: true, + jsTruthy: false, + dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z', + locale: '', + trimTagRight: false, + trimTagLeft: false, + trimOutputRight: false, + trimOutputLeft: false, + greedy: true, + tagDelimiterLeft: '{%', + tagDelimiterRight: '%}', + outputDelimiterLeft: '{{', + outputDelimiterRight: '}}', + preserveTimezones: false, + strictFilters: false, + strictVariables: false, + ownPropertyOnly: true, + lenientIf: false, + globals: {}, + keepOutputType: false, + operators: defaultOperators, + memoryLimit: Infinity, + parseLimit: Infinity, + renderLimit: Infinity +}; +function normalize(options) { + var _a, _b; + if (options.hasOwnProperty('root')) { + if (!options.hasOwnProperty('partials')) + options.partials = options.root; + if (!options.hasOwnProperty('layouts')) + options.layouts = options.root; + } + if (options.hasOwnProperty('cache')) { + let cache; + if (typeof options.cache === 'number') + cache = options.cache > 0 ? new LRU(options.cache) : undefined; + else if (typeof options.cache === 'object') + cache = options.cache; + else + cache = options.cache ? new LRU(1024) : undefined; + options.cache = cache; + } + options = Object.assign(Object.assign(Object.assign({}, defaultOptions), (options.jekyllInclude ? { dynamicPartials: false } : {})), options); + if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) { + console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning'); + options.relativeReference = false; + } + options.root = normalizeDirectoryList(options.root); + options.partials = normalizeDirectoryList(options.partials); + options.layouts = normalizeDirectoryList(options.layouts); + options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape); + if (!options.locale) { + options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US'; + } + if (options.templates) { + options.fs = new MapFS(options.templates); + options.relativeReference = true; + options.root = options.partials = options.layouts = '.'; + } + return options; +} +function getOutputEscapeFunction(nameOrFunction) { + if (nameOrFunction === 'escape') + return escape; + if (nameOrFunction === 'json') + return misc.json; + assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function'); + return nameOrFunction; +} +function normalizeDirectoryList(value) { + let list = []; + if (isArray(value)) + list = value; + if (isString(value)) + list = [value]; + return list; +} + +function whiteSpaceCtrl(tokens, options) { + let inRaw = false; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (!isDelimitedToken(token)) + continue; + if (!inRaw && token.trimLeft) { + trimLeft(tokens[i - 1], options.greedy); + } + if (isTagToken(token)) { + if (token.name === 'raw') + inRaw = true; + else if (token.name === 'endraw') + inRaw = false; + } + if (!inRaw && token.trimRight) { + trimRight(tokens[i + 1], options.greedy); + } + } +} +function trimLeft(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + const mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) + token.trimRight++; +} +function trimRight(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + const mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) + token.trimLeft++; + if (token.input.charAt(token.begin + token.trimLeft) === '\n') + token.trimLeft++; +} + +class Tokenizer { + constructor(input, operators = defaultOptions.operators, file, range) { + this.input = input; + this.file = file; + this.rawBeginAt = -1; + this.p = range ? range[0] : 0; + this.N = range ? range[1] : input.length; + this.opTrie = createTrie(operators); + this.literalTrie = createTrie(literalValues); + } + readExpression() { + return new Expression(this.readExpressionTokens()); + } + *readExpressionTokens() { + while (this.p < this.N) { + const operator = this.readOperator(); + if (operator) { + yield operator; + continue; + } + const operand = this.readValue(); + if (operand) { + yield operand; + continue; + } + return; + } + } + readOperator() { + this.skipBlank(); + const end = this.matchTrie(this.opTrie); + if (end === -1) + return; + return new OperatorToken(this.input, this.p, (this.p = end), this.file); + } + matchTrie(trie) { + let node = trie; + let i = this.p; + let info; + while (node[this.input[i]] && i < this.N) { + node = node[this.input[i++]]; + if (node['end']) + info = node; + } + if (!info) + return -1; + if (info['needBoundary'] && isWord(this.peek(i - this.p))) + return -1; + return i; + } + readFilteredValue() { + const begin = this.p; + const initial = this.readExpression(); + this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`); + const filters = this.readFilters(); + return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file); + } + readFilters() { + const filters = []; + while (true) { + const filter = this.readFilter(); + if (!filter) + return filters; + filters.push(filter); + } + } + readFilter() { + this.skipBlank(); + if (this.end()) + return null; + this.assert(this.read() === '|', `expected "|" before filter`); + const name = this.readIdentifier(); + if (!name.size()) { + this.assert(this.end(), `expected filter name`); + return null; + } + const args = []; + this.skipBlank(); + if (this.peek() === ':') { + do { + ++this.p; + const arg = this.readFilterArg(); + arg && args.push(arg); + this.skipBlank(); + this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`); + } while (this.peek() === ','); + } + else if (this.peek() === '|' || this.end()) ; + else { + throw this.error('expected ":" after filter name'); + } + return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file); + } + readFilterArg() { + const key = this.readValue(); + if (!key) + return; + this.skipBlank(); + if (this.peek() !== ':') + return key; + ++this.p; + const value = this.readValue(); + return [key.getText(), value]; + } + readTopLevelTokens(options = defaultOptions) { + const tokens = []; + while (this.p < this.N) { + const token = this.readTopLevelToken(options); + tokens.push(token); + } + whiteSpaceCtrl(tokens, options); + return tokens; + } + readTopLevelToken(options) { + const { tagDelimiterLeft, outputDelimiterLeft } = options; + if (this.rawBeginAt > -1) + return this.readEndrawOrRawContent(options); + if (this.match(tagDelimiterLeft)) + return this.readTagToken(options); + if (this.match(outputDelimiterLeft)) + return this.readOutputToken(options); + return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]); + } + readHTMLToken(stopStrings) { + const begin = this.p; + while (this.p < this.N) { + if (stopStrings.some(str => this.match(str))) + break; + ++this.p; + } + return new HTMLToken(this.input, begin, this.p, this.file); + } + readTagToken(options) { + const { file, input } = this; + const begin = this.p; + if (this.readToDelimiter(options.tagDelimiterRight) === -1) { + throw this.error(`tag ${this.snapshot(begin)} not closed`, begin); + } + const token = new TagToken(input, begin, this.p, options, file); + if (token.name === 'raw') + this.rawBeginAt = begin; + return token; + } + readToDelimiter(delimiter, respectQuoted = false) { + this.skipBlank(); + while (this.p < this.N) { + if (respectQuoted && (this.peekType() & QUOTE)) { + this.readQuoted(); + continue; + } + ++this.p; + if (this.rmatch(delimiter)) + return this.p; + } + return -1; + } + readOutputToken(options = defaultOptions) { + const { file, input } = this; + const { outputDelimiterRight } = options; + const begin = this.p; + if (this.readToDelimiter(outputDelimiterRight, true) === -1) { + throw this.error(`output ${this.snapshot(begin)} not closed`, begin); + } + return new OutputToken(input, begin, this.p, options, file); + } + readEndrawOrRawContent(options) { + const { tagDelimiterLeft, tagDelimiterRight } = options; + const begin = this.p; + let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + while (this.p < this.N) { + if (this.readIdentifier().getText() !== 'endraw') { + leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + continue; + } + while (this.p <= this.N) { + if (this.rmatch(tagDelimiterRight)) { + const end = this.p; + if (begin === leftPos) { + this.rawBeginAt = -1; + return new TagToken(this.input, begin, end, options, this.file); + } + else { + this.p = leftPos; + return new HTMLToken(this.input, begin, leftPos, this.file); + } + } + if (this.rmatch(tagDelimiterLeft)) + break; + this.p++; + } + } + throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin); + } + readLiquidTagTokens(options = defaultOptions) { + const tokens = []; + while (this.p < this.N) { + const token = this.readLiquidTagToken(options); + token && tokens.push(token); + } + return tokens; + } + readLiquidTagToken(options) { + this.skipBlank(); + if (this.end()) + return; + const begin = this.p; + this.readToDelimiter('\n'); + const end = this.p; + return new LiquidTagToken(this.input, begin, end, options, this.file); + } + error(msg, pos = this.p) { + return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file)); + } + assert(pred, msg, pos) { + if (!pred) + throw this.error(typeof msg === 'function' ? msg() : msg, pos); + } + snapshot(begin = this.p) { + return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32)); + } + /** + * @deprecated use #readIdentifier instead + */ + readWord() { + return this.readIdentifier(); + } + readIdentifier() { + this.skipBlank(); + const begin = this.p; + while (!this.end() && isWord(this.peek())) + ++this.p; + return new IdentifierToken(this.input, begin, this.p, this.file); + } + readNonEmptyIdentifier() { + const id = this.readIdentifier(); + return id.size() ? id : undefined; + } + readTagName() { + this.skipBlank(); + // Handle inline comment tags + if (this.input[this.p] === '#') + return this.input.slice(this.p, ++this.p); + return this.readIdentifier().getText(); + } + readHashes(jekyllStyle) { + const hashes = []; + while (true) { + const hash = this.readHash(jekyllStyle); + if (!hash) + return hashes; + hashes.push(hash); + } + } + readHash(jekyllStyle) { + this.skipBlank(); + if (this.peek() === ',') + ++this.p; + const begin = this.p; + const name = this.readNonEmptyIdentifier(); + if (!name) + return; + let value; + this.skipBlank(); + const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':'); + if (this.peek() === sep) { + ++this.p; + value = this.readValue(); + } + return new HashToken(this.input, begin, this.p, name, value, this.file); + } + remaining() { + return this.input.slice(this.p, this.N); + } + advance(step = 1) { + this.p += step; + } + end() { + return this.p >= this.N; + } + read() { + return this.input[this.p++]; + } + readTo(end) { + while (this.p < this.N) { + ++this.p; + if (this.rmatch(end)) + return this.p; + } + return -1; + } + readValue() { + this.skipBlank(); + const begin = this.p; + const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber(); + const props = this.readProperties(!variable); + if (!props.length) + return variable; + return new PropertyAccessToken(variable, props, this.input, begin, this.p); + } + readScopeValue() { + this.skipBlank(); + const begin = this.p; + const props = this.readProperties(); + if (!props.length) + return undefined; + return new PropertyAccessToken(undefined, props, this.input, begin, this.p); + } + readProperties(isBegin = true) { + const props = []; + while (true) { + if (this.peek() === '[') { + this.p++; + const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file); + this.assert(this.readTo(']') !== -1, '[ not closed'); + props.push(prop); + continue; + } + if (isBegin && !props.length) { + const prop = this.readNonEmptyIdentifier(); + if (prop) { + props.push(prop); + continue; + } + } + if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax + this.p++; + const prop = this.readNonEmptyIdentifier(); + if (!prop) + break; + props.push(prop); + continue; + } + break; + } + return props; + } + readNumber() { + this.skipBlank(); + let decimalFound = false; + let digitFound = false; + let n = 0; + if (this.peekType() & SIGN) + n++; + while (this.p + n <= this.N) { + if (this.peekType(n) & NUMBER) { + digitFound = true; + n++; + } + else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') { + if (decimalFound || !digitFound) + return; + decimalFound = true; + n++; + } + else + break; + } + if (digitFound && !isWord(this.peek(n))) { + const num = new NumberToken(this.input, this.p, this.p + n, this.file); + this.advance(n); + return num; + } + } + readLiteral() { + this.skipBlank(); + const end = this.matchTrie(this.literalTrie); + if (end === -1) + return; + const literal = new LiteralToken(this.input, this.p, end, this.file); + this.p = end; + return literal; + } + readRange() { + this.skipBlank(); + const begin = this.p; + if (this.peek() !== '(') + return; + ++this.p; + const lhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax'); + const rhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === ')', 'invalid range syntax'); + return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file); + } + readValueOrThrow() { + const value = this.readValue(); + this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`); + return value; + } + readQuoted() { + this.skipBlank(); + const begin = this.p; + if (!(this.peekType() & QUOTE)) + return; + ++this.p; + let escaped = false; + while (this.p < this.N) { + ++this.p; + if (this.input[this.p - 1] === this.input[begin] && !escaped) + break; + if (escaped) + escaped = false; + else if (this.input[this.p - 1] === '\\') + escaped = true; + } + return new QuotedToken(this.input, begin, this.p, this.file); + } + *readFileNameTemplate(options) { + const { outputDelimiterLeft } = options; + const htmlStopStrings = [',', ' ', '\r', '\n', '\t', outputDelimiterLeft]; + const htmlStopStringSet = new Set(htmlStopStrings); + // break on ',' and ' ', outputDelimiterLeft only stops HTML token + while (this.p < this.N && !htmlStopStringSet.has(this.peek())) { + yield this.match(outputDelimiterLeft) + ? this.readOutputToken(options) + : this.readHTMLToken(htmlStopStrings); + } + } + match(word) { + for (let i = 0; i < word.length; i++) { + if (word[i] !== this.input[this.p + i]) + return false; + } + return true; + } + rmatch(pattern) { + for (let i = 0; i < pattern.length; i++) { + if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) + return false; + } + return true; + } + peekType(n = 0) { + return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]; + } + peek(n = 0) { + return this.p + n >= this.N ? '' : this.input[this.p + n]; + } + skipBlank() { + while (this.peekType() & BLANK) + ++this.p; + } +} + +class ParseStream { + constructor(tokens, parseToken) { + this.handlers = {}; + this.stopRequested = false; + this.tokens = tokens; + this.parseToken = parseToken; + } + on(name, cb) { + this.handlers[name] = cb; + return this; + } + trigger(event, arg) { + const h = this.handlers[event]; + return h ? (h.call(this, arg), true) : false; + } + start() { + this.trigger('start'); + let token; + while (!this.stopRequested && (token = this.tokens.shift())) { + if (this.trigger('token', token)) + continue; + if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) { + continue; + } + const template = this.parseToken(token, this.tokens); + this.trigger('template', template); + } + if (!this.stopRequested) + this.trigger('end'); + return this; + } + stop() { + this.stopRequested = true; + return this; + } +} + +class TemplateImpl { + constructor(token) { + this.token = token; + } +} + +class Tag extends TemplateImpl { + constructor(token, remainTokens, liquid) { + super(token); + this.name = token.name; + this.liquid = liquid; + this.tokenizer = token.tokenizer; + } +} + +/** + * Key-Value Pairs Representing Tag Arguments + * Example: + * For the markup `, foo:'bar', coo:2 reversed %}`, + * hash['foo'] === 'bar' + * hash['coo'] === 2 + * hash['reversed'] === undefined + */ +class Hash { + constructor(input, jekyllStyle) { + this.hash = {}; + const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {}); + for (const hash of tokenizer.readHashes(jekyllStyle)) { + this.hash[hash.name.content] = hash.value; + } + } + *render(ctx) { + const hash = {}; + for (const key of Object.keys(this.hash)) { + hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx); + } + return hash; + } +} + +function createTagClass(options) { + return class extends Tag { + constructor(token, tokens, liquid) { + super(token, tokens, liquid); + if (isFunction(options.parse)) { + options.parse.call(this, token, tokens); + } + } + *render(ctx, emitter) { + const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)); + return yield options.render.call(this, ctx, emitter, hash); + } + }; +} + +function isKeyValuePair(arr) { + return isArray(arr); +} + +class Filter { + constructor(token, options, liquid) { + this.token = token; + this.name = token.name; + this.handler = isFunction(options) + ? options + : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify); + this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw); + this.args = token.args; + this.liquid = liquid; + } + *render(value, context) { + const argv = []; + for (const arg of this.args) { + if (isKeyValuePair(arg)) + argv.push([arg[0], yield evalToken(arg[1], context)]); + else + argv.push(yield evalToken(arg, context)); + } + return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv]); + } +} + +class Value { + /** + * @param str the value to be valuated, eg.: "foobar" | truncate: 3 + */ + constructor(input, liquid) { + this.filters = []; + const token = typeof input === 'string' + ? new Tokenizer(input, liquid.options.operators).readFilteredValue() + : input; + this.initial = token.initial; + this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid)); + } + *value(ctx, lenient) { + lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default'); + let val = yield this.initial.evaluate(ctx, lenient); + for (const filter of this.filters) { + val = yield filter.render(val, ctx); + } + return val; + } + getFilter(liquid, name) { + const impl = liquid.filters[name]; + assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`); + return impl; + } +} + +class Output extends TemplateImpl { + constructor(token, liquid) { + var _a; + super(token); + const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange); + this.value = new Value(tokenizer.readFilteredValue(), liquid); + const filters = this.value.filters; + const outputEscape = liquid.options.outputEscape; + if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) { + const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0); + filters.push(new Filter(token, outputEscape, liquid)); + } + } + *render(ctx, emitter) { + const val = yield this.value.value(ctx, false); + emitter.write(val); + } + *arguments() { + yield this.value; + } +} + +class HTML extends TemplateImpl { + constructor(token) { + super(token); + this.str = token.getContent(); + } + *render(ctx, emitter) { + emitter.write(this.str); + } +} + +/** + * A variable's segments and location, which can be coerced to a string. + */ +class Variable { + constructor(segments, location) { + this.segments = segments; + this.location = location; + } + toString() { + return segmentsString(this.segments, true); + } + /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */ + toArray() { + function* _visit(...segments) { + for (const segment of segments) { + if (segment instanceof Variable) { + yield Array.from(_visit(...segment.segments)); + } + else { + yield segment; + } + } + } + return Array.from(_visit(...this.segments)); + } +} +/** + * Group variables by the string representation of their root segment. + */ +class VariableMap { + constructor() { + this.map = new Map(); + } + get(key) { + const k = segmentsString([key.segments[0]]); + if (!this.map.has(k)) { + this.map.set(k, []); + } + return this.map.get(k); + } + has(key) { + return this.map.has(segmentsString([key.segments[0]])); + } + push(variable) { + this.get(variable).push(variable); + } + asObject() { + return Object.fromEntries(this.map); + } +} +const defaultStaticAnalysisOptions = { + partials: true +}; +function* _analyze(templates, partials, sync) { + const variables = new VariableMap(); + const globals = new VariableMap(); + const locals = new VariableMap(); + const rootScope = new DummyScope(new Set()); + // Names of partial templates that we've already analyzed. + const seen = new Set(); + function updateVariables(variable, scope) { + variables.push(variable); + const aliased = scope.alias(variable); + if (aliased !== undefined) { + const root = aliased.segments[0]; + // TODO: What if a a template renders a rendered template? Do we need scope.parent? + if (isString(root) && !rootScope.has(root)) { + globals.push(aliased); + } + } + else { + const root = variable.segments[0]; + if (isString(root) && !scope.has(root)) { + globals.push(variable); + } + } + // Recurse for nested Variables + for (const segment of variable.segments) { + if (segment instanceof Variable) { + updateVariables(segment, scope); + } + } + } + function* visit(template, scope) { + if (template.arguments) { + for (const arg of template.arguments()) { + for (const variable of extractVariables(arg)) { + updateVariables(variable, scope); + } + } + } + if (template.localScope) { + for (const ident of template.localScope()) { + scope.add(ident.content); + scope.deleteAlias(ident.content); + const [row, col] = ident.getPosition(); + locals.push(new Variable([ident.content], { row, col, file: ident.file })); + } + } + if (template.children) { + if (template.partialScope) { + const partial = template.partialScope(); + if (partial === undefined) { + // Layouts, for example, can have children that are not partials. + for (const child of (yield template.children(partials, sync))) { + yield visit(child, scope); + } + return; + } + if (seen.has(partial.name)) + return; + const partialScopeNames = new Set(); + const partialScope = partial.isolated + ? new DummyScope(partialScopeNames) + : scope.push(partialScopeNames); + for (const name of partial.scope) { + if (isString(name)) { + partialScopeNames.add(name); + } + else { + const [alias, argument] = name; + partialScopeNames.add(alias); + const variables = Array.from(extractVariables(argument)); + if (variables.length) { + partialScope.setAlias(alias, variables[0].segments); + } + } + } + for (const child of (yield template.children(partials, sync))) { + yield visit(child, partialScope); + seen.add(partial.name); + } + partialScope.pop(); + } + else { + if (template.blockScope) { + scope.push(new Set(template.blockScope())); + } + for (const child of (yield template.children(partials, sync))) { + yield visit(child, scope); + } + if (template.blockScope) { + scope.pop(); + } + } + } + } + for (const template of templates) { + yield visit(template, rootScope); + } + return { + variables: variables.asObject(), + globals: globals.asObject(), + locals: locals.asObject() + }; +} +/** + * Statically analyze a template and report variable usage. + */ +function analyze(template, options = {}) { + const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options); + return toPromise(_analyze(template, opts.partials, false)); +} +/** + * Statically analyze a template and report variable usage. + */ +function analyzeSync(template, options = {}) { + const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options); + return toValueSync(_analyze(template, opts.partials, true)); +} +/** + * A stack to manage scopes while traversing templates during static analysis. + */ +class DummyScope { + constructor(globals) { + this.stack = [{ names: globals, aliases: new Map() }]; + } + /** Return true if `name` is in scope. */ + has(name) { + for (const scope of this.stack) { + if (scope.names.has(name)) { + return true; + } + } + return false; + } + push(scope) { + this.stack.push({ names: scope, aliases: new Map() }); + return this; + } + pop() { + var _a; + return (_a = this.stack.pop()) === null || _a === void 0 ? void 0 : _a.names; + } + // Add a name to the template scope. + add(name) { + this.stack[0].names.add(name); + } + /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */ + alias(variable) { + const root = variable.segments[0]; + if (!isString(root)) + return undefined; + const alias = this.getAlias(root); + if (alias === undefined) + return undefined; + return new Variable([...alias, ...variable.segments.slice(1)], variable.location); + } + // TODO: `from` could be a path with multiple segments, like `include.x`. + setAlias(from, to) { + this.stack[this.stack.length - 1].aliases.set(from, to); + } + deleteAlias(name) { + this.stack[this.stack.length - 1].aliases.delete(name); + } + getAlias(name) { + for (const scope of this.stack) { + if (scope.aliases.has(name)) { + return scope.aliases.get(name); + } + // If a scope has defined `name`, then it masks aliases in parent scopes. + if (scope.names.has(name)) { + return undefined; + } + } + return undefined; + } +} +function* extractVariables(value) { + if (isValueToken(value)) { + yield* extractValueTokenVariables(value); + } + else if (value instanceof Value) { + yield* extractFilteredValueVariables(value); + } +} +function* extractFilteredValueVariables(value) { + for (const token of value.initial.postfix) { + if (isValueToken(token)) { + yield* extractValueTokenVariables(token); + } + } + for (const filter of value.filters) { + for (const arg of filter.args) { + if (isKeyValuePair(arg) && arg[1]) { + yield* extractValueTokenVariables(arg[1]); + } + else if (isValueToken(arg)) { + yield* extractValueTokenVariables(arg); + } + } + } +} +function* extractValueTokenVariables(token) { + if (isRangeToken(token)) { + yield* extractValueTokenVariables(token.lhs); + yield* extractValueTokenVariables(token.rhs); + } + else if (isPropertyAccessToken(token)) { + yield extractPropertyAccessVariable(token); + } +} +function extractPropertyAccessVariable(token) { + const segments = []; + // token is not guaranteed to have `file` set. We'll try to get it from a prop if not. + let file = token.file; + // Here we're flattening the first segment of a path if it is a nested path. + const root = token.props[0]; + file = file || root.file; + if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) { + segments.push(root.content); + } + else if (isPropertyAccessToken(root)) { + // Flatten paths that start with a nested path. + segments.push(...extractPropertyAccessVariable(root).segments); + } + for (const prop of token.props.slice(1)) { + file = file || prop.file; + if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) { + segments.push(prop.content); + } + else if (isPropertyAccessToken(prop)) { + segments.push(extractPropertyAccessVariable(prop)); + } + } + const [row, col] = token.getPosition(); + return new Variable(segments, { + row, + col, + file + }); +} +// This is used to detect segments that can be represented with dot notation +// when creating a string representation of VariableSegments. +const RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/; +/** + * Return a string representation of segments using dot notation where possible. + * @param segments - The property names and array indices that make up a path to a variable. + * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets. + */ +function segmentsString(segments, bracketedRoot = false) { + const buf = []; + const root = segments[0]; + if (isString(root)) { + if (!bracketedRoot || root.match(RE_PROPERTY)) { + buf.push(`${root}`); + } + else { + buf.push(`['${root}']`); + } + } + for (const segment of segments.slice(1)) { + if (segment instanceof Variable) { + buf.push(`[${segmentsString(segment.segments)}]`); + } + else if (isString(segment)) { + if (segment.match(RE_PROPERTY)) { + buf.push(`.${segment}`); + } + else { + buf.push(`['${segment}']`); + } + } + else { + buf.push(`[${segment}]`); + } + } + return buf.join(''); +} + +var LookupType; +(function (LookupType) { + LookupType["Partials"] = "partials"; + LookupType["Layouts"] = "layouts"; + LookupType["Root"] = "root"; +})(LookupType || (LookupType = {})); +class Loader { + constructor(options) { + var _a, _b, _c, _d; + this.options = options; + if (options.relativeReference) { + const sep = options.fs.sep; + assert(sep, '`fs.sep` is required for relative reference'); + const prefixes = ['.' + sep, '..' + sep, './', '../']; + this.shouldLoadRelative = (referencedFile) => prefixes.some(prefix => referencedFile.startsWith(prefix)); + } + else { + this.shouldLoadRelative = (_referencedFile) => false; + } + const fs = options.fs; + this.contains = toLiquidAsync(((_a = fs.contains) === null || _a === void 0 ? void 0 : _a.bind(fs)) || (() => __awaiter(this, void 0, void 0, function* () { return true; })), ((_b = fs.containsSync) === null || _b === void 0 ? void 0 : _b.bind(fs)) || (() => true)); + this.exists = toLiquidAsync(((_c = fs.exists) === null || _c === void 0 ? void 0 : _c.bind(fs)) || (() => __awaiter(this, void 0, void 0, function* () { return false; })), (_d = fs.existsSync) === null || _d === void 0 ? void 0 : _d.bind(fs)); + } + *lookup(file, type, sync, currentFile) { + const dirs = this.options[type]; + for (const filepath of this.candidates(file, dirs, currentFile)) { + let allowed = false; + for (const dir of dirs) { + if (yield this.contains(!!sync, dir, filepath)) { + allowed = true; + break; + } + } + if (!allowed) + continue; + if (yield this.exists(!!sync, filepath)) + return filepath; + } + throw this.lookupError(file, dirs); + } + *candidates(file, dirs, currentFile) { + const { fs, extname } = this.options; + if (this.shouldLoadRelative(file) && currentFile) { + const referenced = fs.resolve(this.dirname(currentFile), file, extname); + yield referenced; + } + for (const dir of dirs) { + const referenced = fs.resolve(dir, file, extname); + yield referenced; + } + if (fs.fallback !== undefined) { + const filepath = fs.fallback(file); + if (filepath !== undefined) + yield filepath; + } + } + dirname(path) { + const fs = this.options.fs; + assert(fs.dirname, '`fs.dirname` is required for relative reference'); + return fs.dirname(path); + } + lookupError(file, roots) { + const err = new Error('ENOENT'); + err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`; + err.code = 'ENOENT'; + return err; + } +} + +class Parser { + constructor(liquid) { + var _a, _b; + this.liquid = liquid; + this.cache = this.liquid.options.cache; + this.fs = this.liquid.options.fs; + this.parseFile = this.cache ? this._parseFileCached : this._parseFile; + this.loader = new Loader(this.liquid.options); + this.parseLimit = new Limiter('parse length', liquid.options.parseLimit); + this.readFile = toLiquidAsync(((_a = this.fs.readFile) === null || _a === void 0 ? void 0 : _a.bind(this.fs)) || (() => __awaiter(this, void 0, void 0, function* () { throw new Error('readFile not implemented'); })), (_b = this.fs.readFileSync) === null || _b === void 0 ? void 0 : _b.bind(this.fs)); + } + parse(html, filepath) { + html = String(html); + this.parseLimit.use(html.length); + const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath); + const tokens = tokenizer.readTopLevelTokens(this.liquid.options); + return this.parseTokens(tokens); + } + parseTokens(tokens) { + let token; + const templates = []; + const errors = []; + while ((token = tokens.shift())) { + try { + templates.push(this.parseToken(token, tokens)); + } + catch (err) { + if (this.liquid.options.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) + throw new LiquidErrors(errors); + return templates; + } + parseToken(token, remainTokens) { + try { + if (isTagToken(token)) { + const TagClass = this.liquid.tags[token.name]; + assert(TagClass, `tag "${token.name}" not found`); + return new TagClass(token, remainTokens, this.liquid, this); + } + if (isOutputToken(token)) { + return new Output(token, this.liquid); + } + return new HTML(token); + } + catch (e) { + if (LiquidError.is(e)) + throw e; + throw new ParseError(e, token); + } + } + parseStream(tokens) { + return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens)); + } + *_parseFileCached(file, sync, type = LookupType.Root, currentFile) { + const cache = this.cache; + const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file; + const tpls = yield cache.read(key); + if (tpls) + return tpls; + const task = this._parseFile(file, sync, type, currentFile); + // sync mode: exec the task and cache the result + // async mode: cache the task before exec + const taskOrTpl = sync ? yield task : toPromise(task); + cache.write(key, taskOrTpl); + // note: concurrent tasks will be reused, cache for failed task is removed until its end + try { + return yield taskOrTpl; + } + catch (err) { + cache.remove(key); + throw err; + } + } + *_parseFile(file, sync, type = LookupType.Root, currentFile) { + const filepath = yield this.loader.lookup(file, type, sync, currentFile); + return this.parse(yield this.readFile(!!sync, filepath), filepath); + } +} + +var TokenKind; +(function (TokenKind) { + TokenKind[TokenKind["Number"] = 1] = "Number"; + TokenKind[TokenKind["Literal"] = 2] = "Literal"; + TokenKind[TokenKind["Tag"] = 4] = "Tag"; + TokenKind[TokenKind["Output"] = 8] = "Output"; + TokenKind[TokenKind["HTML"] = 16] = "HTML"; + TokenKind[TokenKind["Filter"] = 32] = "Filter"; + TokenKind[TokenKind["Hash"] = 64] = "Hash"; + TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess"; + TokenKind[TokenKind["Word"] = 256] = "Word"; + TokenKind[TokenKind["Range"] = 512] = "Range"; + TokenKind[TokenKind["Quoted"] = 1024] = "Quoted"; + TokenKind[TokenKind["Operator"] = 2048] = "Operator"; + TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue"; + TokenKind[TokenKind["Delimited"] = 12] = "Delimited"; +})(TokenKind || (TokenKind = {})); + +function isDelimitedToken(val) { + return !!(getKind(val) & TokenKind.Delimited); +} +function isOperatorToken(val) { + return getKind(val) === TokenKind.Operator; +} +function isHTMLToken(val) { + return getKind(val) === TokenKind.HTML; +} +function isOutputToken(val) { + return getKind(val) === TokenKind.Output; +} +function isTagToken(val) { + return getKind(val) === TokenKind.Tag; +} +function isQuotedToken(val) { + return getKind(val) === TokenKind.Quoted; +} +function isLiteralToken(val) { + return getKind(val) === TokenKind.Literal; +} +function isNumberToken(val) { + return getKind(val) === TokenKind.Number; +} +function isPropertyAccessToken(val) { + return getKind(val) === TokenKind.PropertyAccess; +} +function isWordToken(val) { + return getKind(val) === TokenKind.Word; +} +function isRangeToken(val) { + return getKind(val) === TokenKind.Range; +} +function isValueToken(val) { + // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range + return (getKind(val) & 1667) > 0; +} +function getKind(val) { + return val ? val.kind : -1; +} + +var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken +}); + +function createScope(from) { + const scope = Object.create(null); + if (from) + Object.assign(scope, from); + return scope; +} + +class Context { + constructor(env = {}, opts = defaultOptions, renderOptions = {}, { memoryLimit, renderLimit } = {}) { + var _a, _b, _c, _d, _e; + /** + * insert a Context-level empty scope, + * for tags like `{% capture %}` `{% assign %}` to operate + */ + this.scopes = [createScope()]; + this.registers = {}; + this.breakCalled = false; + this.continueCalled = false; + this.sync = !!renderOptions.sync; + this.opts = opts; + this.globals = (_a = renderOptions.globals) !== null && _a !== void 0 ? _a : opts.globals; + this.environments = isObject(env) ? env : Object(env); + this.strictVariables = (_b = renderOptions.strictVariables) !== null && _b !== void 0 ? _b : this.opts.strictVariables; + this.ownPropertyOnly = (_c = renderOptions.ownPropertyOnly) !== null && _c !== void 0 ? _c : opts.ownPropertyOnly; + this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_d = renderOptions.memoryLimit) !== null && _d !== void 0 ? _d : opts.memoryLimit); + this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_e = renderOptions.renderLimit) !== null && _e !== void 0 ? _e : opts.renderLimit)); + } + getRegister(key, defaultValue = undefined) { + return (this.registers[key] = this.registers[key] || defaultValue); + } + setRegister(key, value) { + return (this.registers[key] = value); + } + saveRegister(...keys) { + return keys.map(key => [key, this.getRegister(key)]); + } + restoreRegister(keyValues) { + return keyValues.forEach(([key, value]) => this.setRegister(key, value)); + } + getAll() { + return [this.globals, this.environments, ...this.scopes] + .reduce((ctx, val) => __assign(ctx, val), {}); + } + /** + * @deprecated use `_get()` or `getSync()` instead + */ + get(paths) { + return this.getSync(paths); + } + getSync(paths) { + return toValueSync(this._get(paths)); + } + *_get(paths) { + const scope = this.findScope(paths[0]); // first prop should always be a string + return yield this._getFromScope(scope, paths); + } + /** + * @deprecated use `_get()` instead + */ + getFromScope(scope, paths) { + return toValueSync(this._getFromScope(scope, paths)); + } + *_getFromScope(scope, paths, strictVariables = this.strictVariables) { + if (isString(paths)) + paths = paths.split('.'); + for (let i = 0; i < paths.length; i++) { + scope = yield this.readProperty(scope, paths[i]); + if (strictVariables && isUndefined(scope)) { + throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.')); + } + } + return scope; + } + push(ctx) { + return this.scopes.push(ctx); + } + pop() { + return this.scopes.pop(); + } + bottom() { + return this.scopes[0]; + } + spawn(scope = {}) { + return new Context(scope, this.opts, { + sync: this.sync, + globals: this.globals, + strictVariables: this.strictVariables, + ownPropertyOnly: this.ownPropertyOnly + }, { + renderLimit: this.renderLimit, + memoryLimit: this.memoryLimit + }); + } + findScope(key) { + for (let i = this.scopes.length - 1; i >= 0; i--) { + const candidate = this.scopes[i]; + if (key in candidate) + return candidate; + } + if (key in this.environments) + return this.environments; + return this.globals; + } + readProperty(obj, key) { + obj = toLiquid(obj); + key = toValue(key); + if (isNil(obj)) + return obj; + if (isArray(obj) && key < 0) + return obj[obj.length + +key]; + const value = readJSProperty(obj, key, this.ownPropertyOnly); + if (value === undefined && obj instanceof Drop) + return obj.liquidMethodMissing(key, this); + if (isFunction(value)) + return value.call(obj); + if (key === 'size') + return readSize(obj); + else if (key === 'first') + return readFirst(obj); + else if (key === 'last') + return readLast(obj); + return value; + } +} +function readJSProperty(obj, key, ownPropertyOnly) { + if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) + return undefined; + return obj[key]; +} +function readFirst(obj) { + if (isArray(obj)) + return obj[0]; + return obj['first']; +} +function readLast(obj) { + if (isArray(obj)) + return obj[obj.length - 1]; + return obj['last']; +} +function readSize(obj) { + if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) + return obj['size']; + if (isArray(obj) || isString(obj)) + return obj.length; + if (typeof obj === 'object') + return Object.keys(obj).length; +} + +var BlockMode; +(function (BlockMode) { + /* store rendered html into blocks */ + BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT"; + /* output rendered html directly */ + BlockMode[BlockMode["STORE"] = 1] = "STORE"; +})(BlockMode || (BlockMode = {})); + +const abs = argumentsToNumber(Math.abs); +const at_least = argumentsToNumber(Math.max); +const at_most = argumentsToNumber(Math.min); +const ceil = argumentsToNumber(Math.ceil); +const divided_by = argumentsToNumber((dividend, divisor, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor); +const floor = argumentsToNumber(Math.floor); +const minus = argumentsToNumber((v, arg) => v - arg); +const plus = argumentsToNumber((lhs, rhs) => lhs + rhs); +const modulo = argumentsToNumber((v, arg) => v % arg); +const times = argumentsToNumber((v, arg) => v * arg); +function round(v, arg = 0) { + v = toNumber(v); + arg = toNumber(arg); + const amp = Math.pow(10, arg); + const scaled = v * amp; + // Round half away from zero + return Math.sign(v) * Math.round(Math.abs(scaled)) / amp; +} + +var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round +}); + +const url_decode = (x) => decodeURIComponent(stringify(x)).replace(/\+/g, ' '); +const url_encode = (x) => encodeURIComponent(stringify(x)).replace(/%20/g, '+'); +const cgi_escape = (x) => encodeURIComponent(stringify(x)) + .replace(/%20/g, '+') + .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase()); +const uri_escape = (x) => encodeURI(stringify(x)) + .replace(/%5B/g, '[') + .replace(/%5D/g, ']'); +const rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug; +const rSlugifyReplacers = { + 'raw': /\s+/g, + 'default': rSlugifyDefault, + 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug, + 'ascii': /[^A-Za-z0-9]+/g, + 'latin': rSlugifyDefault, + 'none': null +}; +function slugify(str, mode = 'default', cased = false) { + str = stringify(str); + const replacer = rSlugifyReplacers[mode]; + if (replacer) { + if (mode === 'latin') + str = removeAccents(str); + str = str.replace(replacer, '-').replace(/^-|-$/g, ''); + } + return cased ? str : str.toLowerCase(); +} +function removeAccents(str) { + return str.replace(/[àáâãäå]/g, 'a') + .replace(/[æ]/g, 'ae') + .replace(/[ç]/g, 'c') + .replace(/[èéêë]/g, 'e') + .replace(/[ìíîï]/g, 'i') + .replace(/[ð]/g, 'd') + .replace(/[ñ]/g, 'n') + .replace(/[òóôõöø]/g, 'o') + .replace(/[ùúûü]/g, 'u') + .replace(/[ýÿ]/g, 'y') + .replace(/[ß]/g, 'ss') + .replace(/[œ]/g, 'oe') + .replace(/[þ]/g, 'th') + .replace(/[ẞ]/g, 'SS') + .replace(/[Œ]/g, 'OE') + .replace(/[Þ]/g, 'TH'); +} + +var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify +}); + +const join = argumentsToValue(function (v, arg) { + const array = toArray(v); + const sep = isNil(arg) ? ' ' : stringify(arg); + const complexity = array.length * (1 + sep.length); + this.context.memoryLimit.use(complexity); + return array.join(sep); +}); +const last$1 = argumentsToValue((v) => isArrayLike(v) ? last(v) : ''); +const first = argumentsToValue((v) => isArrayLike(v) ? v[0] : ''); +const reverse = argumentsToValue(function (v) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + return [...array].reverse(); +}); +function* sortBy(arr, property, comparator) { + const values = []; + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + values.push([ + item, + property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item + ]); + } + return values.sort((lhs, rhs) => comparator(lhs[1], rhs[1])).map(tuple => tuple[0]); +} +function* sort(arr, property) { + return yield* sortBy.call(this, arr, property, orderedCompare); +} +function* sort_natural(arr, property) { + return yield* sortBy.call(this, arr, property, caseInsensitiveCompare); +} +const size = (v) => (v && v.length) || 0; +function* map(arr, property) { + const results = []; + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + results.push(yield this.context._getFromScope(item, stringify(property), false)); + } + return results; +} +function* sum(arr, property) { + let sum = 0; + const array = toArray(arr); + for (const item of array) { + const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item); + sum += Number.isNaN(data) ? 0 : data; + } + return sum; +} +function compact(arr) { + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + return array.filter(x => !isNil(toValue(x))); +} +function concat(v, arg = []) { + const lhs = toArray(v); + const rhs = toArray(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs.concat(rhs); +} +function push(v, arg) { + return concat.call(this, v, [arg]); +} +function unshift(v, arg) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + const clone = [...array]; + clone.unshift(arg); + return clone; +} +function pop(v) { + const clone = [...toArray(v)]; + clone.pop(); + return clone; +} +function shift(v) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + const clone = [...array]; + clone.shift(); + return clone; +} +function slice(v, begin, length = 1) { + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + begin = begin < 0 ? v.length + begin : begin; + this.context.memoryLimit.use(length); + return v.slice(begin, begin + length); +} +function expectedMatcher(expected) { + if (this.context.opts.jekyllWhere) { + return (v) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected)); + } + else if (expected === undefined) { + return (v) => isTruthy(v, this.context); + } + else { + return (v) => equals(v, expected); + } +} +function* filter(include, arr, property, expected) { + const values = []; + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + const token = new Tokenizer(stringify(property)).readScopeValue(); + for (const item of arr) { + values.push(yield evalToken(token, this.context.spawn(item))); + } + const matcher = expectedMatcher.call(this, expected); + return arr.filter((_, i) => matcher(values[i]) === include); +} +function* filter_exp(include, arr, itemName, exp) { + const filtered = []; + const keyTemplate = new Value(stringify(exp), this.liquid); + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + this.context.push({ [itemName]: item }); + const value = yield keyTemplate.value(this.context); + this.context.pop(); + if (value === include) + filtered.push(item); + } + return filtered; +} +function* where(arr, property, expected) { + return yield* filter.call(this, true, arr, property, expected); +} +function* reject(arr, property, expected) { + return yield* filter.call(this, false, arr, property, expected); +} +function* where_exp(arr, itemName, exp) { + return yield* filter_exp.call(this, true, arr, itemName, exp); +} +function* reject_exp(arr, itemName, exp) { + return yield* filter_exp.call(this, false, arr, itemName, exp); +} +function* group_by(arr, property) { + const map = new Map(); + arr = toEnumerable(arr); + const token = new Tokenizer(stringify(property)).readScopeValue(); + this.context.memoryLimit.use(arr.length); + for (const item of arr) { + const key = yield evalToken(token, this.context.spawn(item)); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + } + return [...map.entries()].map(([name, items]) => ({ name, items })); +} +function* group_by_exp(arr, itemName, exp) { + const map = new Map(); + const keyTemplate = new Value(stringify(exp), this.liquid); + arr = toEnumerable(arr); + this.context.memoryLimit.use(arr.length); + for (const item of arr) { + this.context.push({ [itemName]: item }); + const key = yield keyTemplate.value(this.context); + this.context.pop(); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + } + return [...map.entries()].map(([name, items]) => ({ name, items })); +} +function* search(arr, property, expected) { + const token = new Tokenizer(stringify(property)).readScopeValue(); + const array = toArray(arr); + const matcher = expectedMatcher.call(this, expected); + for (let index = 0; index < array.length; index++) { + const value = yield evalToken(token, this.context.spawn(array[index])); + if (matcher(value)) + return [index, array[index]]; + } +} +function* search_exp(arr, itemName, exp) { + const predicate = new Value(stringify(exp), this.liquid); + const array = toArray(arr); + for (let index = 0; index < array.length; index++) { + this.context.push({ [itemName]: array[index] }); + const value = yield predicate.value(this.context); + this.context.pop(); + if (value) + return [index, array[index]]; + } +} +function* has(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return !!result; +} +function* has_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return !!result; +} +function* find_index(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return result ? result[0] : undefined; +} +function* find_index_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return result ? result[0] : undefined; +} +function* find(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return result ? result[1] : undefined; +} +function* find_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return result ? result[1] : undefined; +} +function uniq(arr) { + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + return [...new Set(arr)]; +} +function sample(v, count = 1) { + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + this.context.memoryLimit.use(count); + const shuffled = [...v].sort(() => Math.random() - 0.5); + if (count === 1) + return shuffled[0]; + return shuffled.slice(0, count); +} + +var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample +}); + +function date(v, format, timezoneOffset) { + var _a, _b; + const size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _b !== void 0 ? _b : 0); + this.context.memoryLimit.use(size); + const date = parseDate(v, this.context.opts, timezoneOffset); + if (!date) + return v; + format = toValue(format); + format = isNil(format) ? this.context.opts.dateFormat : stringify(format); + this.context.memoryLimit.use(format.length); + return strftime(date, format, this.context.memoryLimit); +} +function date_to_xmlschema(v) { + return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z'); +} +function date_to_rfc822(v) { + return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z'); +} +function date_to_string(v, type, style) { + return stringify_date.call(this, v, '%b', type, style); +} +function date_to_long_string(v, type, style) { + return stringify_date.call(this, v, '%B', type, style); +} +function stringify_date(v, month_type, type, style) { + const date = parseDate(v, this.context.opts); + if (!date) + return v; + const ml = this.context.memoryLimit; + if (type === 'ordinal') { + const d = date.getDate(); + return style === 'US' + ? strftime(date, `${month_type} ${d}%q, %Y`, ml) + : strftime(date, `${d}%q ${month_type} %Y`, ml); + } + return strftime(date, `%d ${month_type} %Y`, ml); +} +function parseDate(v, opts, timezoneOffset) { + let date; + const defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset; + const locale = opts.locale; + v = toValue(v); + if (isNil(v)) { + return undefined; + } + else if (v === 'now' || v === 'today') { + date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset); + } + else if (isNumber(v)) { + date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset); + } + else if (isString(v)) { + if (/^\d+$/.test(v)) { + date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset); + } + else if (opts.preserveTimezones && timezoneOffset === undefined) { + date = LiquidDate.createDateFixedToTimezone(v, locale); + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + return date.valid() ? date : undefined; +} + +var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string +}); + +/** + * String related filters + * + * * prefer stringify() to String() since `undefined`, `null` should eval '' + */ +const rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu; +// Word boundary followed by word characters (for detecting words) +const rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu; +function append(v, arg) { + assert(arguments.length === 2, 'append expect 2 arguments'); + const lhs = stringify(v); + const rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs + rhs; +} +function prepend(v, arg) { + assert(arguments.length === 2, 'prepend expect 2 arguments'); + const lhs = stringify(v); + const rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return rhs + lhs; +} +function lstrip(v, chars) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (let i = 0, set = new Set(chars); i < str.length; i++) { + if (!set.has(str[i])) + return str.slice(i); + } + return ''; + } + return str.trimStart(); +} +function downcase(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.toLowerCase(); +} +function upcase(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return stringify(str).toUpperCase(); +} +function remove(v, arg) { + const str = stringify(v); + arg = stringify(arg); + this.context.memoryLimit.use(str.length + arg.length); + return str.split(arg).join(''); +} +function remove_first(v, l) { + const str = stringify(v); + l = stringify(l); + this.context.memoryLimit.use(str.length + l.length); + return str.replace(l, ''); +} +function remove_last(v, l) { + const str = stringify(v); + const pattern = stringify(l); + this.context.memoryLimit.use(str.length + pattern.length); + const index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + str.substring(index + pattern.length); +} +function rstrip(str, chars) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (let i = str.length - 1, set = new Set(chars); i >= 0; i--) { + if (!set.has(str[i])) + return str.slice(0, i + 1); + } + return ''; + } + return str.trimEnd(); +} +function split(v, arg) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + const arr = str.split(stringify(arg)); + // align to ruby split, which is the behavior of shopify/liquid + // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split + while (arr.length && arr[arr.length - 1] === '') + arr.pop(); + return arr; +} +function strip(v, chars) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + const set = new Set(stringify(chars)); + this.context.memoryLimit.use(set.size); + let i = 0; + let j = str.length - 1; + while (set.has(str[i])) + i++; + while (j >= i && set.has(str[j])) + j--; + return str.slice(i, j + 1); + } + return str.trim(); +} +function strip_newlines(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, ''); +} +function capitalize(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); +} +function replace(v, pattern, replacement) { + const str = stringify(v); + pattern = stringify(pattern); + replacement = stringify(replacement); + const parts = str.split(pattern); + const outputSize = str.length + (parts.length - 1) * (replacement.length - pattern.length); + this.context.memoryLimit.use(outputSize); + return parts.join(replacement); +} +function replace_first(v, arg1, arg2) { + const str = stringify(v); + arg1 = stringify(arg1); + arg2 = stringify(arg2); + this.context.memoryLimit.use(str.length + arg1.length + arg2.length); + return str.replace(arg1, () => arg2); +} +function replace_last(v, arg1, arg2) { + const str = stringify(v); + const pattern = stringify(arg1); + const replacement = stringify(arg2); + this.context.memoryLimit.use(str.length + pattern.length + replacement.length); + const index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + replacement + str.substring(index + pattern.length); +} +function truncate(v, l = 50, o = '...') { + const str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + if (str.length <= l) + return v; + return str.substring(0, l - o.length) + o; +} +function truncatewords(v, words = 15, o = '...') { + const str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + const arr = str.split(/\s+/); + if (words <= 0) + words = 1; + let ret = arr.slice(0, words).join(' '); + if (arr.length >= words) + ret += o; + return ret; +} +function normalize_whitespace(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\s+/g, ' '); +} +function number_of_words(input, mode) { + const str = stringify(input); + this.context.memoryLimit.use(str.length); + input = str.trim(); + if (!input) + return 0; + switch (mode) { + case 'cjk': + // Count CJK characters and words + return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length; + case 'auto': + // Count CJK characters, if none, count words + return rCJKWord.test(input) + ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length + : input.split(/\s+/).length; + default: + // Count words only + return input.split(/\s+/).length; + } +} +function array_to_sentence_string(array, connector = 'and') { + connector = stringify(connector); + this.context.memoryLimit.use(array.length + connector.length); + switch (array.length) { + case 0: + return ''; + case 1: + return array[0]; + case 2: + return `${array[0]} ${connector} ${array[1]}`; + default: + return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`; + } +} + +var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string +}); + +function base64Encode(str) { + return btoa(String.fromCharCode(...new TextEncoder().encode(str))); +} +function base64Decode(str) { + return new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))); +} + +/** + * Base64 related filters + * + * Implements base64_encode and base64_decode filters for Shopify compatibility + */ +function base64_encode(value) { + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + this.context.memoryLimit.use(value.byteLength); + return value.toString('base64'); + } + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Encode(str); +} +function base64_decode(value) { + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Decode(str); +} + +var base64Filters = /*#__PURE__*/Object.freeze({ + __proto__: null, + base64_encode: base64_encode, + base64_decode: base64_decode +}); + +function bufferToHex(buffer) { + const bytes = new Uint8Array(buffer); + let hex = ''; + for (let i = 0; i < bytes.length; i++) { + hex += bytes[i].toString(16).padStart(2, '0'); + } + return hex; +} +function sha256(str) { + return __awaiter(this, void 0, void 0, function* () { + const data = new TextEncoder().encode(str); + const digest = yield crypto.subtle.digest('SHA-256', data); + return bufferToHex(digest); + }); +} +function hmacSha256(str, key) { + return __awaiter(this, void 0, void 0, function* () { + const encoder = new TextEncoder(); + const cryptoKey = yield crypto.subtle.importKey('raw', encoder.encode(key), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']); + const signature = yield crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(str)); + return bufferToHex(signature); + }); +} + +/** + * Crypto related filters + * + * Implements sha256 and hmac_sha256 filters for Shopify compatibility + */ +function sha256$1(value) { + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return sha256(str); +} +function hmac_sha256(value, key) { + const str = stringify(value); + const keyStr = stringify(key); + this.context.memoryLimit.use(str.length + keyStr.length); + return hmacSha256(str, keyStr); +} + +var cryptoFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + sha256: sha256$1, + hmac_sha256: hmac_sha256 +}); + +const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, htmlFilters), mathFilters), urlFilters), arrayFilters), dateFilters), stringFilters), base64Filters), cryptoFilters), misc); + +class AssignTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.key = this.identifier.content; + this.tokenizer.assert(this.key, 'expected variable name'); + this.tokenizer.skipBlank(); + this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected "="'); + this.tokenizer.advance(); + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + } + *render(ctx) { + ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf); + } + *arguments() { + yield this.value; + } + *localScope() { + yield this.identifier; + } +} + +const MODIFIERS = ['offset', 'limit', 'reversed']; +class ForTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const variable = this.tokenizer.readIdentifier(); + const inStr = this.tokenizer.readIdentifier(); + const collection = this.tokenizer.readValue(); + if (!variable.size() || inStr.content !== 'in' || !collection) { + throw new Error(`illegal tag: ${token.getText()}`); + } + this.variable = variable.content; + this.collection = collection; + this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = []; + this.elseTemplates = []; + let p; + const stream = parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates; }) + .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop(); }) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { throw new Error(`tag ${token.getText()} not closed`); }); + stream.start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + let collection = toEnumerable(yield evalToken(this.collection, ctx)); + if (!collection.length) { + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + return; + } + const continueKey = 'continue-' + this.variable + '-' + this.collection.getText(); + ctx.push(createScope({ continue: ctx.getRegister(continueKey, {}) })); + const hash = yield this.hash.render(ctx); + ctx.pop(); + const modifiers = this.liquid.options.orderedFilterParameters + ? Object.keys(hash).filter(x => MODIFIERS.includes(x)) + : MODIFIERS.filter(x => hash[x] !== undefined); + collection = modifiers.reduce((collection, modifier) => { + if (modifier === 'offset') + return offset(collection, hash['offset']); + if (modifier === 'limit') + return limit(collection, hash['limit']); + return reversed(collection); + }, collection); + ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length); + const scope = createScope({ forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }); + ctx.push(scope); + for (const item of collection) { + scope[this.variable] = item; + ctx.continueCalled = ctx.breakCalled = false; + yield r.renderTemplates(this.templates, ctx, emitter); + if (ctx.breakCalled) + break; + scope.forloop.next(); + } + ctx.continueCalled = ctx.breakCalled = false; + ctx.pop(); + } + *children() { + const templates = this.templates.slice(); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } + *arguments() { + yield this.collection; + for (const v of Object.values(this.hash.hash)) { + if (isValueToken(v)) { + yield v; + } + } + } + blockScope() { + return [this.variable, 'forloop']; + } +} +function reversed(arr) { + return [...arr].reverse(); +} +function offset(arr, count) { + return arr.slice(count); +} +function limit(arr, count) { + return arr.slice(0, count); +} + +class CaptureTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.templates = []; + this.identifier = this.readVariable(); + this.variable = this.identifier.content; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcapture') + return; + this.templates.push(parser.parseToken(token, remainTokens)); + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + readVariable() { + let ident = this.tokenizer.readIdentifier(); + if (ident.content) + return ident; + ident = this.tokenizer.readQuoted(); + if (ident) + return ident; + throw this.tokenizer.error('invalid capture name'); + } + *render(ctx) { + const r = this.liquid.renderer; + const html = yield r.renderTemplates(this.templates, ctx); + ctx.bottom()[this.variable] = html; + } + *children() { + return this.templates; + } + *localScope() { + yield this.identifier; + } +} + +class CaseTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + this.elseTemplates = []; + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + this.elseTemplates = []; + let p = []; + let elseCount = 0; + const stream = parser.parseStream(remainTokens) + .on('tag:when', (token) => { + if (elseCount > 0) { + return; + } + p = []; + const values = []; + while (!token.tokenizer.end()) { + values.push(token.tokenizer.readValueOrThrow()); + token.tokenizer.skipBlank(); + if (token.tokenizer.peek() === ',') { + token.tokenizer.readTo(','); + } + else { + token.tokenizer.readTo('or'); + } + } + this.branches.push({ + values, + templates: p + }); + }) + .on('tag:else', () => { + elseCount++; + p = this.elseTemplates; + }) + .on('tag:endcase', () => stream.stop()) + .on('template', (tpl) => { + if (p !== this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + stream.start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf)); + let branchHit = false; + for (const branch of this.branches) { + for (const valueToken of branch.values) { + const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf); + if (equals(target, value)) { + yield r.renderTemplates(branch.templates, ctx, emitter); + branchHit = true; + break; + } + } + } + if (!branchHit) { + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + } + } + *arguments() { + yield this.value; + yield* this.branches.flatMap(b => b.values); + } + *children() { + const templates = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } +} + +class CommentTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcomment') + return; + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + render() { } +} + +class RenderTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const tokenizer = this.tokenizer; + this.file = parseFilePath(tokenizer, this.liquid, parser); + this.currentFile = token.file; + while (!tokenizer.end()) { + tokenizer.skipBlank(); + const begin = tokenizer.p; + const keyword = tokenizer.readIdentifier(); + if (keyword.content === 'with' || keyword.content === 'for') { + tokenizer.skipBlank(); + // can be normal key/value pair, like "with: true" + if (tokenizer.peek() !== ':') { + const value = tokenizer.readValue(); + // can be normal key, like "with," + if (value) { + const beforeAs = tokenizer.p; + const asStr = tokenizer.readIdentifier(); + let alias; + if (asStr.content === 'as') + alias = tokenizer.readIdentifier(); + else + tokenizer.p = beforeAs; + this[keyword.content] = { value, alias: alias && alias.content }; + tokenizer.skipBlank(); + if (tokenizer.peek() === ',') + tokenizer.advance(); + continue; // matched! + } + } + } + /** + * restore cursor if with/for not matched + */ + tokenizer.p = begin; + break; + } + this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator); + } + *render(ctx, emitter) { + const { liquid, hash } = this; + const filepath = (yield renderFilePath(this['file'], ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const childCtx = ctx.spawn(); + const scope = childCtx.bottom(); + __assign(scope, yield hash.render(ctx)); + if (this['with']) { + const { value, alias } = this['with']; + scope[alias || filepath] = yield evalToken(value, ctx); + } + if (this['for']) { + const { value, alias } = this['for']; + const collection = toEnumerable(yield evalToken(value, ctx)); + scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias); + for (const item of collection) { + scope[alias] = item; + const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])); + yield liquid.renderer.renderTemplates(templates, childCtx, emitter); + scope['forloop'].next(); + } + } + else { + const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])); + yield liquid.renderer.renderTemplates(templates, childCtx, emitter); + } + } + *children(partials, sync) { + if (partials && isString(this['file'])) { + return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])); + } + return []; + } + partialScope() { + if (isString(this['file'])) { + const names = Object.keys(this.hash.hash); + if (this['with']) { + const { value, alias } = this['with']; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + if (this['for']) { + const { value, alias } = this['for']; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + return { name: this['file'], isolated: true, scope: names }; + } + } + *arguments() { + for (const v of Object.values(this.hash.hash)) { + if (isValueToken(v)) { + yield v; + } + } + if (this['with']) { + const { value } = this['with']; + if (isValueToken(value)) { + yield value; + } + } + if (this['for']) { + const { value } = this['for']; + if (isValueToken(value)) { + yield value; + } + } + } +} +/** + * @return null for "none", + * @return Template[] for quoted with tags and/or filters + * @return Token for expression (not quoted) + * @throws TypeError if cannot read next token + */ +function parseFilePath(tokenizer, liquid, parser) { + if (liquid.options.dynamicPartials) { + const file = tokenizer.readValue(); + tokenizer.assert(file, 'illegal file path'); + if (file.getText() === 'none') + return; + if (isQuotedToken(file)) { + // for filenames like "files/{{file}}", eval as liquid template + const templates = parser.parse(evalQuotedToken(file)); + return optimize(templates); + } + return file; + } + const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]; + const templates = optimize(parser.parseTokens(tokens)); + return templates === 'none' ? undefined : templates; +} +function optimize(templates) { + // for filenames like "files/file.liquid", extract the string directly + if (templates.length === 1 && isHTMLToken(templates[0].token)) + return templates[0].token.getContent(); + return templates; +} +function* renderFilePath(file, ctx, liquid) { + if (typeof file === 'string') + return file; + if (Array.isArray(file)) + return liquid.renderer.renderTemplates(file, ctx); + return yield evalToken(file, ctx); +} + +class IncludeTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const { tokenizer } = token; + this['file'] = parseFilePath(tokenizer, this.liquid, parser); + this['currentFile'] = token.file; + const begin = tokenizer.p; + const withStr = tokenizer.readIdentifier(); + if (withStr.content === 'with') { + tokenizer.skipBlank(); + if (tokenizer.peek() !== ':') { + this.withVar = tokenizer.readValue(); + } + else + tokenizer.p = begin; + } + else + tokenizer.p = begin; + this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator); + } + *render(ctx, emitter) { + const { liquid, hash, withVar } = this; + const { renderer } = liquid; + const filepath = (yield renderFilePath(this['file'], ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const saved = ctx.saveRegister('blocks', 'blockMode'); + ctx.setRegister('blocks', {}); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + const scope = createScope((yield hash.render(ctx))); + if (withVar) + scope[filepath] = yield evalToken(withVar, ctx); + const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])); + ctx.push(ctx.opts.jekyllInclude ? createScope({ include: scope }) : scope); + yield renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + ctx.restoreRegister(saved); + } + *children(partials, sync) { + if (partials && isString(this['file'])) { + return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])); + } + return []; + } + partialScope() { + if (isString(this['file'])) { + let names; + if (this.liquid.options.jekyllInclude) { + names = ['include']; + } + else { + names = Object.keys(this.hash.hash); + if (this.withVar) { + names.push([this['file'], this.withVar]); + } + } + return { name: this['file'], isolated: false, scope: names }; + } + } + *arguments() { + yield* Object.values(this.hash.hash).filter(isValueToken); + if (isValueToken(this['file'])) { + yield this['file']; + } + if (isValueToken(this.withVar)) { + yield this.withVar; + } + } +} + +class DecrementTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.variable = this.identifier.content; + } + render(context, emitter) { + const scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + emitter.write(stringify(--scope[this.variable])); + } + *localScope() { + yield this.identifier; + } +} + +class CycleTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.candidates = []; + const group = this.tokenizer.readValue(); + this.tokenizer.skipBlank(); + if (group) { + if (this.tokenizer.peek() === ':') { + this.group = group; + this.tokenizer.advance(); + } + else + this.candidates.push(group); + } + while (!this.tokenizer.end()) { + const value = this.tokenizer.readValue(); + if (value) + this.candidates.push(value); + this.tokenizer.readTo(','); + } + this.tokenizer.assert(this.candidates.length, () => `empty candidates: "${token.getText()}"`); + } + *render(ctx, emitter) { + const group = (yield evalToken(this.group, ctx)); + const fingerprint = `cycle:${group}:` + this.candidates.join(','); + const groups = ctx.getRegister('cycle', {}); + let idx = groups[fingerprint]; + if (idx === undefined) { + idx = groups[fingerprint] = 0; + } + const candidate = this.candidates[idx]; + idx = (idx + 1) % this.candidates.length; + groups[fingerprint] = idx; + return yield evalToken(candidate, ctx); + } + *arguments() { + yield* this.candidates; + if (this.group) { + yield this.group; + } + } +} + +class IfTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + let p = []; + parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid), + templates: (p = []) + })) + .on('tag:elsif', (token) => { + assert(!this.elseTemplates, 'unexpected elsif after else'); + this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), this.liquid), + templates: (p = []) + }); + }) + .on('tag:else', tag => { + assertEmpty(tag.args); + assert(!this.elseTemplates, 'duplicated else'); + p = this.elseTemplates = []; + }) + .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); }) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); }) + .start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + for (const { value, templates } of this.branches) { + const v = yield value.value(ctx, ctx.opts.lenientIf); + if (isTruthy(v, ctx)) { + yield r.renderTemplates(templates, ctx, emitter); + return; + } + } + yield r.renderTemplates(this.elseTemplates || [], ctx, emitter); + } + *children() { + const templates = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } + arguments() { + return this.branches.map(b => b.value); + } +} + +class IncrementTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.variable = this.identifier.content; + } + render(context, emitter) { + const scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + const val = scope[this.variable]; + scope[this.variable]++; + emitter.write(stringify(val)); + } + *localScope() { + yield this.identifier; + } +} + +class LayoutTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + this.file = parseFilePath(this.tokenizer, this.liquid, parser); + this['currentFile'] = token.file; + this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = parser.parseTokens(remainTokens); + } + *render(ctx, emitter) { + const { liquid, args, file } = this; + const { renderer } = liquid; + if (file === undefined) { + ctx.setRegister('blockMode', BlockMode.OUTPUT); + yield renderer.renderTemplates(this.templates, ctx, emitter); + return; + } + const filepath = (yield renderFilePath(this.file, ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])); + // render remaining contents and store rendered results + ctx.setRegister('blockMode', BlockMode.STORE); + const html = yield renderer.renderTemplates(this.templates, ctx); + const blocks = ctx.getRegister('blocks', {}); + // set whole content to anonymous block if anonymous doesn't specified + if (blocks[''] === undefined) + blocks[''] = (parent, emitter) => emitter.write(html); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + // render the layout file use stored blocks + ctx.push(createScope((yield args.render(ctx)))); + yield renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + } + *children(partials) { + const templates = this.templates.slice(); + if (partials && isString(this.file)) { + templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile']))); + } + return templates; + } + *arguments() { + for (const v of Object.values(this.args.hash)) { + if (isValueToken(v)) { + yield v; + } + } + if (isValueToken(this.file)) { + yield this.file; + } + } + partialScope() { + if (isString(this.file)) { + return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }; + } + } +} + +class BlockTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + this.templates = []; + const match = /\w+/.exec(token.args); + this.block = match ? match[0] : ''; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endblock') + return; + const template = parser.parseToken(token, remainTokens); + this.templates.push(template); + } + throw new Error(`tag ${token.getText()} not closed`); + } + *render(ctx, emitter) { + const blockRender = this.getBlockRender(ctx); + if (ctx.getRegister('blockMode') === BlockMode.STORE) { + ctx.getRegister('blocks', {})[this.block] = blockRender; + } + else { + yield blockRender(new BlockDrop(), emitter); + } + } + getBlockRender(ctx) { + const self = this; + const { liquid, templates } = this; + const renderChild = ctx.getRegister('blocks', {})[this.block]; + const renderCurrent = function* (superBlock, emitter) { + const stack = ctx.getRegister('blockStack', []); + if (stack.includes(self)) + throw new Error('block tag cannot be nested'); + stack.push(self); + ctx.push(createScope({ block: superBlock })); + yield liquid.renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + stack.pop(); + }; + return renderChild + ? (superBlock, emitter) => renderChild(new BlockDrop((emitter) => renderCurrent(superBlock, emitter)), emitter) + : renderCurrent; + } + *children() { + return this.templates; + } + blockScope() { + return ['block']; + } +} + +class RawTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + this.tokens = []; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endraw') + return; + this.tokens.push(token); + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + render() { + return this.tokens.map((token) => token.getText()).join(''); + } +} + +class TablerowloopDrop extends ForloopDrop { + constructor(length, cols, collection, variable) { + super(length, collection, variable); + this.length = length; + this.cols = cols; + } + row() { + return Math.floor(this.i / this.cols) + 1; + } + col0() { + return (this.i % this.cols); + } + col() { + return this.col0() + 1; + } + col_first() { + return this.col0() === 0; + } + col_last() { + return this.col() === this.cols; + } +} + +class TablerowTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + const variable = this.tokenizer.readIdentifier(); + this.tokenizer.skipBlank(); + const predicate = this.tokenizer.readIdentifier(); + const collectionToken = this.tokenizer.readValue(); + if (predicate.content !== 'in' || !collectionToken) { + throw new Error(`illegal tag: ${tagToken.getText()}`); + } + this.variable = variable.content; + this.collection = collectionToken; + this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = []; + let p; + const stream = parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:endtablerow', () => stream.stop()) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + stream.start(); + } + *render(ctx, emitter) { + let collection = toEnumerable(yield evalToken(this.collection, ctx)); + const args = (yield this.args.render(ctx)); + const offset = args.offset || 0; + const limit = (args.limit === undefined) ? collection.length : args.limit; + collection = collection.slice(offset, offset + limit); + const cols = args.cols || collection.length; + const r = this.liquid.renderer; + const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable); + const scope = createScope({ tablerowloop }); + ctx.push(scope); + for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) { + scope[this.variable] = collection[idx]; + if (tablerowloop.col0() === 0) { + if (tablerowloop.row() !== 1) + emitter.write(''); + emitter.write(``); + } + emitter.write(``); + yield r.renderTemplates(this.templates, ctx, emitter); + emitter.write(''); + } + if (collection.length) + emitter.write(''); + ctx.pop(); + } + *children() { + return this.templates; + } + *arguments() { + yield this.collection; + for (const v of Object.values(this.args.hash)) { + if (isValueToken(v)) { + yield v; + } + } + } + blockScope() { + return [this.variable, 'tablerowloop']; + } +} + +class UnlessTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + this.elseTemplates = []; + let p = []; + let elseCount = 0; + parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid), + test: isFalsy, + templates: (p = []) + })) + .on('tag:elsif', (token) => { + if (elseCount > 0) { + p = []; + return; + } + this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), this.liquid), + test: isTruthy, + templates: (p = []) + }); + }) + .on('tag:else', () => { + elseCount++; + p = this.elseTemplates; + }) + .on('tag:endunless', function () { this.stop(); }) + .on('template', (tpl) => { + if (p !== this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); }) + .start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + for (const { value, test, templates } of this.branches) { + const v = yield value.value(ctx, ctx.opts.lenientIf); + if (test(v, ctx)) { + yield r.renderTemplates(templates, ctx, emitter); + return; + } + } + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + } + *children() { + const children = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + children.push(...this.elseTemplates); + } + return children; + } + arguments() { + return this.branches.map(b => b.value); + } +} + +class BreakTag extends Tag { + render(ctx, _emitter) { + ctx.breakCalled = true; + } +} + +class ContinueTag extends Tag { + render(ctx, _emitter) { + ctx.continueCalled = true; + } +} + +class EchoTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.tokenizer.skipBlank(); + if (!this.tokenizer.end()) { + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + } + } + *render(ctx, emitter) { + if (!this.value) + return; + const val = yield this.value.value(ctx, false); + emitter.write(val); + } + *arguments() { + if (this.value) { + yield this.value; + } + } +} + +class LiquidTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options); + this.templates = parser.parseTokens(tokens); + } + *render(ctx, emitter) { + yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter); + } + *children() { + return this.templates; + } +} + +class InlineCommentTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) { + throw new Error('every line of an inline comment must start with a \'#\' character'); + } + } + render() { } +} + +const tags = { + assign: AssignTag, + 'for': ForTag, + capture: CaptureTag, + 'case': CaseTag, + comment: CommentTag, + include: IncludeTag, + render: RenderTag, + decrement: DecrementTag, + increment: IncrementTag, + cycle: CycleTag, + 'if': IfTag, + layout: LayoutTag, + block: BlockTag, + raw: RawTag, + tablerow: TablerowTag, + unless: UnlessTag, + 'break': BreakTag, + 'continue': ContinueTag, + echo: EchoTag, + liquid: LiquidTag, + '#': InlineCommentTag +}; + +class Liquid { + constructor(opts = {}) { + this.renderer = new Render(); + this.filters = Object.create(null); + this.tags = Object.create(null); + this.options = normalize(opts); + // eslint-disable-next-line deprecation/deprecation + this.parser = new Parser(this); + forOwn(tags, (conf, name) => this.registerTag(name, conf)); + forOwn(filters, (handler, name) => this.registerFilter(name, handler)); + } + parse(html, filepath) { + const parser = new Parser(this); + return parser.parse(html, filepath); + } + _render(tpl, scope, renderOptions) { + const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplates(tpl, ctx); + } + render(tpl, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: false }))); + }); + } + renderSync(tpl, scope, renderOptions) { + return toValueSync(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: true }))); + } + renderToNodeStream(tpl, scope, renderOptions = {}) { + const ctx = new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplatesToNodeStream(tpl, ctx); + } + _parseAndRender(html, scope, renderOptions) { + const tpl = this.parse(html); + return this._render(tpl, scope, renderOptions); + } + parseAndRender(html, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: false }))); + }); + } + parseAndRenderSync(html, scope, renderOptions) { + return toValueSync(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: true }))); + } + _parsePartialFile(file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile); + } + _parseLayoutFile(file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile); + } + _parseFile(file, sync, lookupType, currentFile) { + return new Parser(this).parseFile(file, sync, lookupType, currentFile); + } + parseFile(file, lookupType) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(new Parser(this).parseFile(file, false, lookupType)); + }); + } + parseFileSync(file, lookupType) { + return toValueSync(new Parser(this).parseFile(file, true, lookupType)); + } + *_renderFile(file, ctx, renderFileOptions) { + const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)); + return yield this._render(templates, ctx, renderFileOptions); + } + renderFile(file, ctx, renderFileOptions) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: false }))); + }); + } + renderFileSync(file, ctx, renderFileOptions) { + return toValueSync(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: true }))); + } + renderFileToNodeStream(file, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function* () { + const templates = yield this.parseFile(file); + return this.renderToNodeStream(templates, scope, renderOptions); + }); + } + _evalValue(str, scope) { + const value = new Value(str, this); + const ctx = scope instanceof Context ? scope : new Context(scope, this.options); + return value.value(ctx); + } + evalValue(str, scope) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._evalValue(str, scope)); + }); + } + evalValueSync(str, scope) { + return toValueSync(this._evalValue(str, scope)); + } + registerFilter(name, filter) { + this.filters[name] = filter; + } + registerTag(name, tag) { + this.tags[name] = isFunction(tag) ? tag : createTagClass(tag); + } + plugin(plugin) { + return plugin.call(this, Liquid); + } + express() { + const self = this; // eslint-disable-line + let firstCall = true; + return function (filePath, ctx, callback) { + if (firstCall) { + firstCall = false; + const dirs = normalizeDirectoryList(this.root); + self.options.root.unshift(...dirs); + self.options.layouts.unshift(...dirs); + self.options.partials.unshift(...dirs); + } + self.renderFile(filePath, ctx).then(html => callback(null, html), callback); + }; + } + analyze(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + return analyze(template, options); + }); + } + analyzeSync(template, options = {}) { + return analyzeSync(template, options); + } + parseAndAnalyze(html, filename, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + return analyze(this.parse(html, filename), options); + }); + } + parseAndAnalyzeSync(html, filename, options = {}) { + return analyzeSync(this.parse(html, filename), options); + } + /** Return an array of all variables without their properties. */ + variables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + }); + } + /** Return an array of all variables without their properties. */ + variablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + } + /** Return an array of all variables including their properties/paths. */ + fullVariables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v))))); + }); + } + /** Return an array of all variables including their properties/paths. */ + fullVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegments(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray())))); + }); + } + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegmentsSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray())))); + } + /** Return an array of all expected context variables without their properties. */ + globalVariables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + }); + } + /** Return an array of all expected context variables without their properties. */ + globalVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + } + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v))))); + }); + } + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegments(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray())))); + }); + } + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegmentsSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray())))); + } +} + +/* istanbul ignore file */ +const version = '[VI]{version}[/VI]'; + +export { AssertionError, AssignTag, BlockTag, BreakTag, CaptureTag, CaseTag, CommentTag, Context, ContinueTag, CycleTag, DecrementTag, Drop, EchoTag, Expression, Filter, ForTag, Hash, IfTag, IncludeTag, IncrementTag, InlineCommentTag, LayoutTag, Liquid, LiquidError, LiquidTag, LookupType, Output, ParseError, ParseStream, Parser, RawTag, RenderError, RenderTag, TablerowTag, Tag, TagToken, Token, TokenKind, TokenizationError, Tokenizer, typeGuards as TypeGuards, UndefinedVariableError, UnlessTag, Value, Variable, analyze, analyzeSync, assert, createTrie, defaultOperators, defaultOptions, evalQuotedToken, evalToken, filters, isFalsy, isTruthy, tags, toPromise, toValue, toValueSync, version }; diff --git a/node_modules/liquidjs/dist/liquid.browser.umd.js b/node_modules/liquidjs/dist/liquid.browser.umd.js new file mode 100644 index 0000000..88b12fb --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.umd.js @@ -0,0 +1,7479 @@ +/* + * liquidjs@10.27.0, https://github.com/harttle/liquidjs + * (c) 2016-2026 harttle + * Released under the MIT License. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.liquidjs = {})); +}(this, (function (exports) { 'use strict'; + + /****************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + 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. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + } + + function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; + } + + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + } + + var Token = /** @class */ (function () { + function Token(kind, input, begin, end, file) { + this.kind = kind; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } + Token.prototype.getText = function () { + return this.input.slice(this.begin, this.end); + }; + Token.prototype.getPosition = function () { + var _a = __read([1, 1], 2), row = _a[0], col = _a[1]; + for (var i = 0; i < this.begin; i++) { + if (this.input[i] === '\n') { + row++; + col = 1; + } + else + col++; + } + return [row, col]; + }; + Token.prototype.size = function () { + return this.end - this.begin; + }; + return Token; + }()); + + var Drop = /** @class */ (function () { + function Drop() { + } + Drop.prototype.liquidMethodMissing = function (key, context) { + return undefined; + }; + return Drop; + }()); + + var toString$1 = Object.prototype.toString; + var toLowerCase = String.prototype.toLowerCase; + var hasOwnProperty = Object.hasOwnProperty; + function isString(value) { + return typeof value === 'string'; + } + // eslint-disable-next-line @typescript-eslint/ban-types + function isFunction(value) { + return typeof value === 'function'; + } + function isPromise(val) { + return val && isFunction(val.then); + } + function isIterator(val) { + return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return); + } + function stringify(value) { + value = toValue(value); + if (isString(value)) + return value; + if (isNil(value)) + return ''; + if (isArray(value)) + return value.map(function (x) { return stringify(x); }).join(''); + return String(value); + } + function toEnumerable(val) { + val = toValue(val); + if (isArray(val)) + return val; + if (isString(val) && val.length > 0) + return [val]; + if (isIterable(val)) + return Array.from(val); + if (isObject(val)) + return Object.keys(val).map(function (key) { return [key, val[key]]; }); + return []; + } + function toArray(val) { + val = toValue(val); + if (isNil(val)) + return []; + if (isArray(val)) + return val; + return [val]; + } + function toValue(value) { + return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value; + } + function toNumber(value) { + return +toValue(value) || 0; + } + function isNumber(value) { + return typeof value === 'number'; + } + function toLiquid(value) { + if (value && isFunction(value.toLiquid)) + return toLiquid(value.toLiquid()); + return value; + } + function isNil(value) { + return value == null; + } + function isUndefined(value) { + return value === undefined; + } + function isArray(value) { + // be compatible with IE 8 + return toString$1.call(value) === '[object Array]'; + } + function isArrayLike(value) { + return value && isNumber(value.length); + } + function isIterable(value) { + return isObject(value) && Symbol.iterator in value; + } + /* + * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property. + * The iteratee is invoked with three arguments: (value, key, object). + * Iteratee functions may exit iteration early by explicitly returning false. + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @return {Object} Returns object. + */ + function forOwn(obj, iteratee) { + obj = obj || {}; + for (var k in obj) { + if (hasOwnProperty.call(obj, k)) { + if (iteratee(obj[k], k, obj) === false) + break; + } + } + return obj; + } + function last(arr) { + return arr[arr.length - 1]; + } + /* + * Checks if value is the language type of Object. + * (e.g. arrays, functions, objects, regexes, new Number(0), and new String('')) + * @param {any} value The value to check. + * @return {Boolean} Returns true if value is an object, else false. + */ + function isObject(value) { + var type = typeof value; + return value !== null && (type === 'object' || type === 'function'); + } + function range(start, stop, step) { + if (step === void 0) { step = 1; } + var arr = []; + for (var i = start; i < stop; i += step) { + arr.push(i); + } + return arr; + } + function padStart(str, length, ch) { + if (ch === void 0) { ch = ' '; } + return pad(str, length, ch, function (str, ch) { return ch + str; }); + } + function padEnd(str, length, ch) { + if (ch === void 0) { ch = ' '; } + return pad(str, length, ch, function (str, ch) { return str + ch; }); + } + function pad(str, length, ch, add) { + str = String(str); + var n = length - str.length; + if (n <= 0) + return str; + return add(str, ch.repeat(n)); + } + function identify(val) { + return val; + } + function changeCase(str) { + var hasLowerCase = __spreadArray([], __read(str), false).some(function (ch) { return ch >= 'a' && ch <= 'z'; }); + return hasLowerCase ? str.toUpperCase() : str.toLowerCase(); + } + function ellipsis(str, N) { + return str.length > N ? str.slice(0, N - 3) + '...' : str; + } + function orderedCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + if (a < b) + return -1; + if (a > b) + return 1; + return 0; + } + // compare string in case-insensitive way, undefined values to the tail + function caseInsensitiveCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + a = toLowerCase.call(a); + b = toLowerCase.call(b); + if (a < b) + return -1; + if (a > b) + return 1; + return 0; + } + function argumentsToValue(fn) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fn.call.apply(fn, __spreadArray([this], __read(args.map(toValue)), false)); + }; + } + function argumentsToNumber(fn) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fn.call.apply(fn, __spreadArray([this], __read(args.map(toNumber)), false)); + }; + } + /** Return an array containing unique elements from _array_. Works with nested arrays and objects. */ + function strictUniq(array) { + var seen, array_1, array_1_1, element, key, e_1_1; + var e_1, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + seen = new Set(); + _b.label = 1; + case 1: + _b.trys.push([1, 6, 7, 8]); + array_1 = __values(array), array_1_1 = array_1.next(); + _b.label = 2; + case 2: + if (!!array_1_1.done) return [3 /*break*/, 5]; + element = array_1_1.value; + key = JSON.stringify(element); + if (!!seen.has(key)) return [3 /*break*/, 4]; + seen.add(key); + return [4 /*yield*/, element]; + case 3: + _b.sent(); + _b.label = 4; + case 4: + array_1_1 = array_1.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_1_1 = _b.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (array_1_1 && !array_1_1.done && (_a = array_1.return)) _a.call(array_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 8: return [2 /*return*/]; + } + }); + } + + /** + * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes + */ + var TRAIT = '__liquidClass__'; + var LiquidError = /** @class */ (function (_super) { + __extends(LiquidError, _super); + function LiquidError(err, token) { + var _this = + /** + * note: for ES5 targeting, `this` will be replaced by return value of Error(), + * thus everything on `this` will be lost, avoid calling `LiquidError` methods here + */ + _super.call(this, typeof err === 'string' ? err : err.message) || this; + _this.context = ''; + if (typeof err !== 'string') + Object.defineProperty(_this, 'originalError', { value: err, enumerable: false }); + Object.defineProperty(_this, 'token', { value: token, enumerable: false }); + Object.defineProperty(_this, TRAIT, { value: 'LiquidError', enumerable: false }); + return _this; + } + LiquidError.prototype.update = function () { + Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false }); + this.message = mkMessage(this.message, this.token); + this.stack = this.message + '\n' + this.context + + '\n' + this.stack; + if (this.originalError) + this.stack += '\nFrom ' + this.originalError.stack; + }; + LiquidError.is = function (obj) { + return (obj === null || obj === void 0 ? void 0 : obj[TRAIT]) === 'LiquidError'; + }; + return LiquidError; + }(Error)); + var TokenizationError = /** @class */ (function (_super) { + __extends(TokenizationError, _super); + function TokenizationError(message, token) { + var _this = _super.call(this, message, token) || this; + _this.name = 'TokenizationError'; + _super.prototype.update.call(_this); + return _this; + } + return TokenizationError; + }(LiquidError)); + var ParseError = /** @class */ (function (_super) { + __extends(ParseError, _super); + function ParseError(err, token) { + var _this = _super.call(this, err, token) || this; + _this.name = 'ParseError'; + _this.message = err.message; + _super.prototype.update.call(_this); + return _this; + } + return ParseError; + }(LiquidError)); + var RenderError = /** @class */ (function (_super) { + __extends(RenderError, _super); + function RenderError(err, tpl) { + var _this = _super.call(this, err, tpl.token) || this; + _this.name = 'RenderError'; + _this.message = err.message; + _super.prototype.update.call(_this); + return _this; + } + RenderError.is = function (obj) { + return obj.name === 'RenderError'; + }; + return RenderError; + }(LiquidError)); + var LiquidErrors = /** @class */ (function (_super) { + __extends(LiquidErrors, _super); + function LiquidErrors(errors) { + var _this = _super.call(this, errors[0], errors[0].token) || this; + _this.errors = errors; + _this.name = 'LiquidErrors'; + var s = errors.length > 1 ? 's' : ''; + _this.message = "".concat(errors.length, " error").concat(s, " found"); + _super.prototype.update.call(_this); + return _this; + } + LiquidErrors.is = function (obj) { + return obj.name === 'LiquidErrors'; + }; + return LiquidErrors; + }(LiquidError)); + var UndefinedVariableError = /** @class */ (function (_super) { + __extends(UndefinedVariableError, _super); + function UndefinedVariableError(err, token) { + var _this = _super.call(this, err, token) || this; + _this.name = 'UndefinedVariableError'; + _this.message = err.message; + _super.prototype.update.call(_this); + return _this; + } + return UndefinedVariableError; + }(LiquidError)); + // only used internally; raised where we don't have token information, + // so it can't be an UndefinedVariableError. + var InternalUndefinedVariableError = /** @class */ (function (_super) { + __extends(InternalUndefinedVariableError, _super); + function InternalUndefinedVariableError(variableName) { + var _this = _super.call(this, "undefined variable: ".concat(variableName)) || this; + _this.name = 'InternalUndefinedVariableError'; + _this.variableName = variableName; + return _this; + } + return InternalUndefinedVariableError; + }(Error)); + var AssertionError = /** @class */ (function (_super) { + __extends(AssertionError, _super); + function AssertionError(message) { + var _this = _super.call(this, message) || this; + _this.name = 'AssertionError'; + _this.message = message + ''; + return _this; + } + return AssertionError; + }(Error)); + function mkContext(token) { + var _a = __read(token.getPosition(), 2), line = _a[0], col = _a[1]; + var lines = token.input.split('\n'); + var begin = Math.max(line - 2, 1); + var end = Math.min(line + 3, lines.length); + var context = range(begin, end + 1) + .map(function (lineNumber) { + var rowIndicator = (lineNumber === line) ? '>> ' : ' '; + var num = padStart(String(lineNumber), String(end).length); + var text = "".concat(rowIndicator).concat(num, "| "); + var colIndicator = lineNumber === line + ? '\n' + padStart('^', col + text.length) + : ''; + text += lines[lineNumber - 1]; + text += colIndicator; + return text; + }) + .join('\n'); + return context; + } + function mkMessage(msg, token) { + if (token.file) + msg += ", file:".concat(token.file); + var _a = __read(token.getPosition(), 2), line = _a[0], col = _a[1]; + msg += ", line:".concat(line, ", col:").concat(col); + return msg; + } + + // **DO NOT CHANGE THIS FILE** + // + // This file is generated by bin/character-gen.js + // bitmask character types to boost performance + var TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var WORD = 1; + var BLANK = 4; + var QUOTE = 8; + var INLINE_BLANK = 16; + var NUMBER = 32; + var SIGN = 64; + var PUNCTUATION = 128; + function isWord(char) { + var code = char.charCodeAt(0); + return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD); + } + TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK; + TYPES[8220] = TYPES[8221] = PUNCTUATION; + + function assert(predicate, message) { + if (!predicate) { + var msg = typeof message === 'function' + ? message() + : (message || "expect ".concat(predicate, " to be true")); + throw new AssertionError(msg); + } + } + function assertEmpty(predicate, message) { + if (message === void 0) { message = "unexpected ".concat(JSON.stringify(predicate)); } + assert(!predicate, message); + } + + var NullDrop = /** @class */ (function (_super) { + __extends(NullDrop, _super); + function NullDrop() { + return _super !== null && _super.apply(this, arguments) || this; + } + NullDrop.prototype.equals = function (value) { + return isNil(toValue(value)); + }; + NullDrop.prototype.gt = function () { + return false; + }; + NullDrop.prototype.geq = function () { + return false; + }; + NullDrop.prototype.lt = function () { + return false; + }; + NullDrop.prototype.leq = function () { + return false; + }; + NullDrop.prototype.valueOf = function () { + return null; + }; + return NullDrop; + }(Drop)); + + var EmptyDrop = /** @class */ (function (_super) { + __extends(EmptyDrop, _super); + function EmptyDrop() { + return _super !== null && _super.apply(this, arguments) || this; + } + EmptyDrop.prototype.equals = function (value) { + if (value instanceof EmptyDrop) + return false; + value = toValue(value); + if (isString(value) || isArray(value)) + return value.length === 0; + if (isObject(value)) + return Object.keys(value).length === 0; + return false; + }; + EmptyDrop.prototype.gt = function () { + return false; + }; + EmptyDrop.prototype.geq = function () { + return false; + }; + EmptyDrop.prototype.lt = function () { + return false; + }; + EmptyDrop.prototype.leq = function () { + return false; + }; + EmptyDrop.prototype.valueOf = function () { + return ''; + }; + EmptyDrop.is = function (value) { + return value instanceof EmptyDrop; + }; + return EmptyDrop; + }(Drop)); + + var BlankDrop = /** @class */ (function (_super) { + __extends(BlankDrop, _super); + function BlankDrop() { + return _super !== null && _super.apply(this, arguments) || this; + } + BlankDrop.prototype.equals = function (value) { + if (value === false) + return true; + if (isNil(toValue(value))) + return true; + if (isString(value)) + return /^\s*$/.test(value); + return _super.prototype.equals.call(this, value); + }; + BlankDrop.is = function (value) { + return value instanceof BlankDrop; + }; + return BlankDrop; + }(EmptyDrop)); + + var ForloopDrop = /** @class */ (function (_super) { + __extends(ForloopDrop, _super); + function ForloopDrop(length, collection, variable) { + var _this = _super.call(this) || this; + _this.i = 0; + _this.length = length; + _this.name = "".concat(variable, "-").concat(collection); + return _this; + } + ForloopDrop.prototype.next = function () { + this.i++; + }; + ForloopDrop.prototype.index0 = function () { + return this.i; + }; + ForloopDrop.prototype.index = function () { + return this.i + 1; + }; + ForloopDrop.prototype.first = function () { + return this.i === 0; + }; + ForloopDrop.prototype.last = function () { + return this.i === this.length - 1; + }; + ForloopDrop.prototype.rindex = function () { + return this.length - this.i; + }; + ForloopDrop.prototype.rindex0 = function () { + return this.length - this.i - 1; + }; + ForloopDrop.prototype.valueOf = function () { + return JSON.stringify(this); + }; + return ForloopDrop; + }(Drop)); + + var SimpleEmitter = /** @class */ (function () { + function SimpleEmitter() { + this.buffer = ''; + } + SimpleEmitter.prototype.write = function (html) { + this.buffer += stringify(html); + }; + return SimpleEmitter; + }()); + + var StreamedEmitter = /** @class */ (function () { + function StreamedEmitter() { + this.buffer = ''; + this.stream = null; + throw new Error('streaming not supported in browser'); + } + return StreamedEmitter; + }()); + + var KeepingTypeEmitter = /** @class */ (function () { + function KeepingTypeEmitter() { + this.buffer = ''; + } + KeepingTypeEmitter.prototype.write = function (html) { + html = toValue(html); + // This will only preserve the type if the value is isolated. + // I.E: + // {{ my-port }} -> 42 + // {{ my-host }}:{{ my-port }} -> 'host:42' + if (typeof html !== 'string' && this.buffer === '') { + this.buffer = html; + } + else { + this.buffer = stringify(this.buffer) + stringify(html); + } + }; + return KeepingTypeEmitter; + }()); + + var BlockDrop = /** @class */ (function (_super) { + __extends(BlockDrop, _super); + function BlockDrop( + // the block render from layout template + superBlockRender) { + if (superBlockRender === void 0) { superBlockRender = function () { return ''; }; } + var _this = _super.call(this) || this; + _this.superBlockRender = superBlockRender; + return _this; + } + /** + * Provide parent access in child block by + * {{ block.super }} + */ + BlockDrop.prototype.super = function () { + var emitter; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + emitter = new SimpleEmitter(); + return [4 /*yield*/, this.superBlockRender(emitter)]; + case 1: + _a.sent(); + return [2 /*return*/, emitter.buffer]; + } + }); + }; + return BlockDrop; + }(Drop)); + + function isComparable(arg) { + return (arg && + isFunction(arg.equals) && + isFunction(arg.gt) && + isFunction(arg.geq) && + isFunction(arg.lt) && + isFunction(arg.leq)); + } + + var nil = new NullDrop(); + var literalValues = { + 'true': true, + 'false': false, + 'nil': nil, + 'null': nil, + 'empty': new EmptyDrop(), + 'blank': new BlankDrop() + }; + + function createTrie(input) { + var e_1, _a; + var trie = {}; + try { + for (var _b = __values(Object.entries(input)), _c = _b.next(); !_c.done; _c = _b.next()) { + var _d = __read(_c.value, 2), name_1 = _d[0], data = _d[1]; + var node = trie; + for (var i = 0; i < name_1.length; i++) { + var c = name_1[i]; + node[c] = node[c] || {}; + if (i === name_1.length - 1 && isWord(name_1[i])) { + node[c].needBoundary = true; + } + node = node[c]; + } + node.data = data; + node.end = true; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } + return trie; + } + + function toLiquidAsync(asyncFn, syncFn) { + var syncImpl = syncFn || asyncFn; + return function (sync) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + return sync ? syncImpl.apply(void 0, __spreadArray([], __read(args), false)) : asyncFn.apply(void 0, __spreadArray([], __read(args), false)); + }; + } + // convert an async iterator to a Promise + function toPromise(val) { + return __awaiter(this, void 0, void 0, function () { + var value, done, next, state, err_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!isIterator(val)) + return [2 /*return*/, val]; + done = false; + next = 'next'; + _a.label = 1; + case 1: + state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + _a.label = 2; + case 2: + _a.trys.push([2, 5, , 6]); + if (isIterator(value)) + value = toPromise(value); + if (!isPromise(value)) return [3 /*break*/, 4]; + return [4 /*yield*/, value]; + case 3: + value = _a.sent(); + _a.label = 4; + case 4: return [3 /*break*/, 6]; + case 5: + err_1 = _a.sent(); + next = 'throw'; + value = err_1; + return [3 /*break*/, 6]; + case 6: + if (!done) return [3 /*break*/, 1]; + _a.label = 7; + case 7: return [2 /*return*/, value]; + } + }); + }); + } + // convert an async iterator to a value in a synchronous manner + function toValueSync(val) { + if (!isIterator(val)) + return val; + var value; + var done = false; + var next = 'next'; + do { + var state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + if (isIterator(value)) { + try { + value = toValueSync(value); + } + catch (err) { + next = 'throw'; + value = err; + } + } + } while (!done); + return value; + } + + var rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/; + // prototype extensions + function daysInMonth(d) { + var feb = isLeapYear(d) ? 29 : 28; + return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + } + function getDayOfYear(d) { + var num = 0; + for (var i = 0; i < d.getMonth(); ++i) { + num += daysInMonth(d)[i]; + } + return num + d.getDate(); + } + function getWeekOfYear(d, startDay) { + // Skip to startDay of this week + var now = getDayOfYear(d) + (startDay - d.getDay()); + // Find the first startDay of the year + var jan1 = new Date(d.getFullYear(), 0, 1); + var then = (7 - jan1.getDay() + startDay); + return String(Math.floor((now - then) / 7) + 1); + } + function isLeapYear(d) { + var year = d.getFullYear(); + return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year))); + } + function ordinal(d) { + var date = d.getDate(); + if ([11, 12, 13].includes(date)) + return 'th'; + switch (date % 10) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + default: return 'th'; + } + } + function century(d) { + return parseInt(d.getFullYear().toString().substring(0, 2), 10); + } + // default to 0 + var padWidths = { + d: 2, + e: 2, + H: 2, + I: 2, + j: 3, + k: 2, + l: 2, + L: 3, + m: 2, + M: 2, + S: 2, + U: 2, + W: 2 + }; + var padSpaceChars = new Set('aAbBceklpP'); + function getTimezoneOffset(d, opts) { + var nOffset = Math.abs(d.getTimezoneOffset()); + var h = Math.floor(nOffset / 60); + var m = nOffset % 60; + return (d.getTimezoneOffset() > 0 ? '-' : '+') + + padStart(h, 2, '0') + + (opts.flags[':'] ? ':' : '') + + padStart(m, 2, '0'); + } + var formatCodes = { + a: function (d) { return d.getShortWeekdayName(); }, + A: function (d) { return d.getLongWeekdayName(); }, + b: function (d) { return d.getShortMonthName(); }, + B: function (d) { return d.getLongMonthName(); }, + c: function (d) { return d.toLocaleString(); }, + C: function (d) { return century(d); }, + d: function (d) { return d.getDate(); }, + e: function (d) { return d.getDate(); }, + H: function (d) { return d.getHours(); }, + I: function (d) { return String(d.getHours() % 12 || 12); }, + j: function (d) { return getDayOfYear(d); }, + k: function (d) { return d.getHours(); }, + l: function (d) { return String(d.getHours() % 12 || 12); }, + L: function (d) { return d.getMilliseconds(); }, + m: function (d) { return d.getMonth() + 1; }, + M: function (d) { return d.getMinutes(); }, + N: function (d, opts) { + var _a; + var width = Number(opts.width) || 9; + var str = String(d.getMilliseconds()).slice(0, width); + (_a = opts.memoryLimit) === null || _a === void 0 ? void 0 : _a.use(width - str.length); + return padEnd(str, width, '0'); + }, + p: function (d) { return (d.getHours() < 12 ? 'AM' : 'PM'); }, + P: function (d) { return (d.getHours() < 12 ? 'am' : 'pm'); }, + q: function (d) { return ordinal(d); }, + s: function (d) { return Math.round(d.getTime() / 1000); }, + S: function (d) { return d.getSeconds(); }, + u: function (d) { return d.getDay() || 7; }, + U: function (d) { return getWeekOfYear(d, 0); }, + w: function (d) { return d.getDay(); }, + W: function (d) { return getWeekOfYear(d, 1); }, + x: function (d) { return d.toLocaleDateString(); }, + X: function (d) { return d.toLocaleTimeString(); }, + y: function (d) { return d.getFullYear().toString().slice(2, 4); }, + Y: function (d) { return d.getFullYear(); }, + z: getTimezoneOffset, + Z: function (d, opts) { return d.getTimeZoneName() || getTimezoneOffset(d, opts); }, + 't': function () { return '\t'; }, + 'n': function () { return '\n'; }, + '%': function () { return '%'; } + }; + formatCodes.h = formatCodes.b; + function strftime(d, formatStr, memoryLimit) { + var output = ''; + var remaining = formatStr; + var match; + while ((match = rFormat.exec(remaining))) { + output += remaining.slice(0, match.index); + remaining = remaining.slice(match.index + match[0].length); + output += format(d, match, memoryLimit); + } + return output + remaining; + } + function format(d, match, memoryLimit) { + var e_1, _a; + var _b = __read(match, 5), input = _b[0], _c = _b[1], flagStr = _c === void 0 ? '' : _c, width = _b[2], modifier = _b[3], conversion = _b[4]; + var convert = formatCodes[conversion]; + if (!convert) + return input; + var flags = {}; + try { + for (var flagStr_1 = __values(flagStr), flagStr_1_1 = flagStr_1.next(); !flagStr_1_1.done; flagStr_1_1 = flagStr_1.next()) { + var flag = flagStr_1_1.value; + flags[flag] = true; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (flagStr_1_1 && !flagStr_1_1.done && (_a = flagStr_1.return)) _a.call(flagStr_1); + } + finally { if (e_1) throw e_1.error; } + } + var ret = String(convert(d, { flags: flags, width: width, modifier: modifier, memoryLimit: memoryLimit })); + var padChar = padSpaceChars.has(conversion) ? ' ' : '0'; + var padWidth = width || padWidths[conversion] || 0; + if (flags['^']) + ret = ret.toUpperCase(); + else if (flags['#']) + ret = changeCase(ret); + if (flags['_']) + padChar = ' '; + else if (flags['0']) + padChar = '0'; + if (flags['-']) + padWidth = 0; + memoryLimit === null || memoryLimit === void 0 ? void 0 : memoryLimit.use(Number(padWidth) - ret.length); + return padStart(ret, padWidth, padChar); + } + + function getDateTimeFormat() { + return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined); + } + + // one minute in milliseconds + var OneMinute = 60000; + /** + * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS + * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3 + */ + var TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/; + var monthNames = [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', + 'September', 'October', 'November', 'December' + ]; + var monthNamesShort = monthNames.map(function (name) { return name.slice(0, 3); }); + var dayNames = [ + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' + ]; + var dayNamesShort = dayNames.map(function (name) { return name.slice(0, 3); }); + /** + * A date implementation with timezone info, just like Ruby date + * + * Implementation: + * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods + * - rewrite getTimezoneOffset() to trick strftime + */ + var LiquidDate = /** @class */ (function () { + function LiquidDate(init, locale, timezone) { + this.locale = locale; + this.DateTimeFormat = getDateTimeFormat(); + this.date = new Date(init); + this.timezoneFixed = timezone !== undefined; + if (timezone === undefined) { + timezone = this.date.getTimezoneOffset(); + } + this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone; + this.timezoneName = isString(timezone) ? timezone : ''; + var diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute; + var time = this.date.getTime() + diff; + this.displayDate = new Date(time); + } + LiquidDate.prototype.getTime = function () { + return this.displayDate.getTime(); + }; + LiquidDate.prototype.getMilliseconds = function () { + return this.displayDate.getMilliseconds(); + }; + LiquidDate.prototype.getSeconds = function () { + return this.displayDate.getSeconds(); + }; + LiquidDate.prototype.getMinutes = function () { + return this.displayDate.getMinutes(); + }; + LiquidDate.prototype.getHours = function () { + return this.displayDate.getHours(); + }; + LiquidDate.prototype.getDay = function () { + return this.displayDate.getDay(); + }; + LiquidDate.prototype.getDate = function () { + return this.displayDate.getDate(); + }; + LiquidDate.prototype.getMonth = function () { + return this.displayDate.getMonth(); + }; + LiquidDate.prototype.getFullYear = function () { + return this.displayDate.getFullYear(); + }; + LiquidDate.prototype.toLocaleString = function (locale, init) { + if (init === null || init === void 0 ? void 0 : init.timeZone) { + return this.date.toLocaleString(locale, init); + } + return this.displayDate.toLocaleString(locale, init); + }; + LiquidDate.prototype.toLocaleTimeString = function (locale) { + return this.displayDate.toLocaleTimeString(locale); + }; + LiquidDate.prototype.toLocaleDateString = function (locale) { + return this.displayDate.toLocaleDateString(locale); + }; + LiquidDate.prototype.getTimezoneOffset = function () { + return this.timezoneOffset; + }; + LiquidDate.prototype.getTimeZoneName = function () { + if (this.timezoneFixed) + return this.timezoneName; + if (!this.DateTimeFormat) + return; + return this.DateTimeFormat().resolvedOptions().timeZone; + }; + LiquidDate.prototype.getLongMonthName = function () { + var _a; + return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()]; + }; + LiquidDate.prototype.getShortMonthName = function () { + var _a; + return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()]; + }; + LiquidDate.prototype.getLongWeekdayName = function () { + var _a; + return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()]; + }; + LiquidDate.prototype.getShortWeekdayName = function () { + var _a; + return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()]; + }; + LiquidDate.prototype.valid = function () { + return !isNaN(this.getTime()); + }; + LiquidDate.prototype.format = function (options) { + return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate); + }; + /** + * Create a Date object fixed to it's declared Timezone. Both + * - 2021-08-06T02:29:00.000Z and + * - 2021-08-06T02:29:00.000+08:00 + * will always be displayed as + * - 2021-08-06 02:29:00 + * regardless timezoneOffset in JavaScript realm + * + * The implementation hack: + * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`, + * we create a different Date to trick strftime, it's both simpler and more performant. + * Given that a template is expected to be parsed fewer times than rendered. + */ + LiquidDate.createDateFixedToTimezone = function (dateString, locale) { + var m = dateString.match(TIMEZONE_PATTERN); + // representing a UTC timestamp + if (m && m[1] === 'Z') { + return new LiquidDate(+new Date(dateString), locale, 0); + } + // has a timezone specified + if (m && m[2] && m[3] && m[4]) { + var _a = __read(m, 5), sign = _a[2], hours = _a[3], minutes = _a[4]; + var offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10)); + return new LiquidDate(+new Date(dateString), locale, offset); + } + return new LiquidDate(dateString, locale); + }; + LiquidDate.getTimezoneOffset = function (timezoneName, date) { + var localDateString = date.toLocaleString('en-US', { timeZone: timezoneName }); + var utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' }); + var localDate = new Date(localDateString); + var utcDate = new Date(utcDateString); + return (+utcDate - +localDate) / (60 * 1000); + }; + return LiquidDate; + }()); + + var Limiter = /** @class */ (function () { + function Limiter(resource, limit) { + this.base = 0; + this.message = "".concat(resource, " limit exceeded"); + this.limit = limit; + } + Limiter.prototype.use = function (count) { + if (+count > 0) { + assert(this.base + +count <= this.limit, this.message); + this.base += +count; + } + }; + Limiter.prototype.check = function (count) { + if (+count > 0) { + assert(+count <= this.limit, this.message); + } + }; + return Limiter; + }()); + + var DelimitedToken = /** @class */ (function (_super) { + __extends(DelimitedToken, _super); + function DelimitedToken(kind, _a, input, begin, end, trimLeft, trimRight, file) { + var _b = __read(_a, 2), contentBegin = _b[0], contentEnd = _b[1]; + var _this = _super.call(this, kind, input, begin, end, file) || this; + _this.trimLeft = false; + _this.trimRight = false; + var tl = input[contentBegin] === '-'; + var tr = input[contentEnd - 1] === '-'; + var l = tl ? contentBegin + 1 : contentBegin; + var r = tr ? contentEnd - 1 : contentEnd; + while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) + l++; + while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) + r--; + _this.contentRange = [l, r]; + _this.trimLeft = tl || trimLeft; + _this.trimRight = tr || trimRight; + return _this; + } + Object.defineProperty(DelimitedToken.prototype, "content", { + get: function () { + return this.input.slice(this.contentRange[0], this.contentRange[1]); + }, + enumerable: false, + configurable: true + }); + return DelimitedToken; + }(Token)); + + var TagToken = /** @class */ (function (_super) { + __extends(TagToken, _super); + function TagToken(input, begin, end, options, file) { + var _this = this; + var trimTagLeft = options.trimTagLeft, trimTagRight = options.trimTagRight, tagDelimiterLeft = options.tagDelimiterLeft, tagDelimiterRight = options.tagDelimiterRight; + var _a = __read([begin + tagDelimiterLeft.length, end - tagDelimiterRight.length], 2), valueBegin = _a[0], valueEnd = _a[1]; + _this = _super.call(this, exports.TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file) || this; + _this.tokenizer = new Tokenizer(input, options.operators, file, _this.contentRange); + _this.name = _this.tokenizer.readTagName(); + _this.tokenizer.assert(_this.name, "illegal tag syntax, tag name expected"); + _this.tokenizer.skipBlank(); + _this.args = _this.tokenizer.input.slice(_this.tokenizer.p, _this.contentRange[1]); + return _this; + } + return TagToken; + }(DelimitedToken)); + + var OutputToken = /** @class */ (function (_super) { + __extends(OutputToken, _super); + function OutputToken(input, begin, end, options, file) { + var trimOutputLeft = options.trimOutputLeft, trimOutputRight = options.trimOutputRight, outputDelimiterLeft = options.outputDelimiterLeft, outputDelimiterRight = options.outputDelimiterRight; + var valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]; + return _super.call(this, exports.TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file) || this; + } + return OutputToken; + }(DelimitedToken)); + + var HTMLToken = /** @class */ (function (_super) { + __extends(HTMLToken, _super); + function HTMLToken(input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.HTML, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + _this.trimLeft = 0; + _this.trimRight = 0; + return _this; + } + HTMLToken.prototype.getContent = function () { + return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight); + }; + return HTMLToken; + }(Token)); + + var NumberToken = /** @class */ (function (_super) { + __extends(NumberToken, _super); + function NumberToken(input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.Number, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + _this.content = Number(_this.getText()); + return _this; + } + return NumberToken; + }(Token)); + + var IdentifierToken = /** @class */ (function (_super) { + __extends(IdentifierToken, _super); + function IdentifierToken(input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.Word, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + _this.content = _this.getText(); + return _this; + } + return IdentifierToken; + }(Token)); + + var LiteralToken = /** @class */ (function (_super) { + __extends(LiteralToken, _super); + function LiteralToken(input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.Literal, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + _this.literal = _this.getText(); + _this.content = literalValues[_this.literal]; + return _this; + } + return LiteralToken; + }(Token)); + + var operatorPrecedences = { + '==': 2, + '!=': 2, + '>': 2, + '<': 2, + '>=': 2, + '<=': 2, + 'contains': 2, + 'not': 1, + 'and': 0, + 'or': 0 + }; + var operatorTypes = { + '==': 0 /* OperatorType.Binary */, + '!=': 0 /* OperatorType.Binary */, + '>': 0 /* OperatorType.Binary */, + '<': 0 /* OperatorType.Binary */, + '>=': 0 /* OperatorType.Binary */, + '<=': 0 /* OperatorType.Binary */, + 'contains': 0 /* OperatorType.Binary */, + 'not': 1 /* OperatorType.Unary */, + 'and': 0 /* OperatorType.Binary */, + 'or': 0 /* OperatorType.Binary */ + }; + var OperatorToken = /** @class */ (function (_super) { + __extends(OperatorToken, _super); + function OperatorToken(input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.Operator, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + _this.operator = _this.getText(); + return _this; + } + OperatorToken.prototype.getPrecedence = function () { + var key = this.getText(); + return key in operatorPrecedences ? operatorPrecedences[key] : 1; + }; + return OperatorToken; + }(Token)); + + var PropertyAccessToken = /** @class */ (function (_super) { + __extends(PropertyAccessToken, _super); + function PropertyAccessToken(variable, props, input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.PropertyAccess, input, begin, end, file) || this; + _this.variable = variable; + _this.props = props; + return _this; + } + return PropertyAccessToken; + }(Token)); + + var FilterToken = /** @class */ (function (_super) { + __extends(FilterToken, _super); + function FilterToken(name, args, input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.Filter, input, begin, end, file) || this; + _this.name = name; + _this.args = args; + return _this; + } + return FilterToken; + }(Token)); + + var HashToken = /** @class */ (function (_super) { + __extends(HashToken, _super); + function HashToken(input, begin, end, name, value, file) { + var _this = _super.call(this, exports.TokenKind.Hash, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.name = name; + _this.value = value; + _this.file = file; + return _this; + } + return HashToken; + }(Token)); + + var rHex = /[\da-fA-F]/; + var rOct = /[0-7]/; + var escapeChar = { + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + v: '\x0B' + }; + function hexVal(c) { + var code = c.charCodeAt(0); + if (code >= 97) + return code - 87; + if (code >= 65) + return code - 55; + return code - 48; + } + function parseStringLiteral(str) { + var ret = ''; + for (var i = 1; i < str.length - 1; i++) { + if (str[i] !== '\\') { + ret += str[i]; + continue; + } + if (escapeChar[str[i + 1]] !== undefined) { + ret += escapeChar[str[++i]]; + } + else if (str[i + 1] === 'u') { + var val = 0; + var j = i + 2; + while (j <= i + 5 && rHex.test(str[j])) { + val = val * 16 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + else if (!rOct.test(str[i + 1])) { + ret += str[++i]; + } + else { + var j = i + 1; + var val = 0; + while (j <= i + 3 && rOct.test(str[j])) { + val = val * 8 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + } + return ret; + } + + var QuotedToken = /** @class */ (function (_super) { + __extends(QuotedToken, _super); + function QuotedToken(input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.Quoted, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + _this.content = parseStringLiteral(_this.getText()); + return _this; + } + return QuotedToken; + }(Token)); + + var RangeToken = /** @class */ (function (_super) { + __extends(RangeToken, _super); + function RangeToken(input, begin, end, lhs, rhs, file) { + var _this = _super.call(this, exports.TokenKind.Range, input, begin, end, file) || this; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.lhs = lhs; + _this.rhs = rhs; + _this.file = file; + return _this; + } + return RangeToken; + }(Token)); + + /** + * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}` + */ + var LiquidTagToken = /** @class */ (function (_super) { + __extends(LiquidTagToken, _super); + function LiquidTagToken(input, begin, end, options, file) { + var _this = _super.call(this, exports.TokenKind.Tag, [begin, end], input, begin, end, false, false, file) || this; + _this.tokenizer = new Tokenizer(input, options.operators, file, _this.contentRange); + _this.name = _this.tokenizer.readTagName(); + _this.tokenizer.assert(_this.name, 'illegal liquid tag syntax'); + _this.tokenizer.skipBlank(); + return _this; + } + Object.defineProperty(LiquidTagToken.prototype, "args", { + get: function () { + return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + }, + enumerable: false, + configurable: true + }); + return LiquidTagToken; + }(DelimitedToken)); + + /** + * value expression with optional filters + * e.g. + * {% assign foo="bar" | append: "coo" %} + */ + var FilteredValueToken = /** @class */ (function (_super) { + __extends(FilteredValueToken, _super); + function FilteredValueToken(initial, filters, input, begin, end, file) { + var _this = _super.call(this, exports.TokenKind.FilteredValue, input, begin, end, file) || this; + _this.initial = initial; + _this.filters = filters; + _this.input = input; + _this.begin = begin; + _this.end = end; + _this.file = file; + return _this; + } + return FilteredValueToken; + }(Token)); + + var polyfill = { + now: function () { return Date.now(); } + }; + function getPerformance() { + return (typeof global === 'object' && global.performance) || + (typeof window === 'object' && window.performance) || + polyfill; + } + + var Render = /** @class */ (function () { + function Render() { + } + Render.prototype.renderTemplatesToNodeStream = function (templates, ctx) { + var _this = this; + var emitter = new StreamedEmitter(); + Promise.resolve().then(function () { return toPromise(_this.renderTemplates(templates, ctx, emitter)); }) + .then(function () { return emitter.end(); }, function (err) { return emitter.error(err); }); + return emitter.stream; + }; + Render.prototype.renderTemplates = function (templates, ctx, emitter) { + var errors, templates_1, templates_1_1, tpl, html, e_1, err, e_2_1; + var e_2, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!emitter) { + emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter(); + } + ctx.renderLimit.check(getPerformance().now()); + errors = []; + _b.label = 1; + case 1: + _b.trys.push([1, 8, 9, 10]); + templates_1 = __values(templates), templates_1_1 = templates_1.next(); + _b.label = 2; + case 2: + if (!!templates_1_1.done) return [3 /*break*/, 7]; + tpl = templates_1_1.value; + ctx.renderLimit.check(getPerformance().now()); + _b.label = 3; + case 3: + _b.trys.push([3, 5, , 6]); + return [4 /*yield*/, tpl.render(ctx, emitter) + // if not, it'll return an `html`, write to the emitter for it + ]; + case 4: + html = _b.sent(); + // if not, it'll return an `html`, write to the emitter for it + html && emitter.write(html); + if (ctx.breakCalled || ctx.continueCalled) + return [3 /*break*/, 7]; + return [3 /*break*/, 6]; + case 5: + e_1 = _b.sent(); + err = LiquidError.is(e_1) ? e_1 : new RenderError(e_1, tpl); + if (ctx.opts.catchAllErrors) + errors.push(err); + else + throw err; + return [3 /*break*/, 6]; + case 6: + templates_1_1 = templates_1.next(); + return [3 /*break*/, 2]; + case 7: return [3 /*break*/, 10]; + case 8: + e_2_1 = _b.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 10]; + case 9: + try { + if (templates_1_1 && !templates_1_1.done && (_a = templates_1.return)) _a.call(templates_1); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 10: + if (errors.length) { + throw new LiquidErrors(errors); + } + return [2 /*return*/, emitter.buffer]; + } + }); + }; + return Render; + }()); + + var Expression = /** @class */ (function () { + function Expression(tokens) { + this.postfix = __spreadArray([], __read(toPostfix(tokens)), false); + } + Expression.prototype.evaluate = function (ctx, lenient) { + var operands, _a, _b, token, r, result, l, _c, _d, e_1_1; + var e_1, _e; + return __generator(this, function (_f) { + switch (_f.label) { + case 0: + assert(ctx, 'unable to evaluate: context not defined'); + operands = []; + _f.label = 1; + case 1: + _f.trys.push([1, 11, 12, 13]); + _a = __values(this.postfix), _b = _a.next(); + _f.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 10]; + token = _b.value; + if (!isOperatorToken(token)) return [3 /*break*/, 7]; + r = operands.pop(); + result = void 0; + if (!(operatorTypes[token.operator] === 1 /* OperatorType.Unary */)) return [3 /*break*/, 4]; + return [4 /*yield*/, ctx.opts.operators[token.operator](r, ctx)]; + case 3: + result = _f.sent(); + return [3 /*break*/, 6]; + case 4: + l = operands.pop(); + return [4 /*yield*/, ctx.opts.operators[token.operator](l, r, ctx)]; + case 5: + result = _f.sent(); + _f.label = 6; + case 6: + operands.push(result); + return [3 /*break*/, 9]; + case 7: + _d = (_c = operands).push; + return [4 /*yield*/, evalToken(token, ctx, lenient)]; + case 8: + _d.apply(_c, [_f.sent()]); + _f.label = 9; + case 9: + _b = _a.next(); + return [3 /*break*/, 2]; + case 10: return [3 /*break*/, 13]; + case 11: + e_1_1 = _f.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 13]; + case 12: + try { + if (_b && !_b.done && (_e = _a.return)) _e.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 13: return [2 /*return*/, operands[0]]; + } + }); + }; + Expression.prototype.valid = function () { + return !!this.postfix.length; + }; + return Expression; + }()); + function evalToken(token, ctx, lenient) { + if (lenient === void 0) { lenient = false; } + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!token) + return [2 /*return*/]; + if ('content' in token) + return [2 /*return*/, token.content]; + if (!isPropertyAccessToken(token)) return [3 /*break*/, 2]; + return [4 /*yield*/, evalPropertyAccessToken(token, ctx, lenient)]; + case 1: return [2 /*return*/, _a.sent()]; + case 2: + if (!isRangeToken(token)) return [3 /*break*/, 4]; + return [4 /*yield*/, evalRangeToken(token, ctx)]; + case 3: return [2 /*return*/, _a.sent()]; + case 4: return [2 /*return*/]; + } + }); + } + function evalPropertyAccessToken(token, ctx, lenient) { + var props, _a, _b, prop, _c, _d, e_2_1, variable, e_3; + var e_2, _e; + return __generator(this, function (_f) { + switch (_f.label) { + case 0: + props = []; + _f.label = 1; + case 1: + _f.trys.push([1, 6, 7, 8]); + _a = __values(token.props), _b = _a.next(); + _f.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 5]; + prop = _b.value; + _d = (_c = props).push; + return [4 /*yield*/, evalToken(prop, ctx, false)]; + case 3: + _d.apply(_c, [(_f.sent())]); + _f.label = 4; + case 4: + _b = _a.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_2_1 = _f.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (_b && !_b.done && (_e = _a.return)) _e.call(_a); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 8: + _f.trys.push([8, 14, , 15]); + if (!token.variable) return [3 /*break*/, 11]; + return [4 /*yield*/, evalToken(token.variable, ctx, lenient)]; + case 9: + variable = _f.sent(); + return [4 /*yield*/, ctx._getFromScope(variable, props)]; + case 10: return [2 /*return*/, _f.sent()]; + case 11: return [4 /*yield*/, ctx._get(props)]; + case 12: return [2 /*return*/, _f.sent()]; + case 13: return [3 /*break*/, 15]; + case 14: + e_3 = _f.sent(); + if (lenient && e_3.name === 'InternalUndefinedVariableError') + return [2 /*return*/, null]; + throw (new UndefinedVariableError(e_3, token)); + case 15: return [2 /*return*/]; + } + }); + } + function evalQuotedToken(token) { + return token.content; + } + function evalRangeToken(token, ctx) { + var low, high; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, evalToken(token.lhs, ctx)]; + case 1: + low = _a.sent(); + return [4 /*yield*/, evalToken(token.rhs, ctx)]; + case 2: + high = _a.sent(); + ctx.memoryLimit.use(high - low + 1); + return [2 /*return*/, range(+low, +high + 1)]; + } + }); + } + function toPostfix(tokens) { + var ops, tokens_1, tokens_1_1, token, e_4_1; + var e_4, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + ops = []; + _b.label = 1; + case 1: + _b.trys.push([1, 10, 11, 12]); + tokens_1 = __values(tokens), tokens_1_1 = tokens_1.next(); + _b.label = 2; + case 2: + if (!!tokens_1_1.done) return [3 /*break*/, 9]; + token = tokens_1_1.value; + if (!isOperatorToken(token)) return [3 /*break*/, 6]; + _b.label = 3; + case 3: + if (!(ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence())) return [3 /*break*/, 5]; + return [4 /*yield*/, ops.pop()]; + case 4: + _b.sent(); + return [3 /*break*/, 3]; + case 5: + ops.push(token); + return [3 /*break*/, 8]; + case 6: return [4 /*yield*/, token]; + case 7: + _b.sent(); + _b.label = 8; + case 8: + tokens_1_1 = tokens_1.next(); + return [3 /*break*/, 2]; + case 9: return [3 /*break*/, 12]; + case 10: + e_4_1 = _b.sent(); + e_4 = { error: e_4_1 }; + return [3 /*break*/, 12]; + case 11: + try { + if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1); + } + finally { if (e_4) throw e_4.error; } + return [7 /*endfinally*/]; + case 12: + if (!ops.length) return [3 /*break*/, 14]; + return [4 /*yield*/, ops.pop()]; + case 13: + _b.sent(); + return [3 /*break*/, 12]; + case 14: return [2 /*return*/]; + } + }); + } + + function isTruthy(val, ctx) { + return !isFalsy(val, ctx); + } + function isFalsy(val, ctx) { + val = toValue(val); + if (ctx.opts.jsTruthy) { + return !val; + } + else { + return val === false || undefined === val || val === null; + } + } + + var defaultOperators = { + '==': equals, + '!=': function (l, r) { return !equals(l, r); }, + '>': function (l, r) { + if (isComparable(l)) + return l.gt(r); + if (isComparable(r)) + return r.lt(l); + return toValue(l) > toValue(r); + }, + '<': function (l, r) { + if (isComparable(l)) + return l.lt(r); + if (isComparable(r)) + return r.gt(l); + return toValue(l) < toValue(r); + }, + '>=': function (l, r) { + if (isComparable(l)) + return l.geq(r); + if (isComparable(r)) + return r.leq(l); + return toValue(l) >= toValue(r); + }, + '<=': function (l, r) { + if (isComparable(l)) + return l.leq(r); + if (isComparable(r)) + return r.geq(l); + return toValue(l) <= toValue(r); + }, + 'contains': function (l, r) { + l = toValue(l); + if (isArray(l)) + return l.some(function (i) { return equals(i, r); }); + if (isFunction(l === null || l === void 0 ? void 0 : l.indexOf)) + return l.indexOf(toValue(r)) > -1; + return false; + }, + 'not': function (v, ctx) { return isFalsy(toValue(v), ctx); }, + 'and': function (l, r, ctx) { return isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx); }, + 'or': function (l, r, ctx) { return isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx); } + }; + function equals(lhs, rhs) { + if (isComparable(lhs)) + return lhs.equals(rhs); + if (isComparable(rhs)) + return rhs.equals(lhs); + lhs = toValue(lhs); + rhs = toValue(rhs); + if (isArray(lhs)) { + return isArray(rhs) && arrayEquals(lhs, rhs); + } + return lhs === rhs; + } + function arrayEquals(lhs, rhs) { + if (lhs.length !== rhs.length) + return false; + return !lhs.some(function (value, i) { return !equals(value, rhs[i]); }); + } + function arrayIncludes(arr, item) { + return arr.some(function (value) { return equals(value, item); }); + } + + var Node = /** @class */ (function () { + function Node(key, value, next, prev) { + this.key = key; + this.value = value; + this.next = next; + this.prev = prev; + } + return Node; + }()); + var LRU = /** @class */ (function () { + function LRU(limit, size) { + if (size === void 0) { size = 0; } + this.limit = limit; + this.size = size; + this.cache = {}; + this.head = new Node('HEAD', null, null, null); + this.tail = new Node('TAIL', null, null, null); + this.head.next = this.tail; + this.tail.prev = this.head; + } + LRU.prototype.write = function (key, value) { + if (this.cache[key]) { + this.cache[key].value = value; + } + else { + var node = new Node(key, value, this.head.next, this.head); + this.head.next.prev = node; + this.head.next = node; + this.cache[key] = node; + this.size++; + this.ensureLimit(); + } + }; + LRU.prototype.read = function (key) { + if (!this.cache[key]) + return; + var value = this.cache[key].value; + this.remove(key); + this.write(key, value); + return value; + }; + LRU.prototype.remove = function (key) { + var node = this.cache[key]; + node.prev.next = node.next; + node.next.prev = node.prev; + delete this.cache[key]; + this.size--; + }; + LRU.prototype.clear = function () { + this.head.next = this.tail; + this.tail.prev = this.head; + this.size = 0; + this.cache = {}; + }; + LRU.prototype.ensureLimit = function () { + if (this.size > this.limit) + this.remove(this.tail.prev.key); + }; + return LRU; + }()); + + function domResolve(root, path) { + var base = document.createElement('base'); + base.href = root; + var head = document.getElementsByTagName('head')[0]; + head.insertBefore(base, head.firstChild); + var a = document.createElement('a'); + a.href = path; + var resolved = a.href; + head.removeChild(base); + return resolved; + } + function resolve(root, filepath, ext) { + if (root.length && last(root) !== '/') + root += '/'; + var url = domResolve(root, filepath); + return url.replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/, function (str, origin, path) { + var last = path.split('/').pop(); + if (/\.\w+$/.test(last)) + return str; + return origin + path + ext; + }); + } + function readFile(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.onload = function () { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(xhr.responseText); + } + else { + reject(new Error(xhr.statusText)); + } + }; + xhr.onerror = function () { + reject(new Error('An error occurred whilst receiving the response.')); + }; + xhr.open('GET', url); + xhr.send(); + })]; + }); + }); + } + function readFileSync(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(); + if (xhr.status < 200 || xhr.status >= 300) { + throw new Error(xhr.statusText); + } + return xhr.responseText; + } + function exists(filepath) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, true]; + }); + }); + } + function existsSync(filepath) { + return true; + } + function dirname(filepath) { + return domResolve(filepath, '.'); + } + var sep = '/'; + + var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + resolve: resolve, + readFile: readFile, + readFileSync: readFileSync, + exists: exists, + existsSync: existsSync, + dirname: dirname, + sep: sep + }); + + function defaultFilter(value, defaultValue) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + value = toValue(value); + if (isArray(value) || isString(value)) + return value.length ? value : defaultValue; + if (value === false && (new Map(args)).get('allow_false')) + return false; + return isFalsy(value, this.context) ? defaultValue : value; + } + function json(value, space) { + if (space === void 0) { space = 0; } + return JSON.stringify(value, null, space); + } + function inspect(value, space) { + if (space === void 0) { space = 0; } + var ancestors = []; + return JSON.stringify(value, function (_key, value) { + if (typeof value !== 'object' || value === null) + return value; + // `this` is the object that value is contained in, i.e., its direct parent. + while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) + ancestors.pop(); + if (ancestors.includes(value)) + return '[Circular]'; + ancestors.push(value); + return value; + }, space); + } + function to_integer(value) { + return Number(value); + } + var raw = { + raw: true, + handler: identify + }; + var misc = { + default: defaultFilter, + raw: raw, + jsonify: json, + to_integer: to_integer, + json: json, + inspect: inspect + }; + + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + var unescapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + function escape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; }); + } + function xml_escape(str) { + return escape.call(this, str); + } + function unescape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; }); + } + function escape_once(str) { + return escape.call(this, unescape.call(this, str)); + } + function newline_to_br(v) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, '
    \n'); + } + // Raw-text blocks (HTML5) plus '<...>' as the catch-all kind; a regex + // equivalent is O(n^2) in V8 on unclosed openers. + function strip_html(v) { + var e_1, _a; + var str = stringify(v); + this.context.memoryLimit.use(str.length); + var blocks = new Map([[''], [''], [''], ['<', '>']]); + var out = ''; + var i = 0; + while (i < str.length) { + var lt = str.indexOf('<', i); + if (lt < 0) + return out + str.slice(i); + out += str.slice(i, lt); + try { + for (var blocks_1 = (e_1 = void 0, __values(blocks)), blocks_1_1 = blocks_1.next(); !blocks_1_1.done; blocks_1_1 = blocks_1.next()) { + var _b = __read(blocks_1_1.value, 2), opener_1 = _b[0], closer = _b[1]; + if (!str.startsWith(opener_1, lt)) + continue; + var e = str.indexOf(closer, lt + opener_1.length); + if (e >= 0) { + i = e + closer.length; + break; + } + blocks.delete(opener_1); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (blocks_1_1 && !blocks_1_1.done && (_a = blocks_1.return)) _a.call(blocks_1); + } + finally { if (e_1) throw e_1.error; } + } + if (i === lt) + return out + str.slice(lt); + } + return out; + } + + var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html + }); + + var MapFS = /** @class */ (function () { + function MapFS(mapping) { + this.mapping = mapping; + this.sep = '/'; + } + MapFS.prototype.exists = function (filepath) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.existsSync(filepath)]; + }); + }); + }; + MapFS.prototype.existsSync = function (filepath) { + return !isNil(this.mapping[filepath]); + }; + MapFS.prototype.readFile = function (filepath) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.readFileSync(filepath)]; + }); + }); + }; + MapFS.prototype.readFileSync = function (filepath) { + var content = this.mapping[filepath]; + if (isNil(content)) + throw new Error("ENOENT: ".concat(filepath)); + return content; + }; + MapFS.prototype.dirname = function (filepath) { + var segments = filepath.split(this.sep); + segments.pop(); + return segments.join(this.sep); + }; + MapFS.prototype.resolve = function (dir, file, ext) { + var e_1, _a; + file += ext; + if (dir === '.') + return file; + var segments = dir.split(/\/+/); + try { + for (var _b = __values(file.split(this.sep)), _c = _b.next(); !_c.done; _c = _b.next()) { + var segment = _c.value; + if (segment === '.' || segment === '') + continue; + else if (segment === '..') { + if (segments.length > 1 || segments[0] !== '') + segments.pop(); + } + else + segments.push(segment); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } + return segments.join(this.sep); + }; + return MapFS; + }()); + + var defaultOptions = { + root: ['.'], + layouts: ['.'], + partials: ['.'], + relativeReference: true, + jekyllInclude: false, + keyValueSeparator: ':', + cache: undefined, + extname: '', + fs: fs, + dynamicPartials: true, + jsTruthy: false, + dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z', + locale: '', + trimTagRight: false, + trimTagLeft: false, + trimOutputRight: false, + trimOutputLeft: false, + greedy: true, + tagDelimiterLeft: '{%', + tagDelimiterRight: '%}', + outputDelimiterLeft: '{{', + outputDelimiterRight: '}}', + preserveTimezones: false, + strictFilters: false, + strictVariables: false, + ownPropertyOnly: true, + lenientIf: false, + globals: {}, + keepOutputType: false, + operators: defaultOperators, + memoryLimit: Infinity, + parseLimit: Infinity, + renderLimit: Infinity + }; + function normalize(options) { + var _a, _b; + if (options.hasOwnProperty('root')) { + if (!options.hasOwnProperty('partials')) + options.partials = options.root; + if (!options.hasOwnProperty('layouts')) + options.layouts = options.root; + } + if (options.hasOwnProperty('cache')) { + var cache = void 0; + if (typeof options.cache === 'number') + cache = options.cache > 0 ? new LRU(options.cache) : undefined; + else if (typeof options.cache === 'object') + cache = options.cache; + else + cache = options.cache ? new LRU(1024) : undefined; + options.cache = cache; + } + options = __assign(__assign(__assign({}, defaultOptions), (options.jekyllInclude ? { dynamicPartials: false } : {})), options); + if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) { + console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning'); + options.relativeReference = false; + } + options.root = normalizeDirectoryList(options.root); + options.partials = normalizeDirectoryList(options.partials); + options.layouts = normalizeDirectoryList(options.layouts); + options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape); + if (!options.locale) { + options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US'; + } + if (options.templates) { + options.fs = new MapFS(options.templates); + options.relativeReference = true; + options.root = options.partials = options.layouts = '.'; + } + return options; + } + function getOutputEscapeFunction(nameOrFunction) { + if (nameOrFunction === 'escape') + return escape; + if (nameOrFunction === 'json') + return misc.json; + assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function'); + return nameOrFunction; + } + function normalizeDirectoryList(value) { + var list = []; + if (isArray(value)) + list = value; + if (isString(value)) + list = [value]; + return list; + } + + function whiteSpaceCtrl(tokens, options) { + var inRaw = false; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (!isDelimitedToken(token)) + continue; + if (!inRaw && token.trimLeft) { + trimLeft(tokens[i - 1], options.greedy); + } + if (isTagToken(token)) { + if (token.name === 'raw') + inRaw = true; + else if (token.name === 'endraw') + inRaw = false; + } + if (!inRaw && token.trimRight) { + trimRight(tokens[i + 1], options.greedy); + } + } + } + function trimLeft(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + var mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) + token.trimRight++; + } + function trimRight(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + var mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) + token.trimLeft++; + if (token.input.charAt(token.begin + token.trimLeft) === '\n') + token.trimLeft++; + } + + var Tokenizer = /** @class */ (function () { + function Tokenizer(input, operators, file, range) { + if (operators === void 0) { operators = defaultOptions.operators; } + this.input = input; + this.file = file; + this.rawBeginAt = -1; + this.p = range ? range[0] : 0; + this.N = range ? range[1] : input.length; + this.opTrie = createTrie(operators); + this.literalTrie = createTrie(literalValues); + } + Tokenizer.prototype.readExpression = function () { + return new Expression(this.readExpressionTokens()); + }; + Tokenizer.prototype.readExpressionTokens = function () { + var operator, operand; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(this.p < this.N)) return [3 /*break*/, 5]; + operator = this.readOperator(); + if (!operator) return [3 /*break*/, 2]; + return [4 /*yield*/, operator]; + case 1: + _a.sent(); + return [3 /*break*/, 0]; + case 2: + operand = this.readValue(); + if (!operand) return [3 /*break*/, 4]; + return [4 /*yield*/, operand]; + case 3: + _a.sent(); + return [3 /*break*/, 0]; + case 4: return [2 /*return*/]; + case 5: return [2 /*return*/]; + } + }); + }; + Tokenizer.prototype.readOperator = function () { + this.skipBlank(); + var end = this.matchTrie(this.opTrie); + if (end === -1) + return; + return new OperatorToken(this.input, this.p, (this.p = end), this.file); + }; + Tokenizer.prototype.matchTrie = function (trie) { + var node = trie; + var i = this.p; + var info; + while (node[this.input[i]] && i < this.N) { + node = node[this.input[i++]]; + if (node['end']) + info = node; + } + if (!info) + return -1; + if (info['needBoundary'] && isWord(this.peek(i - this.p))) + return -1; + return i; + }; + Tokenizer.prototype.readFilteredValue = function () { + var begin = this.p; + var initial = this.readExpression(); + this.assert(initial.valid(), "invalid value expression: ".concat(this.snapshot())); + var filters = this.readFilters(); + return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file); + }; + Tokenizer.prototype.readFilters = function () { + var filters = []; + while (true) { + var filter = this.readFilter(); + if (!filter) + return filters; + filters.push(filter); + } + }; + Tokenizer.prototype.readFilter = function () { + var _this = this; + this.skipBlank(); + if (this.end()) + return null; + this.assert(this.read() === '|', "expected \"|\" before filter"); + var name = this.readIdentifier(); + if (!name.size()) { + this.assert(this.end(), "expected filter name"); + return null; + } + var args = []; + this.skipBlank(); + if (this.peek() === ':') { + do { + ++this.p; + var arg = this.readFilterArg(); + arg && args.push(arg); + this.skipBlank(); + this.assert(this.end() || this.peek() === ',' || this.peek() === '|', function () { return "unexpected character ".concat(_this.snapshot()); }); + } while (this.peek() === ','); + } + else if (this.peek() === '|' || this.end()) ; + else { + throw this.error('expected ":" after filter name'); + } + return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file); + }; + Tokenizer.prototype.readFilterArg = function () { + var key = this.readValue(); + if (!key) + return; + this.skipBlank(); + if (this.peek() !== ':') + return key; + ++this.p; + var value = this.readValue(); + return [key.getText(), value]; + }; + Tokenizer.prototype.readTopLevelTokens = function (options) { + if (options === void 0) { options = defaultOptions; } + var tokens = []; + while (this.p < this.N) { + var token = this.readTopLevelToken(options); + tokens.push(token); + } + whiteSpaceCtrl(tokens, options); + return tokens; + }; + Tokenizer.prototype.readTopLevelToken = function (options) { + var tagDelimiterLeft = options.tagDelimiterLeft, outputDelimiterLeft = options.outputDelimiterLeft; + if (this.rawBeginAt > -1) + return this.readEndrawOrRawContent(options); + if (this.match(tagDelimiterLeft)) + return this.readTagToken(options); + if (this.match(outputDelimiterLeft)) + return this.readOutputToken(options); + return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]); + }; + Tokenizer.prototype.readHTMLToken = function (stopStrings) { + var _this = this; + var begin = this.p; + while (this.p < this.N) { + if (stopStrings.some(function (str) { return _this.match(str); })) + break; + ++this.p; + } + return new HTMLToken(this.input, begin, this.p, this.file); + }; + Tokenizer.prototype.readTagToken = function (options) { + var _a = this, file = _a.file, input = _a.input; + var begin = this.p; + if (this.readToDelimiter(options.tagDelimiterRight) === -1) { + throw this.error("tag ".concat(this.snapshot(begin), " not closed"), begin); + } + var token = new TagToken(input, begin, this.p, options, file); + if (token.name === 'raw') + this.rawBeginAt = begin; + return token; + }; + Tokenizer.prototype.readToDelimiter = function (delimiter, respectQuoted) { + if (respectQuoted === void 0) { respectQuoted = false; } + this.skipBlank(); + while (this.p < this.N) { + if (respectQuoted && (this.peekType() & QUOTE)) { + this.readQuoted(); + continue; + } + ++this.p; + if (this.rmatch(delimiter)) + return this.p; + } + return -1; + }; + Tokenizer.prototype.readOutputToken = function (options) { + if (options === void 0) { options = defaultOptions; } + var _a = this, file = _a.file, input = _a.input; + var outputDelimiterRight = options.outputDelimiterRight; + var begin = this.p; + if (this.readToDelimiter(outputDelimiterRight, true) === -1) { + throw this.error("output ".concat(this.snapshot(begin), " not closed"), begin); + } + return new OutputToken(input, begin, this.p, options, file); + }; + Tokenizer.prototype.readEndrawOrRawContent = function (options) { + var tagDelimiterLeft = options.tagDelimiterLeft, tagDelimiterRight = options.tagDelimiterRight; + var begin = this.p; + var leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + while (this.p < this.N) { + if (this.readIdentifier().getText() !== 'endraw') { + leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + continue; + } + while (this.p <= this.N) { + if (this.rmatch(tagDelimiterRight)) { + var end = this.p; + if (begin === leftPos) { + this.rawBeginAt = -1; + return new TagToken(this.input, begin, end, options, this.file); + } + else { + this.p = leftPos; + return new HTMLToken(this.input, begin, leftPos, this.file); + } + } + if (this.rmatch(tagDelimiterLeft)) + break; + this.p++; + } + } + throw this.error("raw ".concat(this.snapshot(this.rawBeginAt), " not closed"), begin); + }; + Tokenizer.prototype.readLiquidTagTokens = function (options) { + if (options === void 0) { options = defaultOptions; } + var tokens = []; + while (this.p < this.N) { + var token = this.readLiquidTagToken(options); + token && tokens.push(token); + } + return tokens; + }; + Tokenizer.prototype.readLiquidTagToken = function (options) { + this.skipBlank(); + if (this.end()) + return; + var begin = this.p; + this.readToDelimiter('\n'); + var end = this.p; + return new LiquidTagToken(this.input, begin, end, options, this.file); + }; + Tokenizer.prototype.error = function (msg, pos) { + if (pos === void 0) { pos = this.p; } + return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file)); + }; + Tokenizer.prototype.assert = function (pred, msg, pos) { + if (!pred) + throw this.error(typeof msg === 'function' ? msg() : msg, pos); + }; + Tokenizer.prototype.snapshot = function (begin) { + if (begin === void 0) { begin = this.p; } + return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32)); + }; + /** + * @deprecated use #readIdentifier instead + */ + Tokenizer.prototype.readWord = function () { + return this.readIdentifier(); + }; + Tokenizer.prototype.readIdentifier = function () { + this.skipBlank(); + var begin = this.p; + while (!this.end() && isWord(this.peek())) + ++this.p; + return new IdentifierToken(this.input, begin, this.p, this.file); + }; + Tokenizer.prototype.readNonEmptyIdentifier = function () { + var id = this.readIdentifier(); + return id.size() ? id : undefined; + }; + Tokenizer.prototype.readTagName = function () { + this.skipBlank(); + // Handle inline comment tags + if (this.input[this.p] === '#') + return this.input.slice(this.p, ++this.p); + return this.readIdentifier().getText(); + }; + Tokenizer.prototype.readHashes = function (jekyllStyle) { + var hashes = []; + while (true) { + var hash = this.readHash(jekyllStyle); + if (!hash) + return hashes; + hashes.push(hash); + } + }; + Tokenizer.prototype.readHash = function (jekyllStyle) { + this.skipBlank(); + if (this.peek() === ',') + ++this.p; + var begin = this.p; + var name = this.readNonEmptyIdentifier(); + if (!name) + return; + var value; + this.skipBlank(); + var sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':'); + if (this.peek() === sep) { + ++this.p; + value = this.readValue(); + } + return new HashToken(this.input, begin, this.p, name, value, this.file); + }; + Tokenizer.prototype.remaining = function () { + return this.input.slice(this.p, this.N); + }; + Tokenizer.prototype.advance = function (step) { + if (step === void 0) { step = 1; } + this.p += step; + }; + Tokenizer.prototype.end = function () { + return this.p >= this.N; + }; + Tokenizer.prototype.read = function () { + return this.input[this.p++]; + }; + Tokenizer.prototype.readTo = function (end) { + while (this.p < this.N) { + ++this.p; + if (this.rmatch(end)) + return this.p; + } + return -1; + }; + Tokenizer.prototype.readValue = function () { + this.skipBlank(); + var begin = this.p; + var variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber(); + var props = this.readProperties(!variable); + if (!props.length) + return variable; + return new PropertyAccessToken(variable, props, this.input, begin, this.p); + }; + Tokenizer.prototype.readScopeValue = function () { + this.skipBlank(); + var begin = this.p; + var props = this.readProperties(); + if (!props.length) + return undefined; + return new PropertyAccessToken(undefined, props, this.input, begin, this.p); + }; + Tokenizer.prototype.readProperties = function (isBegin) { + if (isBegin === void 0) { isBegin = true; } + var props = []; + while (true) { + if (this.peek() === '[') { + this.p++; + var prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file); + this.assert(this.readTo(']') !== -1, '[ not closed'); + props.push(prop); + continue; + } + if (isBegin && !props.length) { + var prop = this.readNonEmptyIdentifier(); + if (prop) { + props.push(prop); + continue; + } + } + if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax + this.p++; + var prop = this.readNonEmptyIdentifier(); + if (!prop) + break; + props.push(prop); + continue; + } + break; + } + return props; + }; + Tokenizer.prototype.readNumber = function () { + this.skipBlank(); + var decimalFound = false; + var digitFound = false; + var n = 0; + if (this.peekType() & SIGN) + n++; + while (this.p + n <= this.N) { + if (this.peekType(n) & NUMBER) { + digitFound = true; + n++; + } + else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') { + if (decimalFound || !digitFound) + return; + decimalFound = true; + n++; + } + else + break; + } + if (digitFound && !isWord(this.peek(n))) { + var num = new NumberToken(this.input, this.p, this.p + n, this.file); + this.advance(n); + return num; + } + }; + Tokenizer.prototype.readLiteral = function () { + this.skipBlank(); + var end = this.matchTrie(this.literalTrie); + if (end === -1) + return; + var literal = new LiteralToken(this.input, this.p, end, this.file); + this.p = end; + return literal; + }; + Tokenizer.prototype.readRange = function () { + this.skipBlank(); + var begin = this.p; + if (this.peek() !== '(') + return; + ++this.p; + var lhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax'); + var rhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === ')', 'invalid range syntax'); + return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file); + }; + Tokenizer.prototype.readValueOrThrow = function () { + var _this = this; + var value = this.readValue(); + this.assert(value, function () { return "unexpected token ".concat(_this.snapshot(), ", value expected"); }); + return value; + }; + Tokenizer.prototype.readQuoted = function () { + this.skipBlank(); + var begin = this.p; + if (!(this.peekType() & QUOTE)) + return; + ++this.p; + var escaped = false; + while (this.p < this.N) { + ++this.p; + if (this.input[this.p - 1] === this.input[begin] && !escaped) + break; + if (escaped) + escaped = false; + else if (this.input[this.p - 1] === '\\') + escaped = true; + } + return new QuotedToken(this.input, begin, this.p, this.file); + }; + Tokenizer.prototype.readFileNameTemplate = function (options) { + var outputDelimiterLeft, htmlStopStrings, htmlStopStringSet; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + outputDelimiterLeft = options.outputDelimiterLeft; + htmlStopStrings = [',', ' ', '\r', '\n', '\t', outputDelimiterLeft]; + htmlStopStringSet = new Set(htmlStopStrings); + _a.label = 1; + case 1: + if (!(this.p < this.N && !htmlStopStringSet.has(this.peek()))) return [3 /*break*/, 3]; + return [4 /*yield*/, this.match(outputDelimiterLeft) + ? this.readOutputToken(options) + : this.readHTMLToken(htmlStopStrings)]; + case 2: + _a.sent(); + return [3 /*break*/, 1]; + case 3: return [2 /*return*/]; + } + }); + }; + Tokenizer.prototype.match = function (word) { + for (var i = 0; i < word.length; i++) { + if (word[i] !== this.input[this.p + i]) + return false; + } + return true; + }; + Tokenizer.prototype.rmatch = function (pattern) { + for (var i = 0; i < pattern.length; i++) { + if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) + return false; + } + return true; + }; + Tokenizer.prototype.peekType = function (n) { + if (n === void 0) { n = 0; } + return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]; + }; + Tokenizer.prototype.peek = function (n) { + if (n === void 0) { n = 0; } + return this.p + n >= this.N ? '' : this.input[this.p + n]; + }; + Tokenizer.prototype.skipBlank = function () { + while (this.peekType() & BLANK) + ++this.p; + }; + return Tokenizer; + }()); + + var ParseStream = /** @class */ (function () { + function ParseStream(tokens, parseToken) { + this.handlers = {}; + this.stopRequested = false; + this.tokens = tokens; + this.parseToken = parseToken; + } + ParseStream.prototype.on = function (name, cb) { + this.handlers[name] = cb; + return this; + }; + ParseStream.prototype.trigger = function (event, arg) { + var h = this.handlers[event]; + return h ? (h.call(this, arg), true) : false; + }; + ParseStream.prototype.start = function () { + this.trigger('start'); + var token; + while (!this.stopRequested && (token = this.tokens.shift())) { + if (this.trigger('token', token)) + continue; + if (isTagToken(token) && this.trigger("tag:".concat(token.name), token)) { + continue; + } + var template = this.parseToken(token, this.tokens); + this.trigger('template', template); + } + if (!this.stopRequested) + this.trigger('end'); + return this; + }; + ParseStream.prototype.stop = function () { + this.stopRequested = true; + return this; + }; + return ParseStream; + }()); + + var TemplateImpl = /** @class */ (function () { + function TemplateImpl(token) { + this.token = token; + } + return TemplateImpl; + }()); + + var Tag = /** @class */ (function (_super) { + __extends(Tag, _super); + function Tag(token, remainTokens, liquid) { + var _this = _super.call(this, token) || this; + _this.name = token.name; + _this.liquid = liquid; + _this.tokenizer = token.tokenizer; + return _this; + } + return Tag; + }(TemplateImpl)); + + /** + * Key-Value Pairs Representing Tag Arguments + * Example: + * For the markup `, foo:'bar', coo:2 reversed %}`, + * hash['foo'] === 'bar' + * hash['coo'] === 2 + * hash['reversed'] === undefined + */ + var Hash = /** @class */ (function () { + function Hash(input, jekyllStyle) { + var e_1, _a; + this.hash = {}; + var tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {}); + try { + for (var _b = __values(tokenizer.readHashes(jekyllStyle)), _c = _b.next(); !_c.done; _c = _b.next()) { + var hash = _c.value; + this.hash[hash.name.content] = hash.value; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } + } + Hash.prototype.render = function (ctx) { + var hash, _a, _b, key, _c, _d, _e, e_2_1; + var e_2, _f; + return __generator(this, function (_g) { + switch (_g.label) { + case 0: + hash = {}; + _g.label = 1; + case 1: + _g.trys.push([1, 8, 9, 10]); + _a = __values(Object.keys(this.hash)), _b = _a.next(); + _g.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 7]; + key = _b.value; + _c = hash; + _d = key; + if (!(this.hash[key] === undefined)) return [3 /*break*/, 3]; + _e = true; + return [3 /*break*/, 5]; + case 3: return [4 /*yield*/, evalToken(this.hash[key], ctx)]; + case 4: + _e = _g.sent(); + _g.label = 5; + case 5: + _c[_d] = _e; + _g.label = 6; + case 6: + _b = _a.next(); + return [3 /*break*/, 2]; + case 7: return [3 /*break*/, 10]; + case 8: + e_2_1 = _g.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 10]; + case 9: + try { + if (_b && !_b.done && (_f = _a.return)) _f.call(_a); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 10: return [2 /*return*/, hash]; + } + }); + }; + return Hash; + }()); + + function createTagClass(options) { + return /** @class */ (function (_super) { + __extends(class_1, _super); + function class_1(token, tokens, liquid) { + var _this = _super.call(this, token, tokens, liquid) || this; + if (isFunction(options.parse)) { + options.parse.call(_this, token, tokens); + } + return _this; + } + class_1.prototype.render = function (ctx, emitter) { + var hash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)]; + case 1: + hash = (_a.sent()); + return [4 /*yield*/, options.render.call(this, ctx, emitter, hash)]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }; + return class_1; + }(Tag)); + } + + function isKeyValuePair(arr) { + return isArray(arr); + } + + var Filter = /** @class */ (function () { + function Filter(token, options, liquid) { + this.token = token; + this.name = token.name; + this.handler = isFunction(options) + ? options + : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify); + this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw); + this.args = token.args; + this.liquid = liquid; + } + Filter.prototype.render = function (value, context) { + var argv, _a, _b, arg, _c, _d, _e, _f, _g, e_1_1; + var e_1, _h; + return __generator(this, function (_j) { + switch (_j.label) { + case 0: + argv = []; + _j.label = 1; + case 1: + _j.trys.push([1, 8, 9, 10]); + _a = __values(this.args), _b = _a.next(); + _j.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 7]; + arg = _b.value; + if (!isKeyValuePair(arg)) return [3 /*break*/, 4]; + _d = (_c = argv).push; + _e = [arg[0]]; + return [4 /*yield*/, evalToken(arg[1], context)]; + case 3: + _d.apply(_c, [_e.concat([_j.sent()])]); + return [3 /*break*/, 6]; + case 4: + _g = (_f = argv).push; + return [4 /*yield*/, evalToken(arg, context)]; + case 5: + _g.apply(_f, [_j.sent()]); + _j.label = 6; + case 6: + _b = _a.next(); + return [3 /*break*/, 2]; + case 7: return [3 /*break*/, 10]; + case 8: + e_1_1 = _j.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 10]; + case 9: + try { + if (_b && !_b.done && (_h = _a.return)) _h.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 10: return [4 /*yield*/, this.handler.apply({ context: context, token: this.token, liquid: this.liquid }, __spreadArray([value], __read(argv), false))]; + case 11: return [2 /*return*/, _j.sent()]; + } + }); + }; + return Filter; + }()); + + var Value = /** @class */ (function () { + /** + * @param str the value to be valuated, eg.: "foobar" | truncate: 3 + */ + function Value(input, liquid) { + var _this = this; + this.filters = []; + var token = typeof input === 'string' + ? new Tokenizer(input, liquid.options.operators).readFilteredValue() + : input; + this.initial = token.initial; + this.filters = token.filters.map(function (token) { return new Filter(token, _this.getFilter(liquid, token.name), liquid); }); + } + Value.prototype.value = function (ctx, lenient) { + var val, _a, _b, filter, e_1_1; + var e_1, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default'); + return [4 /*yield*/, this.initial.evaluate(ctx, lenient)]; + case 1: + val = _d.sent(); + _d.label = 2; + case 2: + _d.trys.push([2, 7, 8, 9]); + _a = __values(this.filters), _b = _a.next(); + _d.label = 3; + case 3: + if (!!_b.done) return [3 /*break*/, 6]; + filter = _b.value; + return [4 /*yield*/, filter.render(val, ctx)]; + case 4: + val = _d.sent(); + _d.label = 5; + case 5: + _b = _a.next(); + return [3 /*break*/, 3]; + case 6: return [3 /*break*/, 9]; + case 7: + e_1_1 = _d.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (_b && !_b.done && (_c = _a.return)) _c.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 9: return [2 /*return*/, val]; + } + }); + }; + Value.prototype.getFilter = function (liquid, name) { + var impl = liquid.filters[name]; + assert(impl || !liquid.options.strictFilters, function () { return "undefined filter: ".concat(name); }); + return impl; + }; + return Value; + }()); + + var Output = /** @class */ (function (_super) { + __extends(Output, _super); + function Output(token, liquid) { + var _this = this; + var _a; + _this = _super.call(this, token) || this; + var tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange); + _this.value = new Value(tokenizer.readFilteredValue(), liquid); + var filters = _this.value.filters; + var outputEscape = liquid.options.outputEscape; + if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) { + var token_1 = new FilterToken(toString.call(outputEscape), [], '', 0, 0); + filters.push(new Filter(token_1, outputEscape, liquid)); + } + return _this; + } + Output.prototype.render = function (ctx, emitter) { + var val; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.value.value(ctx, false)]; + case 1: + val = _a.sent(); + emitter.write(val); + return [2 /*return*/]; + } + }); + }; + Output.prototype.arguments = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.value]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + return Output; + }(TemplateImpl)); + + var HTML = /** @class */ (function (_super) { + __extends(HTML, _super); + function HTML(token) { + var _this = _super.call(this, token) || this; + _this.str = token.getContent(); + return _this; + } + HTML.prototype.render = function (ctx, emitter) { + return __generator(this, function (_a) { + emitter.write(this.str); + return [2 /*return*/]; + }); + }; + return HTML; + }(TemplateImpl)); + + /** + * A variable's segments and location, which can be coerced to a string. + */ + var Variable = /** @class */ (function () { + function Variable(segments, location) { + this.segments = segments; + this.location = location; + } + Variable.prototype.toString = function () { + return segmentsString(this.segments, true); + }; + /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */ + Variable.prototype.toArray = function () { + function _visit() { + var _i, segments_1, segments_1_1, segment, e_1_1; + var e_1, _a; + var segments = []; + for (_i = 0; _i < arguments.length; _i++) { + segments[_i] = arguments[_i]; + } + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 7, 8, 9]); + segments_1 = __values(segments), segments_1_1 = segments_1.next(); + _b.label = 1; + case 1: + if (!!segments_1_1.done) return [3 /*break*/, 6]; + segment = segments_1_1.value; + if (!(segment instanceof Variable)) return [3 /*break*/, 3]; + return [4 /*yield*/, Array.from(_visit.apply(void 0, __spreadArray([], __read(segment.segments), false)))]; + case 2: + _b.sent(); + return [3 /*break*/, 5]; + case 3: return [4 /*yield*/, segment]; + case 4: + _b.sent(); + _b.label = 5; + case 5: + segments_1_1 = segments_1.next(); + return [3 /*break*/, 1]; + case 6: return [3 /*break*/, 9]; + case 7: + e_1_1 = _b.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (segments_1_1 && !segments_1_1.done && (_a = segments_1.return)) _a.call(segments_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 9: return [2 /*return*/]; + } + }); + } + return Array.from(_visit.apply(void 0, __spreadArray([], __read(this.segments), false))); + }; + return Variable; + }()); + /** + * Group variables by the string representation of their root segment. + */ + var VariableMap = /** @class */ (function () { + function VariableMap() { + this.map = new Map(); + } + VariableMap.prototype.get = function (key) { + var k = segmentsString([key.segments[0]]); + if (!this.map.has(k)) { + this.map.set(k, []); + } + return this.map.get(k); + }; + VariableMap.prototype.has = function (key) { + return this.map.has(segmentsString([key.segments[0]])); + }; + VariableMap.prototype.push = function (variable) { + this.get(variable).push(variable); + }; + VariableMap.prototype.asObject = function () { + return Object.fromEntries(this.map); + }; + return VariableMap; + }()); + var defaultStaticAnalysisOptions = { + partials: true + }; + function _analyze(templates, partials, sync) { + function updateVariables(variable, scope) { + var e_3, _a; + variables.push(variable); + var aliased = scope.alias(variable); + if (aliased !== undefined) { + var root = aliased.segments[0]; + // TODO: What if a a template renders a rendered template? Do we need scope.parent? + if (isString(root) && !rootScope.has(root)) { + globals.push(aliased); + } + } + else { + var root = variable.segments[0]; + if (isString(root) && !scope.has(root)) { + globals.push(variable); + } + } + try { + // Recurse for nested Variables + for (var _b = __values(variable.segments), _c = _b.next(); !_c.done; _c = _b.next()) { + var segment = _c.value; + if (segment instanceof Variable) { + updateVariables(segment, scope); + } + } + } + catch (e_3_1) { e_3 = { error: e_3_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_3) throw e_3.error; } + } + } + function visit(template, scope) { + var _a, _b, arg, _c, _d, variable, _e, _f, ident, _g, row, col, partial, _h, _j, child, e_4_1, partialScopeNames, partialScope, _k, _l, name_1, _m, alias, argument, variables_1, _o, _p, child, e_5_1, _q, _r, child, e_6_1; + var e_7, _s, e_8, _t, e_9, _u, e_4, _v, e_10, _w, e_5, _x, e_6, _y; + return __generator(this, function (_z) { + switch (_z.label) { + case 0: + if (template.arguments) { + try { + for (_a = __values(template.arguments()), _b = _a.next(); !_b.done; _b = _a.next()) { + arg = _b.value; + try { + for (_c = (e_8 = void 0, __values(extractVariables(arg))), _d = _c.next(); !_d.done; _d = _c.next()) { + variable = _d.value; + updateVariables(variable, scope); + } + } + catch (e_8_1) { e_8 = { error: e_8_1 }; } + finally { + try { + if (_d && !_d.done && (_t = _c.return)) _t.call(_c); + } + finally { if (e_8) throw e_8.error; } + } + } + } + catch (e_7_1) { e_7 = { error: e_7_1 }; } + finally { + try { + if (_b && !_b.done && (_s = _a.return)) _s.call(_a); + } + finally { if (e_7) throw e_7.error; } + } + } + if (template.localScope) { + try { + for (_e = __values(template.localScope()), _f = _e.next(); !_f.done; _f = _e.next()) { + ident = _f.value; + scope.add(ident.content); + scope.deleteAlias(ident.content); + _g = __read(ident.getPosition(), 2), row = _g[0], col = _g[1]; + locals.push(new Variable([ident.content], { row: row, col: col, file: ident.file })); + } + } + catch (e_9_1) { e_9 = { error: e_9_1 }; } + finally { + try { + if (_f && !_f.done && (_u = _e.return)) _u.call(_e); + } + finally { if (e_9) throw e_9.error; } + } + } + if (!template.children) return [3 /*break*/, 30]; + if (!template.partialScope) return [3 /*break*/, 20]; + partial = template.partialScope(); + if (!(partial === undefined)) return [3 /*break*/, 10]; + _z.label = 1; + case 1: + _z.trys.push([1, 7, 8, 9]); + return [4 /*yield*/, template.children(partials, sync)]; + case 2: + _h = __values.apply(void 0, [(_z.sent())]), _j = _h.next(); + _z.label = 3; + case 3: + if (!!_j.done) return [3 /*break*/, 6]; + child = _j.value; + return [4 /*yield*/, visit(child, scope)]; + case 4: + _z.sent(); + _z.label = 5; + case 5: + _j = _h.next(); + return [3 /*break*/, 3]; + case 6: return [3 /*break*/, 9]; + case 7: + e_4_1 = _z.sent(); + e_4 = { error: e_4_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (_j && !_j.done && (_v = _h.return)) _v.call(_h); + } + finally { if (e_4) throw e_4.error; } + return [7 /*endfinally*/]; + case 9: return [2 /*return*/]; + case 10: + if (seen.has(partial.name)) + return [2 /*return*/]; + partialScopeNames = new Set(); + partialScope = partial.isolated + ? new DummyScope(partialScopeNames) + : scope.push(partialScopeNames); + try { + for (_k = __values(partial.scope), _l = _k.next(); !_l.done; _l = _k.next()) { + name_1 = _l.value; + if (isString(name_1)) { + partialScopeNames.add(name_1); + } + else { + _m = __read(name_1, 2), alias = _m[0], argument = _m[1]; + partialScopeNames.add(alias); + variables_1 = Array.from(extractVariables(argument)); + if (variables_1.length) { + partialScope.setAlias(alias, variables_1[0].segments); + } + } + } + } + catch (e_10_1) { e_10 = { error: e_10_1 }; } + finally { + try { + if (_l && !_l.done && (_w = _k.return)) _w.call(_k); + } + finally { if (e_10) throw e_10.error; } + } + _z.label = 11; + case 11: + _z.trys.push([11, 17, 18, 19]); + return [4 /*yield*/, template.children(partials, sync)]; + case 12: + _o = __values.apply(void 0, [(_z.sent())]), _p = _o.next(); + _z.label = 13; + case 13: + if (!!_p.done) return [3 /*break*/, 16]; + child = _p.value; + return [4 /*yield*/, visit(child, partialScope)]; + case 14: + _z.sent(); + seen.add(partial.name); + _z.label = 15; + case 15: + _p = _o.next(); + return [3 /*break*/, 13]; + case 16: return [3 /*break*/, 19]; + case 17: + e_5_1 = _z.sent(); + e_5 = { error: e_5_1 }; + return [3 /*break*/, 19]; + case 18: + try { + if (_p && !_p.done && (_x = _o.return)) _x.call(_o); + } + finally { if (e_5) throw e_5.error; } + return [7 /*endfinally*/]; + case 19: + partialScope.pop(); + return [3 /*break*/, 30]; + case 20: + if (template.blockScope) { + scope.push(new Set(template.blockScope())); + } + _z.label = 21; + case 21: + _z.trys.push([21, 27, 28, 29]); + return [4 /*yield*/, template.children(partials, sync)]; + case 22: + _q = __values.apply(void 0, [(_z.sent())]), _r = _q.next(); + _z.label = 23; + case 23: + if (!!_r.done) return [3 /*break*/, 26]; + child = _r.value; + return [4 /*yield*/, visit(child, scope)]; + case 24: + _z.sent(); + _z.label = 25; + case 25: + _r = _q.next(); + return [3 /*break*/, 23]; + case 26: return [3 /*break*/, 29]; + case 27: + e_6_1 = _z.sent(); + e_6 = { error: e_6_1 }; + return [3 /*break*/, 29]; + case 28: + try { + if (_r && !_r.done && (_y = _q.return)) _y.call(_q); + } + finally { if (e_6) throw e_6.error; } + return [7 /*endfinally*/]; + case 29: + if (template.blockScope) { + scope.pop(); + } + _z.label = 30; + case 30: return [2 /*return*/]; + } + }); + } + var variables, globals, locals, rootScope, seen, templates_1, templates_1_1, template, e_2_1; + var e_2, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + variables = new VariableMap(); + globals = new VariableMap(); + locals = new VariableMap(); + rootScope = new DummyScope(new Set()); + seen = new Set(); + _b.label = 1; + case 1: + _b.trys.push([1, 6, 7, 8]); + templates_1 = __values(templates), templates_1_1 = templates_1.next(); + _b.label = 2; + case 2: + if (!!templates_1_1.done) return [3 /*break*/, 5]; + template = templates_1_1.value; + return [4 /*yield*/, visit(template, rootScope)]; + case 3: + _b.sent(); + _b.label = 4; + case 4: + templates_1_1 = templates_1.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_2_1 = _b.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (templates_1_1 && !templates_1_1.done && (_a = templates_1.return)) _a.call(templates_1); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 8: return [2 /*return*/, { + variables: variables.asObject(), + globals: globals.asObject(), + locals: locals.asObject() + }]; + } + }); + } + /** + * Statically analyze a template and report variable usage. + */ + function analyze(template, options) { + if (options === void 0) { options = {}; } + var opts = __assign(__assign({}, defaultStaticAnalysisOptions), options); + return toPromise(_analyze(template, opts.partials, false)); + } + /** + * Statically analyze a template and report variable usage. + */ + function analyzeSync(template, options) { + if (options === void 0) { options = {}; } + var opts = __assign(__assign({}, defaultStaticAnalysisOptions), options); + return toValueSync(_analyze(template, opts.partials, true)); + } + /** + * A stack to manage scopes while traversing templates during static analysis. + */ + var DummyScope = /** @class */ (function () { + function DummyScope(globals) { + this.stack = [{ names: globals, aliases: new Map() }]; + } + /** Return true if `name` is in scope. */ + DummyScope.prototype.has = function (name) { + var e_11, _a; + try { + for (var _b = __values(this.stack), _c = _b.next(); !_c.done; _c = _b.next()) { + var scope = _c.value; + if (scope.names.has(name)) { + return true; + } + } + } + catch (e_11_1) { e_11 = { error: e_11_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_11) throw e_11.error; } + } + return false; + }; + DummyScope.prototype.push = function (scope) { + this.stack.push({ names: scope, aliases: new Map() }); + return this; + }; + DummyScope.prototype.pop = function () { + var _a; + return (_a = this.stack.pop()) === null || _a === void 0 ? void 0 : _a.names; + }; + // Add a name to the template scope. + DummyScope.prototype.add = function (name) { + this.stack[0].names.add(name); + }; + /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */ + DummyScope.prototype.alias = function (variable) { + var root = variable.segments[0]; + if (!isString(root)) + return undefined; + var alias = this.getAlias(root); + if (alias === undefined) + return undefined; + return new Variable(__spreadArray(__spreadArray([], __read(alias), false), __read(variable.segments.slice(1)), false), variable.location); + }; + // TODO: `from` could be a path with multiple segments, like `include.x`. + DummyScope.prototype.setAlias = function (from, to) { + this.stack[this.stack.length - 1].aliases.set(from, to); + }; + DummyScope.prototype.deleteAlias = function (name) { + this.stack[this.stack.length - 1].aliases.delete(name); + }; + DummyScope.prototype.getAlias = function (name) { + var e_12, _a; + try { + for (var _b = __values(this.stack), _c = _b.next(); !_c.done; _c = _b.next()) { + var scope = _c.value; + if (scope.aliases.has(name)) { + return scope.aliases.get(name); + } + // If a scope has defined `name`, then it masks aliases in parent scopes. + if (scope.names.has(name)) { + return undefined; + } + } + } + catch (e_12_1) { e_12 = { error: e_12_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_12) throw e_12.error; } + } + return undefined; + }; + return DummyScope; + }()); + function extractVariables(value) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!isValueToken(value)) return [3 /*break*/, 2]; + return [5 /*yield**/, __values(extractValueTokenVariables(value))]; + case 1: + _a.sent(); + return [3 /*break*/, 4]; + case 2: + if (!(value instanceof Value)) return [3 /*break*/, 4]; + return [5 /*yield**/, __values(extractFilteredValueVariables(value))]; + case 3: + _a.sent(); + _a.label = 4; + case 4: return [2 /*return*/]; + } + }); + } + function extractFilteredValueVariables(value) { + var _a, _b, token, e_13_1, _c, _d, filter, _e, _f, arg, e_14_1, e_15_1; + var e_13, _g, e_15, _h, e_14, _j; + return __generator(this, function (_k) { + switch (_k.label) { + case 0: + _k.trys.push([0, 5, 6, 7]); + _a = __values(value.initial.postfix), _b = _a.next(); + _k.label = 1; + case 1: + if (!!_b.done) return [3 /*break*/, 4]; + token = _b.value; + if (!isValueToken(token)) return [3 /*break*/, 3]; + return [5 /*yield**/, __values(extractValueTokenVariables(token))]; + case 2: + _k.sent(); + _k.label = 3; + case 3: + _b = _a.next(); + return [3 /*break*/, 1]; + case 4: return [3 /*break*/, 7]; + case 5: + e_13_1 = _k.sent(); + e_13 = { error: e_13_1 }; + return [3 /*break*/, 7]; + case 6: + try { + if (_b && !_b.done && (_g = _a.return)) _g.call(_a); + } + finally { if (e_13) throw e_13.error; } + return [7 /*endfinally*/]; + case 7: + _k.trys.push([7, 20, 21, 22]); + _c = __values(value.filters), _d = _c.next(); + _k.label = 8; + case 8: + if (!!_d.done) return [3 /*break*/, 19]; + filter = _d.value; + _k.label = 9; + case 9: + _k.trys.push([9, 16, 17, 18]); + _e = (e_14 = void 0, __values(filter.args)), _f = _e.next(); + _k.label = 10; + case 10: + if (!!_f.done) return [3 /*break*/, 15]; + arg = _f.value; + if (!(isKeyValuePair(arg) && arg[1])) return [3 /*break*/, 12]; + return [5 /*yield**/, __values(extractValueTokenVariables(arg[1]))]; + case 11: + _k.sent(); + return [3 /*break*/, 14]; + case 12: + if (!isValueToken(arg)) return [3 /*break*/, 14]; + return [5 /*yield**/, __values(extractValueTokenVariables(arg))]; + case 13: + _k.sent(); + _k.label = 14; + case 14: + _f = _e.next(); + return [3 /*break*/, 10]; + case 15: return [3 /*break*/, 18]; + case 16: + e_14_1 = _k.sent(); + e_14 = { error: e_14_1 }; + return [3 /*break*/, 18]; + case 17: + try { + if (_f && !_f.done && (_j = _e.return)) _j.call(_e); + } + finally { if (e_14) throw e_14.error; } + return [7 /*endfinally*/]; + case 18: + _d = _c.next(); + return [3 /*break*/, 8]; + case 19: return [3 /*break*/, 22]; + case 20: + e_15_1 = _k.sent(); + e_15 = { error: e_15_1 }; + return [3 /*break*/, 22]; + case 21: + try { + if (_d && !_d.done && (_h = _c.return)) _h.call(_c); + } + finally { if (e_15) throw e_15.error; } + return [7 /*endfinally*/]; + case 22: return [2 /*return*/]; + } + }); + } + function extractValueTokenVariables(token) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!isRangeToken(token)) return [3 /*break*/, 3]; + return [5 /*yield**/, __values(extractValueTokenVariables(token.lhs))]; + case 1: + _a.sent(); + return [5 /*yield**/, __values(extractValueTokenVariables(token.rhs))]; + case 2: + _a.sent(); + return [3 /*break*/, 5]; + case 3: + if (!isPropertyAccessToken(token)) return [3 /*break*/, 5]; + return [4 /*yield*/, extractPropertyAccessVariable(token)]; + case 4: + _a.sent(); + _a.label = 5; + case 5: return [2 /*return*/]; + } + }); + } + function extractPropertyAccessVariable(token) { + var e_16, _a; + var segments = []; + // token is not guaranteed to have `file` set. We'll try to get it from a prop if not. + var file = token.file; + // Here we're flattening the first segment of a path if it is a nested path. + var root = token.props[0]; + file = file || root.file; + if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) { + segments.push(root.content); + } + else if (isPropertyAccessToken(root)) { + // Flatten paths that start with a nested path. + segments.push.apply(segments, __spreadArray([], __read(extractPropertyAccessVariable(root).segments), false)); + } + try { + for (var _b = __values(token.props.slice(1)), _c = _b.next(); !_c.done; _c = _b.next()) { + var prop = _c.value; + file = file || prop.file; + if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) { + segments.push(prop.content); + } + else if (isPropertyAccessToken(prop)) { + segments.push(extractPropertyAccessVariable(prop)); + } + } + } + catch (e_16_1) { e_16 = { error: e_16_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_16) throw e_16.error; } + } + var _d = __read(token.getPosition(), 2), row = _d[0], col = _d[1]; + return new Variable(segments, { + row: row, + col: col, + file: file + }); + } + // This is used to detect segments that can be represented with dot notation + // when creating a string representation of VariableSegments. + var RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/; + /** + * Return a string representation of segments using dot notation where possible. + * @param segments - The property names and array indices that make up a path to a variable. + * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets. + */ + function segmentsString(segments, bracketedRoot) { + var e_17, _a; + if (bracketedRoot === void 0) { bracketedRoot = false; } + var buf = []; + var root = segments[0]; + if (isString(root)) { + if (!bracketedRoot || root.match(RE_PROPERTY)) { + buf.push("".concat(root)); + } + else { + buf.push("['".concat(root, "']")); + } + } + try { + for (var _b = __values(segments.slice(1)), _c = _b.next(); !_c.done; _c = _b.next()) { + var segment = _c.value; + if (segment instanceof Variable) { + buf.push("[".concat(segmentsString(segment.segments), "]")); + } + else if (isString(segment)) { + if (segment.match(RE_PROPERTY)) { + buf.push(".".concat(segment)); + } + else { + buf.push("['".concat(segment, "']")); + } + } + else { + buf.push("[".concat(segment, "]")); + } + } + } + catch (e_17_1) { e_17 = { error: e_17_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_17) throw e_17.error; } + } + return buf.join(''); + } + + (function (LookupType) { + LookupType["Partials"] = "partials"; + LookupType["Layouts"] = "layouts"; + LookupType["Root"] = "root"; + })(exports.LookupType || (exports.LookupType = {})); + var Loader = /** @class */ (function () { + function Loader(options) { + var _this = this; + var _a, _b, _c, _d; + this.options = options; + if (options.relativeReference) { + var sep = options.fs.sep; + assert(sep, '`fs.sep` is required for relative reference'); + var prefixes_1 = ['.' + sep, '..' + sep, './', '../']; + this.shouldLoadRelative = function (referencedFile) { return prefixes_1.some(function (prefix) { return referencedFile.startsWith(prefix); }); }; + } + else { + this.shouldLoadRelative = function (_referencedFile) { return false; }; + } + var fs = options.fs; + this.contains = toLiquidAsync(((_a = fs.contains) === null || _a === void 0 ? void 0 : _a.bind(fs)) || (function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { + return [2 /*return*/, true]; + }); }); }), ((_b = fs.containsSync) === null || _b === void 0 ? void 0 : _b.bind(fs)) || (function () { return true; })); + this.exists = toLiquidAsync(((_c = fs.exists) === null || _c === void 0 ? void 0 : _c.bind(fs)) || (function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { + return [2 /*return*/, false]; + }); }); }), (_d = fs.existsSync) === null || _d === void 0 ? void 0 : _d.bind(fs)); + } + Loader.prototype.lookup = function (file, type, sync, currentFile) { + var dirs, _a, _b, filepath, allowed, dirs_1, dirs_1_1, dir, e_1_1, e_2_1; + var e_2, _c, e_1, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + dirs = this.options[type]; + _e.label = 1; + case 1: + _e.trys.push([1, 14, 15, 16]); + _a = __values(this.candidates(file, dirs, currentFile)), _b = _a.next(); + _e.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 13]; + filepath = _b.value; + allowed = false; + _e.label = 3; + case 3: + _e.trys.push([3, 8, 9, 10]); + dirs_1 = (e_1 = void 0, __values(dirs)), dirs_1_1 = dirs_1.next(); + _e.label = 4; + case 4: + if (!!dirs_1_1.done) return [3 /*break*/, 7]; + dir = dirs_1_1.value; + return [4 /*yield*/, this.contains(!!sync, dir, filepath)]; + case 5: + if (_e.sent()) { + allowed = true; + return [3 /*break*/, 7]; + } + _e.label = 6; + case 6: + dirs_1_1 = dirs_1.next(); + return [3 /*break*/, 4]; + case 7: return [3 /*break*/, 10]; + case 8: + e_1_1 = _e.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 10]; + case 9: + try { + if (dirs_1_1 && !dirs_1_1.done && (_d = dirs_1.return)) _d.call(dirs_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 10: + if (!allowed) + return [3 /*break*/, 12]; + return [4 /*yield*/, this.exists(!!sync, filepath)]; + case 11: + if (_e.sent()) + return [2 /*return*/, filepath]; + _e.label = 12; + case 12: + _b = _a.next(); + return [3 /*break*/, 2]; + case 13: return [3 /*break*/, 16]; + case 14: + e_2_1 = _e.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 16]; + case 15: + try { + if (_b && !_b.done && (_c = _a.return)) _c.call(_a); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 16: throw this.lookupError(file, dirs); + } + }); + }; + Loader.prototype.candidates = function (file, dirs, currentFile) { + var _a, fs, extname, referenced, dirs_2, dirs_2_1, dir, referenced, e_3_1, filepath; + var e_3, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = this.options, fs = _a.fs, extname = _a.extname; + if (!(this.shouldLoadRelative(file) && currentFile)) return [3 /*break*/, 2]; + referenced = fs.resolve(this.dirname(currentFile), file, extname); + return [4 /*yield*/, referenced]; + case 1: + _c.sent(); + _c.label = 2; + case 2: + _c.trys.push([2, 7, 8, 9]); + dirs_2 = __values(dirs), dirs_2_1 = dirs_2.next(); + _c.label = 3; + case 3: + if (!!dirs_2_1.done) return [3 /*break*/, 6]; + dir = dirs_2_1.value; + referenced = fs.resolve(dir, file, extname); + return [4 /*yield*/, referenced]; + case 4: + _c.sent(); + _c.label = 5; + case 5: + dirs_2_1 = dirs_2.next(); + return [3 /*break*/, 3]; + case 6: return [3 /*break*/, 9]; + case 7: + e_3_1 = _c.sent(); + e_3 = { error: e_3_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (dirs_2_1 && !dirs_2_1.done && (_b = dirs_2.return)) _b.call(dirs_2); + } + finally { if (e_3) throw e_3.error; } + return [7 /*endfinally*/]; + case 9: + if (!(fs.fallback !== undefined)) return [3 /*break*/, 11]; + filepath = fs.fallback(file); + if (!(filepath !== undefined)) return [3 /*break*/, 11]; + return [4 /*yield*/, filepath]; + case 10: + _c.sent(); + _c.label = 11; + case 11: return [2 /*return*/]; + } + }); + }; + Loader.prototype.dirname = function (path) { + var fs = this.options.fs; + assert(fs.dirname, '`fs.dirname` is required for relative reference'); + return fs.dirname(path); + }; + Loader.prototype.lookupError = function (file, roots) { + var err = new Error('ENOENT'); + err.message = "ENOENT: Failed to lookup \"".concat(file, "\" in \"").concat(roots, "\""); + err.code = 'ENOENT'; + return err; + }; + return Loader; + }()); + + var Parser = /** @class */ (function () { + function Parser(liquid) { + var _this = this; + var _a, _b; + this.liquid = liquid; + this.cache = this.liquid.options.cache; + this.fs = this.liquid.options.fs; + this.parseFile = this.cache ? this._parseFileCached : this._parseFile; + this.loader = new Loader(this.liquid.options); + this.parseLimit = new Limiter('parse length', liquid.options.parseLimit); + this.readFile = toLiquidAsync(((_a = this.fs.readFile) === null || _a === void 0 ? void 0 : _a.bind(this.fs)) || (function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { + throw new Error('readFile not implemented'); + }); }); }), (_b = this.fs.readFileSync) === null || _b === void 0 ? void 0 : _b.bind(this.fs)); + } + Parser.prototype.parse = function (html, filepath) { + html = String(html); + this.parseLimit.use(html.length); + var tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath); + var tokens = tokenizer.readTopLevelTokens(this.liquid.options); + return this.parseTokens(tokens); + }; + Parser.prototype.parseTokens = function (tokens) { + var token; + var templates = []; + var errors = []; + while ((token = tokens.shift())) { + try { + templates.push(this.parseToken(token, tokens)); + } + catch (err) { + if (this.liquid.options.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) + throw new LiquidErrors(errors); + return templates; + }; + Parser.prototype.parseToken = function (token, remainTokens) { + try { + if (isTagToken(token)) { + var TagClass = this.liquid.tags[token.name]; + assert(TagClass, "tag \"".concat(token.name, "\" not found")); + return new TagClass(token, remainTokens, this.liquid, this); + } + if (isOutputToken(token)) { + return new Output(token, this.liquid); + } + return new HTML(token); + } + catch (e) { + if (LiquidError.is(e)) + throw e; + throw new ParseError(e, token); + } + }; + Parser.prototype.parseStream = function (tokens) { + var _this = this; + return new ParseStream(tokens, function (token, tokens) { return _this.parseToken(token, tokens); }); + }; + Parser.prototype._parseFileCached = function (file, sync, type, currentFile) { + var cache, key, tpls, task, taskOrTpl, _a, err_1; + if (type === void 0) { type = exports.LookupType.Root; } + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + cache = this.cache; + key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file; + return [4 /*yield*/, cache.read(key)]; + case 1: + tpls = _b.sent(); + if (tpls) + return [2 /*return*/, tpls]; + task = this._parseFile(file, sync, type, currentFile); + if (!sync) return [3 /*break*/, 3]; + return [4 /*yield*/, task]; + case 2: + _a = _b.sent(); + return [3 /*break*/, 4]; + case 3: + _a = toPromise(task); + _b.label = 4; + case 4: + taskOrTpl = _a; + cache.write(key, taskOrTpl); + _b.label = 5; + case 5: + _b.trys.push([5, 7, , 8]); + return [4 /*yield*/, taskOrTpl]; + case 6: return [2 /*return*/, _b.sent()]; + case 7: + err_1 = _b.sent(); + cache.remove(key); + throw err_1; + case 8: return [2 /*return*/]; + } + }); + }; + Parser.prototype._parseFile = function (file, sync, type, currentFile) { + var filepath, _a; + if (type === void 0) { type = exports.LookupType.Root; } + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, this.loader.lookup(file, type, sync, currentFile)]; + case 1: + filepath = _b.sent(); + _a = this.parse; + return [4 /*yield*/, this.readFile(!!sync, filepath)]; + case 2: return [2 /*return*/, _a.apply(this, [_b.sent(), filepath])]; + } + }); + }; + return Parser; + }()); + + (function (TokenKind) { + TokenKind[TokenKind["Number"] = 1] = "Number"; + TokenKind[TokenKind["Literal"] = 2] = "Literal"; + TokenKind[TokenKind["Tag"] = 4] = "Tag"; + TokenKind[TokenKind["Output"] = 8] = "Output"; + TokenKind[TokenKind["HTML"] = 16] = "HTML"; + TokenKind[TokenKind["Filter"] = 32] = "Filter"; + TokenKind[TokenKind["Hash"] = 64] = "Hash"; + TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess"; + TokenKind[TokenKind["Word"] = 256] = "Word"; + TokenKind[TokenKind["Range"] = 512] = "Range"; + TokenKind[TokenKind["Quoted"] = 1024] = "Quoted"; + TokenKind[TokenKind["Operator"] = 2048] = "Operator"; + TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue"; + TokenKind[TokenKind["Delimited"] = 12] = "Delimited"; + })(exports.TokenKind || (exports.TokenKind = {})); + + function isDelimitedToken(val) { + return !!(getKind(val) & exports.TokenKind.Delimited); + } + function isOperatorToken(val) { + return getKind(val) === exports.TokenKind.Operator; + } + function isHTMLToken(val) { + return getKind(val) === exports.TokenKind.HTML; + } + function isOutputToken(val) { + return getKind(val) === exports.TokenKind.Output; + } + function isTagToken(val) { + return getKind(val) === exports.TokenKind.Tag; + } + function isQuotedToken(val) { + return getKind(val) === exports.TokenKind.Quoted; + } + function isLiteralToken(val) { + return getKind(val) === exports.TokenKind.Literal; + } + function isNumberToken(val) { + return getKind(val) === exports.TokenKind.Number; + } + function isPropertyAccessToken(val) { + return getKind(val) === exports.TokenKind.PropertyAccess; + } + function isWordToken(val) { + return getKind(val) === exports.TokenKind.Word; + } + function isRangeToken(val) { + return getKind(val) === exports.TokenKind.Range; + } + function isValueToken(val) { + // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range + return (getKind(val) & 1667) > 0; + } + function getKind(val) { + return val ? val.kind : -1; + } + + var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken + }); + + function createScope(from) { + var scope = Object.create(null); + if (from) + Object.assign(scope, from); + return scope; + } + + var Context = /** @class */ (function () { + function Context(env, opts, renderOptions, _a) { + if (env === void 0) { env = {}; } + if (opts === void 0) { opts = defaultOptions; } + if (renderOptions === void 0) { renderOptions = {}; } + var _b = _a === void 0 ? {} : _a, memoryLimit = _b.memoryLimit, renderLimit = _b.renderLimit; + var _c, _d, _e, _f, _g; + /** + * insert a Context-level empty scope, + * for tags like `{% capture %}` `{% assign %}` to operate + */ + this.scopes = [createScope()]; + this.registers = {}; + this.breakCalled = false; + this.continueCalled = false; + this.sync = !!renderOptions.sync; + this.opts = opts; + this.globals = (_c = renderOptions.globals) !== null && _c !== void 0 ? _c : opts.globals; + this.environments = isObject(env) ? env : Object(env); + this.strictVariables = (_d = renderOptions.strictVariables) !== null && _d !== void 0 ? _d : this.opts.strictVariables; + this.ownPropertyOnly = (_e = renderOptions.ownPropertyOnly) !== null && _e !== void 0 ? _e : opts.ownPropertyOnly; + this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_f = renderOptions.memoryLimit) !== null && _f !== void 0 ? _f : opts.memoryLimit); + this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_g = renderOptions.renderLimit) !== null && _g !== void 0 ? _g : opts.renderLimit)); + } + Context.prototype.getRegister = function (key, defaultValue) { + if (defaultValue === void 0) { defaultValue = undefined; } + return (this.registers[key] = this.registers[key] || defaultValue); + }; + Context.prototype.setRegister = function (key, value) { + return (this.registers[key] = value); + }; + Context.prototype.saveRegister = function () { + var _this = this; + var keys = []; + for (var _i = 0; _i < arguments.length; _i++) { + keys[_i] = arguments[_i]; + } + return keys.map(function (key) { return [key, _this.getRegister(key)]; }); + }; + Context.prototype.restoreRegister = function (keyValues) { + var _this = this; + return keyValues.forEach(function (_a) { + var _b = __read(_a, 2), key = _b[0], value = _b[1]; + return _this.setRegister(key, value); + }); + }; + Context.prototype.getAll = function () { + return __spreadArray([this.globals, this.environments], __read(this.scopes), false).reduce(function (ctx, val) { return __assign(ctx, val); }, {}); + }; + /** + * @deprecated use `_get()` or `getSync()` instead + */ + Context.prototype.get = function (paths) { + return this.getSync(paths); + }; + Context.prototype.getSync = function (paths) { + return toValueSync(this._get(paths)); + }; + Context.prototype._get = function (paths) { + var scope; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + scope = this.findScope(paths[0]) // first prop should always be a string + ; + return [4 /*yield*/, this._getFromScope(scope, paths)]; + case 1: // first prop should always be a string + return [2 /*return*/, _a.sent()]; + } + }); + }; + /** + * @deprecated use `_get()` instead + */ + Context.prototype.getFromScope = function (scope, paths) { + return toValueSync(this._getFromScope(scope, paths)); + }; + Context.prototype._getFromScope = function (scope, paths, strictVariables) { + var i; + if (strictVariables === void 0) { strictVariables = this.strictVariables; } + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (isString(paths)) + paths = paths.split('.'); + i = 0; + _a.label = 1; + case 1: + if (!(i < paths.length)) return [3 /*break*/, 4]; + return [4 /*yield*/, this.readProperty(scope, paths[i])]; + case 2: + scope = _a.sent(); + if (strictVariables && isUndefined(scope)) { + throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.')); + } + _a.label = 3; + case 3: + i++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/, scope]; + } + }); + }; + Context.prototype.push = function (ctx) { + return this.scopes.push(ctx); + }; + Context.prototype.pop = function () { + return this.scopes.pop(); + }; + Context.prototype.bottom = function () { + return this.scopes[0]; + }; + Context.prototype.spawn = function (scope) { + if (scope === void 0) { scope = {}; } + return new Context(scope, this.opts, { + sync: this.sync, + globals: this.globals, + strictVariables: this.strictVariables, + ownPropertyOnly: this.ownPropertyOnly + }, { + renderLimit: this.renderLimit, + memoryLimit: this.memoryLimit + }); + }; + Context.prototype.findScope = function (key) { + for (var i = this.scopes.length - 1; i >= 0; i--) { + var candidate = this.scopes[i]; + if (key in candidate) + return candidate; + } + if (key in this.environments) + return this.environments; + return this.globals; + }; + Context.prototype.readProperty = function (obj, key) { + obj = toLiquid(obj); + key = toValue(key); + if (isNil(obj)) + return obj; + if (isArray(obj) && key < 0) + return obj[obj.length + +key]; + var value = readJSProperty(obj, key, this.ownPropertyOnly); + if (value === undefined && obj instanceof Drop) + return obj.liquidMethodMissing(key, this); + if (isFunction(value)) + return value.call(obj); + if (key === 'size') + return readSize(obj); + else if (key === 'first') + return readFirst(obj); + else if (key === 'last') + return readLast(obj); + return value; + }; + return Context; + }()); + function readJSProperty(obj, key, ownPropertyOnly) { + if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) + return undefined; + return obj[key]; + } + function readFirst(obj) { + if (isArray(obj)) + return obj[0]; + return obj['first']; + } + function readLast(obj) { + if (isArray(obj)) + return obj[obj.length - 1]; + return obj['last']; + } + function readSize(obj) { + if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) + return obj['size']; + if (isArray(obj) || isString(obj)) + return obj.length; + if (typeof obj === 'object') + return Object.keys(obj).length; + } + + var BlockMode; + (function (BlockMode) { + /* store rendered html into blocks */ + BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT"; + /* output rendered html directly */ + BlockMode[BlockMode["STORE"] = 1] = "STORE"; + })(BlockMode || (BlockMode = {})); + + var abs = argumentsToNumber(Math.abs); + var at_least = argumentsToNumber(Math.max); + var at_most = argumentsToNumber(Math.min); + var ceil = argumentsToNumber(Math.ceil); + var divided_by = argumentsToNumber(function (dividend, divisor, integerArithmetic) { + if (integerArithmetic === void 0) { integerArithmetic = false; } + return integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor; + }); + var floor = argumentsToNumber(Math.floor); + var minus = argumentsToNumber(function (v, arg) { return v - arg; }); + var plus = argumentsToNumber(function (lhs, rhs) { return lhs + rhs; }); + var modulo = argumentsToNumber(function (v, arg) { return v % arg; }); + var times = argumentsToNumber(function (v, arg) { return v * arg; }); + function round(v, arg) { + if (arg === void 0) { arg = 0; } + v = toNumber(v); + arg = toNumber(arg); + var amp = Math.pow(10, arg); + var scaled = v * amp; + // Round half away from zero + return Math.sign(v) * Math.round(Math.abs(scaled)) / amp; + } + + var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round + }); + + var url_decode = function (x) { return decodeURIComponent(stringify(x)).replace(/\+/g, ' '); }; + var url_encode = function (x) { return encodeURIComponent(stringify(x)).replace(/%20/g, '+'); }; + var cgi_escape = function (x) { return encodeURIComponent(stringify(x)) + .replace(/%20/g, '+') + .replace(/[!'()*]/g, function (c) { return '%' + c.charCodeAt(0).toString(16).toUpperCase(); }); }; + var uri_escape = function (x) { return encodeURI(stringify(x)) + .replace(/%5B/g, '[') + .replace(/%5D/g, ']'); }; + var rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug; + var rSlugifyReplacers = { + 'raw': /\s+/g, + 'default': rSlugifyDefault, + 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug, + 'ascii': /[^A-Za-z0-9]+/g, + 'latin': rSlugifyDefault, + 'none': null + }; + function slugify(str, mode, cased) { + if (mode === void 0) { mode = 'default'; } + if (cased === void 0) { cased = false; } + str = stringify(str); + var replacer = rSlugifyReplacers[mode]; + if (replacer) { + if (mode === 'latin') + str = removeAccents(str); + str = str.replace(replacer, '-').replace(/^-|-$/g, ''); + } + return cased ? str : str.toLowerCase(); + } + function removeAccents(str) { + return str.replace(/[àáâãäå]/g, 'a') + .replace(/[æ]/g, 'ae') + .replace(/[ç]/g, 'c') + .replace(/[èéêë]/g, 'e') + .replace(/[ìíîï]/g, 'i') + .replace(/[ð]/g, 'd') + .replace(/[ñ]/g, 'n') + .replace(/[òóôõöø]/g, 'o') + .replace(/[ùúûü]/g, 'u') + .replace(/[ýÿ]/g, 'y') + .replace(/[ß]/g, 'ss') + .replace(/[œ]/g, 'oe') + .replace(/[þ]/g, 'th') + .replace(/[ẞ]/g, 'SS') + .replace(/[Œ]/g, 'OE') + .replace(/[Þ]/g, 'TH'); + } + + var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify + }); + + var join = argumentsToValue(function (v, arg) { + var array = toArray(v); + var sep = isNil(arg) ? ' ' : stringify(arg); + var complexity = array.length * (1 + sep.length); + this.context.memoryLimit.use(complexity); + return array.join(sep); + }); + var last$1 = argumentsToValue(function (v) { return isArrayLike(v) ? last(v) : ''; }); + var first = argumentsToValue(function (v) { return isArrayLike(v) ? v[0] : ''; }); + var reverse = argumentsToValue(function (v) { + var array = toArray(v); + this.context.memoryLimit.use(array.length); + return __spreadArray([], __read(array), false).reverse(); + }); + function sortBy(arr, property, comparator) { + var values, array, array_1, array_1_1, item, _a, _b, _c, _d, e_1_1; + var e_1, _e; + return __generator(this, function (_f) { + switch (_f.label) { + case 0: + values = []; + array = toArray(arr); + this.context.memoryLimit.use(array.length); + _f.label = 1; + case 1: + _f.trys.push([1, 8, 9, 10]); + array_1 = __values(array), array_1_1 = array_1.next(); + _f.label = 2; + case 2: + if (!!array_1_1.done) return [3 /*break*/, 7]; + item = array_1_1.value; + _b = (_a = values).push; + _c = [item]; + if (!property) return [3 /*break*/, 4]; + return [4 /*yield*/, this.context._getFromScope(item, stringify(property).split('.'), false)]; + case 3: + _d = _f.sent(); + return [3 /*break*/, 5]; + case 4: + _d = item; + _f.label = 5; + case 5: + _b.apply(_a, [_c.concat([ + _d + ])]); + _f.label = 6; + case 6: + array_1_1 = array_1.next(); + return [3 /*break*/, 2]; + case 7: return [3 /*break*/, 10]; + case 8: + e_1_1 = _f.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 10]; + case 9: + try { + if (array_1_1 && !array_1_1.done && (_e = array_1.return)) _e.call(array_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 10: return [2 /*return*/, values.sort(function (lhs, rhs) { return comparator(lhs[1], rhs[1]); }).map(function (tuple) { return tuple[0]; })]; + } + }); + } + function sort(arr, property) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(sortBy.call(this, arr, property, orderedCompare))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + function sort_natural(arr, property) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(sortBy.call(this, arr, property, caseInsensitiveCompare))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + var size = function (v) { return (v && v.length) || 0; }; + function map(arr, property) { + var results, array, array_2, array_2_1, item, _a, _b, e_2_1; + var e_2, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + results = []; + array = toArray(arr); + this.context.memoryLimit.use(array.length); + _d.label = 1; + case 1: + _d.trys.push([1, 6, 7, 8]); + array_2 = __values(array), array_2_1 = array_2.next(); + _d.label = 2; + case 2: + if (!!array_2_1.done) return [3 /*break*/, 5]; + item = array_2_1.value; + _b = (_a = results).push; + return [4 /*yield*/, this.context._getFromScope(item, stringify(property), false)]; + case 3: + _b.apply(_a, [_d.sent()]); + _d.label = 4; + case 4: + array_2_1 = array_2.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_2_1 = _d.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (array_2_1 && !array_2_1.done && (_c = array_2.return)) _c.call(array_2); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 8: return [2 /*return*/, results]; + } + }); + } + function sum(arr, property) { + var sum, array, array_3, array_3_1, item, data, _a, _b, e_3_1; + var e_3, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + sum = 0; + array = toArray(arr); + _d.label = 1; + case 1: + _d.trys.push([1, 8, 9, 10]); + array_3 = __values(array), array_3_1 = array_3.next(); + _d.label = 2; + case 2: + if (!!array_3_1.done) return [3 /*break*/, 7]; + item = array_3_1.value; + _a = Number; + if (!property) return [3 /*break*/, 4]; + return [4 /*yield*/, this.context._getFromScope(item, stringify(property), false)]; + case 3: + _b = _d.sent(); + return [3 /*break*/, 5]; + case 4: + _b = item; + _d.label = 5; + case 5: + data = _a.apply(void 0, [_b]); + sum += Number.isNaN(data) ? 0 : data; + _d.label = 6; + case 6: + array_3_1 = array_3.next(); + return [3 /*break*/, 2]; + case 7: return [3 /*break*/, 10]; + case 8: + e_3_1 = _d.sent(); + e_3 = { error: e_3_1 }; + return [3 /*break*/, 10]; + case 9: + try { + if (array_3_1 && !array_3_1.done && (_c = array_3.return)) _c.call(array_3); + } + finally { if (e_3) throw e_3.error; } + return [7 /*endfinally*/]; + case 10: return [2 /*return*/, sum]; + } + }); + } + function compact(arr) { + var array = toArray(arr); + this.context.memoryLimit.use(array.length); + return array.filter(function (x) { return !isNil(toValue(x)); }); + } + function concat(v, arg) { + if (arg === void 0) { arg = []; } + var lhs = toArray(v); + var rhs = toArray(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs.concat(rhs); + } + function push(v, arg) { + return concat.call(this, v, [arg]); + } + function unshift(v, arg) { + var array = toArray(v); + this.context.memoryLimit.use(array.length); + var clone = __spreadArray([], __read(array), false); + clone.unshift(arg); + return clone; + } + function pop(v) { + var clone = __spreadArray([], __read(toArray(v)), false); + clone.pop(); + return clone; + } + function shift(v) { + var array = toArray(v); + this.context.memoryLimit.use(array.length); + var clone = __spreadArray([], __read(array), false); + clone.shift(); + return clone; + } + function slice(v, begin, length) { + if (length === void 0) { length = 1; } + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + begin = begin < 0 ? v.length + begin : begin; + this.context.memoryLimit.use(length); + return v.slice(begin, begin + length); + } + function expectedMatcher(expected) { + var _this = this; + if (this.context.opts.jekyllWhere) { + return function (v) { return EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected)); }; + } + else if (expected === undefined) { + return function (v) { return isTruthy(v, _this.context); }; + } + else { + return function (v) { return equals(v, expected); }; + } + } + function filter(include, arr, property, expected) { + var values, token, arr_1, arr_1_1, item, _a, _b, e_4_1, matcher; + var e_4, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + values = []; + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + token = new Tokenizer(stringify(property)).readScopeValue(); + _d.label = 1; + case 1: + _d.trys.push([1, 6, 7, 8]); + arr_1 = __values(arr), arr_1_1 = arr_1.next(); + _d.label = 2; + case 2: + if (!!arr_1_1.done) return [3 /*break*/, 5]; + item = arr_1_1.value; + _b = (_a = values).push; + return [4 /*yield*/, evalToken(token, this.context.spawn(item))]; + case 3: + _b.apply(_a, [_d.sent()]); + _d.label = 4; + case 4: + arr_1_1 = arr_1.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_4_1 = _d.sent(); + e_4 = { error: e_4_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (arr_1_1 && !arr_1_1.done && (_c = arr_1.return)) _c.call(arr_1); + } + finally { if (e_4) throw e_4.error; } + return [7 /*endfinally*/]; + case 8: + matcher = expectedMatcher.call(this, expected); + return [2 /*return*/, arr.filter(function (_, i) { return matcher(values[i]) === include; })]; + } + }); + } + function filter_exp(include, arr, itemName, exp) { + var filtered, keyTemplate, array, array_4, array_4_1, item, value, e_5_1; + var e_5, _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + filtered = []; + keyTemplate = new Value(stringify(exp), this.liquid); + array = toArray(arr); + this.context.memoryLimit.use(array.length); + _c.label = 1; + case 1: + _c.trys.push([1, 6, 7, 8]); + array_4 = __values(array), array_4_1 = array_4.next(); + _c.label = 2; + case 2: + if (!!array_4_1.done) return [3 /*break*/, 5]; + item = array_4_1.value; + this.context.push((_b = {}, _b[itemName] = item, _b)); + return [4 /*yield*/, keyTemplate.value(this.context)]; + case 3: + value = _c.sent(); + this.context.pop(); + if (value === include) + filtered.push(item); + _c.label = 4; + case 4: + array_4_1 = array_4.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_5_1 = _c.sent(); + e_5 = { error: e_5_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (array_4_1 && !array_4_1.done && (_a = array_4.return)) _a.call(array_4); + } + finally { if (e_5) throw e_5.error; } + return [7 /*endfinally*/]; + case 8: return [2 /*return*/, filtered]; + } + }); + } + function where(arr, property, expected) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(filter.call(this, true, arr, property, expected))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + function reject(arr, property, expected) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(filter.call(this, false, arr, property, expected))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + function where_exp(arr, itemName, exp) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(filter_exp.call(this, true, arr, itemName, exp))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + function reject_exp(arr, itemName, exp) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(filter_exp.call(this, false, arr, itemName, exp))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + function group_by(arr, property) { + var map, token, arr_2, arr_2_1, item, key, e_6_1; + var e_6, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + map = new Map(); + arr = toEnumerable(arr); + token = new Tokenizer(stringify(property)).readScopeValue(); + this.context.memoryLimit.use(arr.length); + _b.label = 1; + case 1: + _b.trys.push([1, 6, 7, 8]); + arr_2 = __values(arr), arr_2_1 = arr_2.next(); + _b.label = 2; + case 2: + if (!!arr_2_1.done) return [3 /*break*/, 5]; + item = arr_2_1.value; + return [4 /*yield*/, evalToken(token, this.context.spawn(item))]; + case 3: + key = _b.sent(); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + _b.label = 4; + case 4: + arr_2_1 = arr_2.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_6_1 = _b.sent(); + e_6 = { error: e_6_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (arr_2_1 && !arr_2_1.done && (_a = arr_2.return)) _a.call(arr_2); + } + finally { if (e_6) throw e_6.error; } + return [7 /*endfinally*/]; + case 8: return [2 /*return*/, __spreadArray([], __read(map.entries()), false).map(function (_a) { + var _b = __read(_a, 2), name = _b[0], items = _b[1]; + return ({ name: name, items: items }); + })]; + } + }); + } + function group_by_exp(arr, itemName, exp) { + var map, keyTemplate, arr_3, arr_3_1, item, key, e_7_1; + var e_7, _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + map = new Map(); + keyTemplate = new Value(stringify(exp), this.liquid); + arr = toEnumerable(arr); + this.context.memoryLimit.use(arr.length); + _c.label = 1; + case 1: + _c.trys.push([1, 6, 7, 8]); + arr_3 = __values(arr), arr_3_1 = arr_3.next(); + _c.label = 2; + case 2: + if (!!arr_3_1.done) return [3 /*break*/, 5]; + item = arr_3_1.value; + this.context.push((_b = {}, _b[itemName] = item, _b)); + return [4 /*yield*/, keyTemplate.value(this.context)]; + case 3: + key = _c.sent(); + this.context.pop(); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + _c.label = 4; + case 4: + arr_3_1 = arr_3.next(); + return [3 /*break*/, 2]; + case 5: return [3 /*break*/, 8]; + case 6: + e_7_1 = _c.sent(); + e_7 = { error: e_7_1 }; + return [3 /*break*/, 8]; + case 7: + try { + if (arr_3_1 && !arr_3_1.done && (_a = arr_3.return)) _a.call(arr_3); + } + finally { if (e_7) throw e_7.error; } + return [7 /*endfinally*/]; + case 8: return [2 /*return*/, __spreadArray([], __read(map.entries()), false).map(function (_a) { + var _b = __read(_a, 2), name = _b[0], items = _b[1]; + return ({ name: name, items: items }); + })]; + } + }); + } + function search(arr, property, expected) { + var token, array, matcher, index, value; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + token = new Tokenizer(stringify(property)).readScopeValue(); + array = toArray(arr); + matcher = expectedMatcher.call(this, expected); + index = 0; + _a.label = 1; + case 1: + if (!(index < array.length)) return [3 /*break*/, 4]; + return [4 /*yield*/, evalToken(token, this.context.spawn(array[index]))]; + case 2: + value = _a.sent(); + if (matcher(value)) + return [2 /*return*/, [index, array[index]]]; + _a.label = 3; + case 3: + index++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; + } + }); + } + function search_exp(arr, itemName, exp) { + var predicate, array, index, value; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + predicate = new Value(stringify(exp), this.liquid); + array = toArray(arr); + index = 0; + _b.label = 1; + case 1: + if (!(index < array.length)) return [3 /*break*/, 4]; + this.context.push((_a = {}, _a[itemName] = array[index], _a)); + return [4 /*yield*/, predicate.value(this.context)]; + case 2: + value = _b.sent(); + this.context.pop(); + if (value) + return [2 /*return*/, [index, array[index]]]; + _b.label = 3; + case 3: + index++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; + } + }); + } + function has(arr, property, expected) { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(search.call(this, arr, property, expected))]; + case 1: + result = _a.sent(); + return [2 /*return*/, !!result]; + } + }); + } + function has_exp(arr, itemName, exp) { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(search_exp.call(this, arr, itemName, exp))]; + case 1: + result = _a.sent(); + return [2 /*return*/, !!result]; + } + }); + } + function find_index(arr, property, expected) { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(search.call(this, arr, property, expected))]; + case 1: + result = _a.sent(); + return [2 /*return*/, result ? result[0] : undefined]; + } + }); + } + function find_index_exp(arr, itemName, exp) { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(search_exp.call(this, arr, itemName, exp))]; + case 1: + result = _a.sent(); + return [2 /*return*/, result ? result[0] : undefined]; + } + }); + } + function find(arr, property, expected) { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(search.call(this, arr, property, expected))]; + case 1: + result = _a.sent(); + return [2 /*return*/, result ? result[1] : undefined]; + } + }); + } + function find_exp(arr, itemName, exp) { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(search_exp.call(this, arr, itemName, exp))]; + case 1: + result = _a.sent(); + return [2 /*return*/, result ? result[1] : undefined]; + } + }); + } + function uniq(arr) { + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + return __spreadArray([], __read(new Set(arr)), false); + } + function sample(v, count) { + if (count === void 0) { count = 1; } + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + this.context.memoryLimit.use(count); + var shuffled = __spreadArray([], __read(v), false).sort(function () { return Math.random() - 0.5; }); + if (count === 1) + return shuffled[0]; + return shuffled.slice(0, count); + } + + var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample + }); + + function date(v, format, timezoneOffset) { + var _a, _b; + var size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _b !== void 0 ? _b : 0); + this.context.memoryLimit.use(size); + var date = parseDate(v, this.context.opts, timezoneOffset); + if (!date) + return v; + format = toValue(format); + format = isNil(format) ? this.context.opts.dateFormat : stringify(format); + this.context.memoryLimit.use(format.length); + return strftime(date, format, this.context.memoryLimit); + } + function date_to_xmlschema(v) { + return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z'); + } + function date_to_rfc822(v) { + return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z'); + } + function date_to_string(v, type, style) { + return stringify_date.call(this, v, '%b', type, style); + } + function date_to_long_string(v, type, style) { + return stringify_date.call(this, v, '%B', type, style); + } + function stringify_date(v, month_type, type, style) { + var date = parseDate(v, this.context.opts); + if (!date) + return v; + var ml = this.context.memoryLimit; + if (type === 'ordinal') { + var d = date.getDate(); + return style === 'US' + ? strftime(date, "".concat(month_type, " ").concat(d, "%q, %Y"), ml) + : strftime(date, "".concat(d, "%q ").concat(month_type, " %Y"), ml); + } + return strftime(date, "%d ".concat(month_type, " %Y"), ml); + } + function parseDate(v, opts, timezoneOffset) { + var date; + var defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset; + var locale = opts.locale; + v = toValue(v); + if (isNil(v)) { + return undefined; + } + else if (v === 'now' || v === 'today') { + date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset); + } + else if (isNumber(v)) { + date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset); + } + else if (isString(v)) { + if (/^\d+$/.test(v)) { + date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset); + } + else if (opts.preserveTimezones && timezoneOffset === undefined) { + date = LiquidDate.createDateFixedToTimezone(v, locale); + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + return date.valid() ? date : undefined; + } + + var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string + }); + + /** + * String related filters + * + * * prefer stringify() to String() since `undefined`, `null` should eval '' + */ + var rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu; + // Word boundary followed by word characters (for detecting words) + var rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu; + function append(v, arg) { + assert(arguments.length === 2, 'append expect 2 arguments'); + var lhs = stringify(v); + var rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs + rhs; + } + function prepend(v, arg) { + assert(arguments.length === 2, 'prepend expect 2 arguments'); + var lhs = stringify(v); + var rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return rhs + lhs; + } + function lstrip(v, chars) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (var i = 0, set = new Set(chars); i < str.length; i++) { + if (!set.has(str[i])) + return str.slice(i); + } + return ''; + } + return str.trimStart(); + } + function downcase(v) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.toLowerCase(); + } + function upcase(v) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + return stringify(str).toUpperCase(); + } + function remove(v, arg) { + var str = stringify(v); + arg = stringify(arg); + this.context.memoryLimit.use(str.length + arg.length); + return str.split(arg).join(''); + } + function remove_first(v, l) { + var str = stringify(v); + l = stringify(l); + this.context.memoryLimit.use(str.length + l.length); + return str.replace(l, ''); + } + function remove_last(v, l) { + var str = stringify(v); + var pattern = stringify(l); + this.context.memoryLimit.use(str.length + pattern.length); + var index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + str.substring(index + pattern.length); + } + function rstrip(str, chars) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (var i = str.length - 1, set = new Set(chars); i >= 0; i--) { + if (!set.has(str[i])) + return str.slice(0, i + 1); + } + return ''; + } + return str.trimEnd(); + } + function split(v, arg) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + var arr = str.split(stringify(arg)); + // align to ruby split, which is the behavior of shopify/liquid + // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split + while (arr.length && arr[arr.length - 1] === '') + arr.pop(); + return arr; + } + function strip(v, chars) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + var set = new Set(stringify(chars)); + this.context.memoryLimit.use(set.size); + var i = 0; + var j = str.length - 1; + while (set.has(str[i])) + i++; + while (j >= i && set.has(str[j])) + j--; + return str.slice(i, j + 1); + } + return str.trim(); + } + function strip_newlines(v) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, ''); + } + function capitalize(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); + } + function replace(v, pattern, replacement) { + var str = stringify(v); + pattern = stringify(pattern); + replacement = stringify(replacement); + var parts = str.split(pattern); + var outputSize = str.length + (parts.length - 1) * (replacement.length - pattern.length); + this.context.memoryLimit.use(outputSize); + return parts.join(replacement); + } + function replace_first(v, arg1, arg2) { + var str = stringify(v); + arg1 = stringify(arg1); + arg2 = stringify(arg2); + this.context.memoryLimit.use(str.length + arg1.length + arg2.length); + return str.replace(arg1, function () { return arg2; }); + } + function replace_last(v, arg1, arg2) { + var str = stringify(v); + var pattern = stringify(arg1); + var replacement = stringify(arg2); + this.context.memoryLimit.use(str.length + pattern.length + replacement.length); + var index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + replacement + str.substring(index + pattern.length); + } + function truncate(v, l, o) { + if (l === void 0) { l = 50; } + if (o === void 0) { o = '...'; } + var str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + if (str.length <= l) + return v; + return str.substring(0, l - o.length) + o; + } + function truncatewords(v, words, o) { + if (words === void 0) { words = 15; } + if (o === void 0) { o = '...'; } + var str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + var arr = str.split(/\s+/); + if (words <= 0) + words = 1; + var ret = arr.slice(0, words).join(' '); + if (arr.length >= words) + ret += o; + return ret; + } + function normalize_whitespace(v) { + var str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\s+/g, ' '); + } + function number_of_words(input, mode) { + var str = stringify(input); + this.context.memoryLimit.use(str.length); + input = str.trim(); + if (!input) + return 0; + switch (mode) { + case 'cjk': + // Count CJK characters and words + return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length; + case 'auto': + // Count CJK characters, if none, count words + return rCJKWord.test(input) + ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length + : input.split(/\s+/).length; + default: + // Count words only + return input.split(/\s+/).length; + } + } + function array_to_sentence_string(array, connector) { + if (connector === void 0) { connector = 'and'; } + connector = stringify(connector); + this.context.memoryLimit.use(array.length + connector.length); + switch (array.length) { + case 0: + return ''; + case 1: + return array[0]; + case 2: + return "".concat(array[0], " ").concat(connector, " ").concat(array[1]); + default: + return "".concat(array.slice(0, -1).join(', '), ", ").concat(connector, " ").concat(array[array.length - 1]); + } + } + + var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string + }); + + function base64Encode(str) { + return btoa(String.fromCharCode.apply(String, __spreadArray([], __read(new TextEncoder().encode(str)), false))); + } + function base64Decode(str) { + return new TextDecoder().decode(Uint8Array.from(atob(str), function (c) { return c.charCodeAt(0); })); + } + + /** + * Base64 related filters + * + * Implements base64_encode and base64_decode filters for Shopify compatibility + */ + function base64_encode(value) { + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + this.context.memoryLimit.use(value.byteLength); + return value.toString('base64'); + } + var str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Encode(str); + } + function base64_decode(value) { + var str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Decode(str); + } + + var base64Filters = /*#__PURE__*/Object.freeze({ + __proto__: null, + base64_encode: base64_encode, + base64_decode: base64_decode + }); + + function bufferToHex(buffer) { + var bytes = new Uint8Array(buffer); + var hex = ''; + for (var i = 0; i < bytes.length; i++) { + hex += bytes[i].toString(16).padStart(2, '0'); + } + return hex; + } + function sha256(str) { + return __awaiter(this, void 0, void 0, function () { + var data, digest; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + data = new TextEncoder().encode(str); + return [4 /*yield*/, crypto.subtle.digest('SHA-256', data)]; + case 1: + digest = _a.sent(); + return [2 /*return*/, bufferToHex(digest)]; + } + }); + }); + } + function hmacSha256(str, key) { + return __awaiter(this, void 0, void 0, function () { + var encoder, cryptoKey, signature; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + encoder = new TextEncoder(); + return [4 /*yield*/, crypto.subtle.importKey('raw', encoder.encode(key), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])]; + case 1: + cryptoKey = _a.sent(); + return [4 /*yield*/, crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(str))]; + case 2: + signature = _a.sent(); + return [2 /*return*/, bufferToHex(signature)]; + } + }); + }); + } + + /** + * Crypto related filters + * + * Implements sha256 and hmac_sha256 filters for Shopify compatibility + */ + function sha256$1(value) { + var str = stringify(value); + this.context.memoryLimit.use(str.length); + return sha256(str); + } + function hmac_sha256(value, key) { + var str = stringify(value); + var keyStr = stringify(key); + this.context.memoryLimit.use(str.length + keyStr.length); + return hmacSha256(str, keyStr); + } + + var cryptoFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + sha256: sha256$1, + hmac_sha256: hmac_sha256 + }); + + var filters = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, htmlFilters), mathFilters), urlFilters), arrayFilters), dateFilters), stringFilters), base64Filters), cryptoFilters), misc); + + var default_1 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.identifier = _this.tokenizer.readIdentifier(); + _this.key = _this.identifier.content; + _this.tokenizer.assert(_this.key, 'expected variable name'); + _this.tokenizer.skipBlank(); + _this.tokenizer.assert(_this.tokenizer.peek() === '=', 'expected "="'); + _this.tokenizer.advance(); + _this.value = new Value(_this.tokenizer.readFilteredValue(), _this.liquid); + return _this; + } + default_1.prototype.render = function (ctx) { + var _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = ctx.bottom(); + _b = this.key; + return [4 /*yield*/, this.value.value(ctx, this.liquid.options.lenientIf)]; + case 1: + _a[_b] = _c.sent(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.arguments = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.value]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.localScope = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.identifier]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var MODIFIERS = ['offset', 'limit', 'reversed']; + var default_1$1 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid, parser) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + var variable = _this.tokenizer.readIdentifier(); + var inStr = _this.tokenizer.readIdentifier(); + var collection = _this.tokenizer.readValue(); + if (!variable.size() || inStr.content !== 'in' || !collection) { + throw new Error("illegal tag: ".concat(token.getText())); + } + _this.variable = variable.content; + _this.collection = collection; + _this.hash = new Hash(_this.tokenizer, liquid.options.keyValueSeparator); + _this.templates = []; + _this.elseTemplates = []; + var p; + var stream = parser.parseStream(remainTokens) + .on('start', function () { return (p = _this.templates); }) + .on('tag:else', function (tag) { assertEmpty(tag.args); p = _this.elseTemplates; }) + .on('tag:endfor', function (tag) { assertEmpty(tag.args); stream.stop(); }) + .on('template', function (tpl) { return p.push(tpl); }) + .on('end', function () { throw new Error("tag ".concat(token.getText(), " not closed")); }); + stream.start(); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var r, collection, _a, continueKey, hash, modifiers, scope, collection_1, collection_1_1, item, e_1_1; + var e_1, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + r = this.liquid.renderer; + _a = toEnumerable; + return [4 /*yield*/, evalToken(this.collection, ctx)]; + case 1: + collection = _a.apply(void 0, [_c.sent()]); + if (!!collection.length) return [3 /*break*/, 3]; + return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)]; + case 2: + _c.sent(); + return [2 /*return*/]; + case 3: + continueKey = 'continue-' + this.variable + '-' + this.collection.getText(); + ctx.push(createScope({ continue: ctx.getRegister(continueKey, {}) })); + return [4 /*yield*/, this.hash.render(ctx)]; + case 4: + hash = _c.sent(); + ctx.pop(); + modifiers = this.liquid.options.orderedFilterParameters + ? Object.keys(hash).filter(function (x) { return MODIFIERS.includes(x); }) + : MODIFIERS.filter(function (x) { return hash[x] !== undefined; }); + collection = modifiers.reduce(function (collection, modifier) { + if (modifier === 'offset') + return offset(collection, hash['offset']); + if (modifier === 'limit') + return limit(collection, hash['limit']); + return reversed(collection); + }, collection); + ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length); + scope = createScope({ forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }); + ctx.push(scope); + _c.label = 5; + case 5: + _c.trys.push([5, 10, 11, 12]); + collection_1 = __values(collection), collection_1_1 = collection_1.next(); + _c.label = 6; + case 6: + if (!!collection_1_1.done) return [3 /*break*/, 9]; + item = collection_1_1.value; + scope[this.variable] = item; + ctx.continueCalled = ctx.breakCalled = false; + return [4 /*yield*/, r.renderTemplates(this.templates, ctx, emitter)]; + case 7: + _c.sent(); + if (ctx.breakCalled) + return [3 /*break*/, 9]; + scope.forloop.next(); + _c.label = 8; + case 8: + collection_1_1 = collection_1.next(); + return [3 /*break*/, 6]; + case 9: return [3 /*break*/, 12]; + case 10: + e_1_1 = _c.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 12]; + case 11: + try { + if (collection_1_1 && !collection_1_1.done && (_b = collection_1.return)) _b.call(collection_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 12: + ctx.continueCalled = ctx.breakCalled = false; + ctx.pop(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + var templates; + return __generator(this, function (_a) { + templates = this.templates.slice(); + if (this.elseTemplates) { + templates.push.apply(templates, __spreadArray([], __read(this.elseTemplates), false)); + } + return [2 /*return*/, templates]; + }); + }; + default_1.prototype.arguments = function () { + var _a, _b, v, e_2_1; + var e_2, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: return [4 /*yield*/, this.collection]; + case 1: + _d.sent(); + _d.label = 2; + case 2: + _d.trys.push([2, 7, 8, 9]); + _a = __values(Object.values(this.hash.hash)), _b = _a.next(); + _d.label = 3; + case 3: + if (!!_b.done) return [3 /*break*/, 6]; + v = _b.value; + if (!isValueToken(v)) return [3 /*break*/, 5]; + return [4 /*yield*/, v]; + case 4: + _d.sent(); + _d.label = 5; + case 5: + _b = _a.next(); + return [3 /*break*/, 3]; + case 6: return [3 /*break*/, 9]; + case 7: + e_2_1 = _d.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (_b && !_b.done && (_c = _a.return)) _c.call(_a); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 9: return [2 /*return*/]; + } + }); + }; + default_1.prototype.blockScope = function () { + return [this.variable, 'forloop']; + }; + return default_1; + }(Tag)); + function reversed(arr) { + return __spreadArray([], __read(arr), false).reverse(); + } + function offset(arr, count) { + return arr.slice(count); + } + function limit(arr, count) { + return arr.slice(0, count); + } + + var default_1$2 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid, parser) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + _this.templates = []; + _this.identifier = _this.readVariable(); + _this.variable = _this.identifier.content; + while (remainTokens.length) { + var token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcapture') + return _this; + _this.templates.push(parser.parseToken(token, remainTokens)); + } + throw new Error("tag ".concat(tagToken.getText(), " not closed")); + } + default_1.prototype.readVariable = function () { + var ident = this.tokenizer.readIdentifier(); + if (ident.content) + return ident; + ident = this.tokenizer.readQuoted(); + if (ident) + return ident; + throw this.tokenizer.error('invalid capture name'); + }; + default_1.prototype.render = function (ctx) { + var r, html; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + r = this.liquid.renderer; + return [4 /*yield*/, r.renderTemplates(this.templates, ctx)]; + case 1: + html = _a.sent(); + ctx.bottom()[this.variable] = html; + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.templates]; + }); + }; + default_1.prototype.localScope = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.identifier]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var default_1$3 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid, parser) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + _this.branches = []; + _this.elseTemplates = []; + _this.value = new Value(_this.tokenizer.readFilteredValue(), _this.liquid); + _this.elseTemplates = []; + var p = []; + var elseCount = 0; + var stream = parser.parseStream(remainTokens) + .on('tag:when', function (token) { + if (elseCount > 0) { + return; + } + p = []; + var values = []; + while (!token.tokenizer.end()) { + values.push(token.tokenizer.readValueOrThrow()); + token.tokenizer.skipBlank(); + if (token.tokenizer.peek() === ',') { + token.tokenizer.readTo(','); + } + else { + token.tokenizer.readTo('or'); + } + } + _this.branches.push({ + values: values, + templates: p + }); + }) + .on('tag:else', function () { + elseCount++; + p = _this.elseTemplates; + }) + .on('tag:endcase', function () { return stream.stop(); }) + .on('template', function (tpl) { + if (p !== _this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', function () { + throw new Error("tag ".concat(tagToken.getText(), " not closed")); + }); + stream.start(); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var r, target, _a, branchHit, _b, _c, branch, _d, _e, valueToken, value, e_1_1, e_2_1; + var e_2, _f, e_1, _g; + return __generator(this, function (_h) { + switch (_h.label) { + case 0: + r = this.liquid.renderer; + _a = toValue; + return [4 /*yield*/, this.value.value(ctx, ctx.opts.lenientIf)]; + case 1: + target = _a.apply(void 0, [_h.sent()]); + branchHit = false; + _h.label = 2; + case 2: + _h.trys.push([2, 14, 15, 16]); + _b = __values(this.branches), _c = _b.next(); + _h.label = 3; + case 3: + if (!!_c.done) return [3 /*break*/, 13]; + branch = _c.value; + _h.label = 4; + case 4: + _h.trys.push([4, 10, 11, 12]); + _d = (e_1 = void 0, __values(branch.values)), _e = _d.next(); + _h.label = 5; + case 5: + if (!!_e.done) return [3 /*break*/, 9]; + valueToken = _e.value; + return [4 /*yield*/, evalToken(valueToken, ctx, ctx.opts.lenientIf)]; + case 6: + value = _h.sent(); + if (!equals(target, value)) return [3 /*break*/, 8]; + return [4 /*yield*/, r.renderTemplates(branch.templates, ctx, emitter)]; + case 7: + _h.sent(); + branchHit = true; + return [3 /*break*/, 9]; + case 8: + _e = _d.next(); + return [3 /*break*/, 5]; + case 9: return [3 /*break*/, 12]; + case 10: + e_1_1 = _h.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 12]; + case 11: + try { + if (_e && !_e.done && (_g = _d.return)) _g.call(_d); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 12: + _c = _b.next(); + return [3 /*break*/, 3]; + case 13: return [3 /*break*/, 16]; + case 14: + e_2_1 = _h.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 16]; + case 15: + try { + if (_c && !_c.done && (_f = _b.return)) _f.call(_b); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 16: + if (!!branchHit) return [3 /*break*/, 18]; + return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)]; + case 17: + _h.sent(); + _h.label = 18; + case 18: return [2 /*return*/]; + } + }); + }; + default_1.prototype.arguments = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.value]; + case 1: + _a.sent(); + return [5 /*yield**/, __values(this.branches.flatMap(function (b) { return b.values; }))]; + case 2: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + var templates; + return __generator(this, function (_a) { + templates = this.branches.flatMap(function (b) { return b.templates; }); + if (this.elseTemplates) { + templates.push.apply(templates, __spreadArray([], __read(this.elseTemplates), false)); + } + return [2 /*return*/, templates]; + }); + }; + return default_1; + }(Tag)); + + var default_1$4 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + while (remainTokens.length) { + var token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcomment') + return _this; + } + throw new Error("tag ".concat(tagToken.getText(), " not closed")); + } + default_1.prototype.render = function () { }; + return default_1; + }(Tag)); + + var default_1$5 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid, parser) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + var tokenizer = _this.tokenizer; + _this.file = parseFilePath(tokenizer, _this.liquid, parser); + _this.currentFile = token.file; + while (!tokenizer.end()) { + tokenizer.skipBlank(); + var begin = tokenizer.p; + var keyword = tokenizer.readIdentifier(); + if (keyword.content === 'with' || keyword.content === 'for') { + tokenizer.skipBlank(); + // can be normal key/value pair, like "with: true" + if (tokenizer.peek() !== ':') { + var value = tokenizer.readValue(); + // can be normal key, like "with," + if (value) { + var beforeAs = tokenizer.p; + var asStr = tokenizer.readIdentifier(); + var alias = void 0; + if (asStr.content === 'as') + alias = tokenizer.readIdentifier(); + else + tokenizer.p = beforeAs; + _this[keyword.content] = { value: value, alias: alias && alias.content }; + tokenizer.skipBlank(); + if (tokenizer.peek() === ',') + tokenizer.advance(); + continue; // matched! + } + } + } + /** + * restore cursor if with/for not matched + */ + tokenizer.p = begin; + break; + } + _this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var _a, liquid, hash, filepath, childCtx, scope, _b, _c, _d, value, alias, _e, _f, _g, value, alias, collection, _h, collection_1, collection_1_1, item, templates, e_1_1, templates; + var e_1, _j; + return __generator(this, function (_k) { + switch (_k.label) { + case 0: + _a = this, liquid = _a.liquid, hash = _a.hash; + return [4 /*yield*/, renderFilePath(this['file'], ctx, liquid)]; + case 1: + filepath = (_k.sent()); + assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); }); + childCtx = ctx.spawn(); + scope = childCtx.bottom(); + _b = __assign; + _c = [scope]; + return [4 /*yield*/, hash.render(ctx)]; + case 2: + _b.apply(void 0, _c.concat([_k.sent()])); + if (!this['with']) return [3 /*break*/, 4]; + _d = this['with'], value = _d.value, alias = _d.alias; + _e = scope; + _f = alias || filepath; + return [4 /*yield*/, evalToken(value, ctx)]; + case 3: + _e[_f] = _k.sent(); + _k.label = 4; + case 4: + if (!this['for']) return [3 /*break*/, 15]; + _g = this['for'], value = _g.value, alias = _g.alias; + _h = toEnumerable; + return [4 /*yield*/, evalToken(value, ctx)]; + case 5: + collection = _h.apply(void 0, [_k.sent()]); + scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias); + _k.label = 6; + case 6: + _k.trys.push([6, 12, 13, 14]); + collection_1 = __values(collection), collection_1_1 = collection_1.next(); + _k.label = 7; + case 7: + if (!!collection_1_1.done) return [3 /*break*/, 11]; + item = collection_1_1.value; + scope[alias] = item; + return [4 /*yield*/, liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])]; + case 8: + templates = (_k.sent()); + return [4 /*yield*/, liquid.renderer.renderTemplates(templates, childCtx, emitter)]; + case 9: + _k.sent(); + scope['forloop'].next(); + _k.label = 10; + case 10: + collection_1_1 = collection_1.next(); + return [3 /*break*/, 7]; + case 11: return [3 /*break*/, 14]; + case 12: + e_1_1 = _k.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 14]; + case 13: + try { + if (collection_1_1 && !collection_1_1.done && (_j = collection_1.return)) _j.call(collection_1); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 14: return [3 /*break*/, 18]; + case 15: return [4 /*yield*/, liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])]; + case 16: + templates = (_k.sent()); + return [4 /*yield*/, liquid.renderer.renderTemplates(templates, childCtx, emitter)]; + case 17: + _k.sent(); + _k.label = 18; + case 18: return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function (partials, sync) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(partials && isString(this['file']))) return [3 /*break*/, 2]; + return [4 /*yield*/, this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])]; + case 1: return [2 /*return*/, (_a.sent())]; + case 2: return [2 /*return*/, []]; + } + }); + }; + default_1.prototype.partialScope = function () { + if (isString(this['file'])) { + var names = Object.keys(this.hash.hash); + if (this['with']) { + var _a = this['with'], value = _a.value, alias = _a.alias; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + if (this['for']) { + var _b = this['for'], value = _b.value, alias = _b.alias; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + return { name: this['file'], isolated: true, scope: names }; + } + }; + default_1.prototype.arguments = function () { + var _a, _b, v, e_2_1, value, value; + var e_2, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + _d.trys.push([0, 5, 6, 7]); + _a = __values(Object.values(this.hash.hash)), _b = _a.next(); + _d.label = 1; + case 1: + if (!!_b.done) return [3 /*break*/, 4]; + v = _b.value; + if (!isValueToken(v)) return [3 /*break*/, 3]; + return [4 /*yield*/, v]; + case 2: + _d.sent(); + _d.label = 3; + case 3: + _b = _a.next(); + return [3 /*break*/, 1]; + case 4: return [3 /*break*/, 7]; + case 5: + e_2_1 = _d.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 7]; + case 6: + try { + if (_b && !_b.done && (_c = _a.return)) _c.call(_a); + } + finally { if (e_2) throw e_2.error; } + return [7 /*endfinally*/]; + case 7: + if (!this['with']) return [3 /*break*/, 9]; + value = this['with'].value; + if (!isValueToken(value)) return [3 /*break*/, 9]; + return [4 /*yield*/, value]; + case 8: + _d.sent(); + _d.label = 9; + case 9: + if (!this['for']) return [3 /*break*/, 11]; + value = this['for'].value; + if (!isValueToken(value)) return [3 /*break*/, 11]; + return [4 /*yield*/, value]; + case 10: + _d.sent(); + _d.label = 11; + case 11: return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + /** + * @return null for "none", + * @return Template[] for quoted with tags and/or filters + * @return Token for expression (not quoted) + * @throws TypeError if cannot read next token + */ + function parseFilePath(tokenizer, liquid, parser) { + if (liquid.options.dynamicPartials) { + var file = tokenizer.readValue(); + tokenizer.assert(file, 'illegal file path'); + if (file.getText() === 'none') + return; + if (isQuotedToken(file)) { + // for filenames like "files/{{file}}", eval as liquid template + var templates_1 = parser.parse(evalQuotedToken(file)); + return optimize(templates_1); + } + return file; + } + var tokens = __spreadArray([], __read(tokenizer.readFileNameTemplate(liquid.options)), false); + var templates = optimize(parser.parseTokens(tokens)); + return templates === 'none' ? undefined : templates; + } + function optimize(templates) { + // for filenames like "files/file.liquid", extract the string directly + if (templates.length === 1 && isHTMLToken(templates[0].token)) + return templates[0].token.getContent(); + return templates; + } + function renderFilePath(file, ctx, liquid) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (typeof file === 'string') + return [2 /*return*/, file]; + if (Array.isArray(file)) + return [2 /*return*/, liquid.renderer.renderTemplates(file, ctx)]; + return [4 /*yield*/, evalToken(file, ctx)]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + } + + var default_1$6 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid, parser) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + var tokenizer = token.tokenizer; + _this['file'] = parseFilePath(tokenizer, _this.liquid, parser); + _this['currentFile'] = token.file; + var begin = tokenizer.p; + var withStr = tokenizer.readIdentifier(); + if (withStr.content === 'with') { + tokenizer.skipBlank(); + if (tokenizer.peek() !== ':') { + _this.withVar = tokenizer.readValue(); + } + else + tokenizer.p = begin; + } + else + tokenizer.p = begin; + _this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var _a, liquid, hash, withVar, renderer, filepath, saved, scope, _b, _c, _d, templates; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = this, liquid = _a.liquid, hash = _a.hash, withVar = _a.withVar; + renderer = liquid.renderer; + return [4 /*yield*/, renderFilePath(this['file'], ctx, liquid)]; + case 1: + filepath = (_e.sent()); + assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); }); + saved = ctx.saveRegister('blocks', 'blockMode'); + ctx.setRegister('blocks', {}); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + _b = createScope; + return [4 /*yield*/, hash.render(ctx)]; + case 2: + scope = _b.apply(void 0, [(_e.sent())]); + if (!withVar) return [3 /*break*/, 4]; + _c = scope; + _d = filepath; + return [4 /*yield*/, evalToken(withVar, ctx)]; + case 3: + _c[_d] = _e.sent(); + _e.label = 4; + case 4: return [4 /*yield*/, liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])]; + case 5: + templates = (_e.sent()); + ctx.push(ctx.opts.jekyllInclude ? createScope({ include: scope }) : scope); + return [4 /*yield*/, renderer.renderTemplates(templates, ctx, emitter)]; + case 6: + _e.sent(); + ctx.pop(); + ctx.restoreRegister(saved); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function (partials, sync) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(partials && isString(this['file']))) return [3 /*break*/, 2]; + return [4 /*yield*/, this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])]; + case 1: return [2 /*return*/, (_a.sent())]; + case 2: return [2 /*return*/, []]; + } + }); + }; + default_1.prototype.partialScope = function () { + if (isString(this['file'])) { + var names = void 0; + if (this.liquid.options.jekyllInclude) { + names = ['include']; + } + else { + names = Object.keys(this.hash.hash); + if (this.withVar) { + names.push([this['file'], this.withVar]); + } + } + return { name: this['file'], isolated: false, scope: names }; + } + }; + default_1.prototype.arguments = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(Object.values(this.hash.hash).filter(isValueToken))]; + case 1: + _a.sent(); + if (!isValueToken(this['file'])) return [3 /*break*/, 3]; + return [4 /*yield*/, this['file']]; + case 2: + _a.sent(); + _a.label = 3; + case 3: + if (!isValueToken(this.withVar)) return [3 /*break*/, 5]; + return [4 /*yield*/, this.withVar]; + case 4: + _a.sent(); + _a.label = 5; + case 5: return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var default_1$7 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.identifier = _this.tokenizer.readIdentifier(); + _this.variable = _this.identifier.content; + return _this; + } + default_1.prototype.render = function (context, emitter) { + var scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + emitter.write(stringify(--scope[this.variable])); + }; + default_1.prototype.localScope = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.identifier]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var default_1$8 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.candidates = []; + var group = _this.tokenizer.readValue(); + _this.tokenizer.skipBlank(); + if (group) { + if (_this.tokenizer.peek() === ':') { + _this.group = group; + _this.tokenizer.advance(); + } + else + _this.candidates.push(group); + } + while (!_this.tokenizer.end()) { + var value = _this.tokenizer.readValue(); + if (value) + _this.candidates.push(value); + _this.tokenizer.readTo(','); + } + _this.tokenizer.assert(_this.candidates.length, function () { return "empty candidates: \"".concat(token.getText(), "\""); }); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var group, fingerprint, groups, idx, candidate; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, evalToken(this.group, ctx)]; + case 1: + group = (_a.sent()); + fingerprint = "cycle:".concat(group, ":") + this.candidates.join(','); + groups = ctx.getRegister('cycle', {}); + idx = groups[fingerprint]; + if (idx === undefined) { + idx = groups[fingerprint] = 0; + } + candidate = this.candidates[idx]; + idx = (idx + 1) % this.candidates.length; + groups[fingerprint] = idx; + return [4 /*yield*/, evalToken(candidate, ctx)]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }; + default_1.prototype.arguments = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [5 /*yield**/, __values(this.candidates)]; + case 1: + _a.sent(); + if (!this.group) return [3 /*break*/, 3]; + return [4 /*yield*/, this.group]; + case 2: + _a.sent(); + _a.label = 3; + case 3: return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var default_1$9 = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid, parser) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + _this.branches = []; + var p = []; + parser.parseStream(remainTokens) + .on('start', function () { return _this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), _this.liquid), + templates: (p = []) + }); }) + .on('tag:elsif', function (token) { + assert(!_this.elseTemplates, 'unexpected elsif after else'); + _this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), _this.liquid), + templates: (p = []) + }); + }) + .on('tag:else', function (tag) { + assertEmpty(tag.args); + assert(!_this.elseTemplates, 'duplicated else'); + p = _this.elseTemplates = []; + }) + .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); }) + .on('template', function (tpl) { return p.push(tpl); }) + .on('end', function () { throw new Error("tag ".concat(tagToken.getText(), " not closed")); }) + .start(); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var r, _a, _b, _c, value, templates, v, e_1_1; + var e_1, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + r = this.liquid.renderer; + _e.label = 1; + case 1: + _e.trys.push([1, 7, 8, 9]); + _a = __values(this.branches), _b = _a.next(); + _e.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 6]; + _c = _b.value, value = _c.value, templates = _c.templates; + return [4 /*yield*/, value.value(ctx, ctx.opts.lenientIf)]; + case 3: + v = _e.sent(); + if (!isTruthy(v, ctx)) return [3 /*break*/, 5]; + return [4 /*yield*/, r.renderTemplates(templates, ctx, emitter)]; + case 4: + _e.sent(); + return [2 /*return*/]; + case 5: + _b = _a.next(); + return [3 /*break*/, 2]; + case 6: return [3 /*break*/, 9]; + case 7: + e_1_1 = _e.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (_b && !_b.done && (_d = _a.return)) _d.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 9: return [4 /*yield*/, r.renderTemplates(this.elseTemplates || [], ctx, emitter)]; + case 10: + _e.sent(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + var templates; + return __generator(this, function (_a) { + templates = this.branches.flatMap(function (b) { return b.templates; }); + if (this.elseTemplates) { + templates.push.apply(templates, __spreadArray([], __read(this.elseTemplates), false)); + } + return [2 /*return*/, templates]; + }); + }; + default_1.prototype.arguments = function () { + return this.branches.map(function (b) { return b.value; }); + }; + return default_1; + }(Tag)); + + var default_1$a = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.identifier = _this.tokenizer.readIdentifier(); + _this.variable = _this.identifier.content; + return _this; + } + default_1.prototype.render = function (context, emitter) { + var scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + var val = scope[this.variable]; + scope[this.variable]++; + emitter.write(stringify(val)); + }; + default_1.prototype.localScope = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.identifier]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var default_1$b = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid, parser) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.file = parseFilePath(_this.tokenizer, _this.liquid, parser); + _this['currentFile'] = token.file; + _this.args = new Hash(_this.tokenizer, liquid.options.keyValueSeparator); + _this.templates = parser.parseTokens(remainTokens); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var _a, liquid, args, file, renderer, filepath, templates, html, blocks, _b, _c, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + _a = this, liquid = _a.liquid, args = _a.args, file = _a.file; + renderer = liquid.renderer; + if (!(file === undefined)) return [3 /*break*/, 2]; + ctx.setRegister('blockMode', BlockMode.OUTPUT); + return [4 /*yield*/, renderer.renderTemplates(this.templates, ctx, emitter)]; + case 1: + _e.sent(); + return [2 /*return*/]; + case 2: return [4 /*yield*/, renderFilePath(this.file, ctx, liquid)]; + case 3: + filepath = (_e.sent()); + assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); }); + return [4 /*yield*/, liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])]; + case 4: + templates = (_e.sent()); + // render remaining contents and store rendered results + ctx.setRegister('blockMode', BlockMode.STORE); + return [4 /*yield*/, renderer.renderTemplates(this.templates, ctx)]; + case 5: + html = _e.sent(); + blocks = ctx.getRegister('blocks', {}); + // set whole content to anonymous block if anonymous doesn't specified + if (blocks[''] === undefined) + blocks[''] = function (parent, emitter) { return emitter.write(html); }; + ctx.setRegister('blockMode', BlockMode.OUTPUT); + // render the layout file use stored blocks + _c = (_b = ctx).push; + _d = createScope; + return [4 /*yield*/, args.render(ctx)]; + case 6: + // render the layout file use stored blocks + _c.apply(_b, [_d.apply(void 0, [(_e.sent())])]); + return [4 /*yield*/, renderer.renderTemplates(templates, ctx, emitter)]; + case 7: + _e.sent(); + ctx.pop(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function (partials) { + var templates, _a, _b, _c, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + templates = this.templates.slice(); + if (!(partials && isString(this.file))) return [3 /*break*/, 2]; + _b = (_a = templates.push).apply; + _c = [templates]; + _d = [[]]; + return [4 /*yield*/, this.liquid._parsePartialFile(this.file, true, this['currentFile'])]; + case 1: + _b.apply(_a, _c.concat([__spreadArray.apply(void 0, _d.concat([__read.apply(void 0, [(_e.sent())]), false]))])); + _e.label = 2; + case 2: return [2 /*return*/, templates]; + } + }); + }; + default_1.prototype.arguments = function () { + var _a, _b, v, e_1_1; + var e_1, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + _d.trys.push([0, 5, 6, 7]); + _a = __values(Object.values(this.args.hash)), _b = _a.next(); + _d.label = 1; + case 1: + if (!!_b.done) return [3 /*break*/, 4]; + v = _b.value; + if (!isValueToken(v)) return [3 /*break*/, 3]; + return [4 /*yield*/, v]; + case 2: + _d.sent(); + _d.label = 3; + case 3: + _b = _a.next(); + return [3 /*break*/, 1]; + case 4: return [3 /*break*/, 7]; + case 5: + e_1_1 = _d.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 7]; + case 6: + try { + if (_b && !_b.done && (_c = _a.return)) _c.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 7: + if (!isValueToken(this.file)) return [3 /*break*/, 9]; + return [4 /*yield*/, this.file]; + case 8: + _d.sent(); + _d.label = 9; + case 9: return [2 /*return*/]; + } + }); + }; + default_1.prototype.partialScope = function () { + if (isString(this.file)) { + return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }; + } + }; + return default_1; + }(Tag)); + + var default_1$c = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid, parser) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.templates = []; + var match = /\w+/.exec(token.args); + _this.block = match ? match[0] : ''; + while (remainTokens.length) { + var token_1 = remainTokens.shift(); + if (isTagToken(token_1) && token_1.name === 'endblock') + return _this; + var template = parser.parseToken(token_1, remainTokens); + _this.templates.push(template); + } + throw new Error("tag ".concat(token.getText(), " not closed")); + } + default_1.prototype.render = function (ctx, emitter) { + var blockRender; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + blockRender = this.getBlockRender(ctx); + if (!(ctx.getRegister('blockMode') === BlockMode.STORE)) return [3 /*break*/, 1]; + ctx.getRegister('blocks', {})[this.block] = blockRender; + return [3 /*break*/, 3]; + case 1: return [4 /*yield*/, blockRender(new BlockDrop(), emitter)]; + case 2: + _a.sent(); + _a.label = 3; + case 3: return [2 /*return*/]; + } + }); + }; + default_1.prototype.getBlockRender = function (ctx) { + var self = this; + var _a = this, liquid = _a.liquid, templates = _a.templates; + var renderChild = ctx.getRegister('blocks', {})[this.block]; + var renderCurrent = function (superBlock, emitter) { + var stack; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + stack = ctx.getRegister('blockStack', []); + if (stack.includes(self)) + throw new Error('block tag cannot be nested'); + stack.push(self); + ctx.push(createScope({ block: superBlock })); + return [4 /*yield*/, liquid.renderer.renderTemplates(templates, ctx, emitter)]; + case 1: + _a.sent(); + ctx.pop(); + stack.pop(); + return [2 /*return*/]; + } + }); + }; + return renderChild + ? function (superBlock, emitter) { return renderChild(new BlockDrop(function (emitter) { return renderCurrent(superBlock, emitter); }), emitter); } + : renderCurrent; + }; + default_1.prototype.children = function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.templates]; + }); + }; + default_1.prototype.blockScope = function () { + return ['block']; + }; + return default_1; + }(Tag)); + + var default_1$d = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + _this.tokens = []; + while (remainTokens.length) { + var token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endraw') + return _this; + _this.tokens.push(token); + } + throw new Error("tag ".concat(tagToken.getText(), " not closed")); + } + default_1.prototype.render = function () { + return this.tokens.map(function (token) { return token.getText(); }).join(''); + }; + return default_1; + }(Tag)); + + var TablerowloopDrop = /** @class */ (function (_super) { + __extends(TablerowloopDrop, _super); + function TablerowloopDrop(length, cols, collection, variable) { + var _this = _super.call(this, length, collection, variable) || this; + _this.length = length; + _this.cols = cols; + return _this; + } + TablerowloopDrop.prototype.row = function () { + return Math.floor(this.i / this.cols) + 1; + }; + TablerowloopDrop.prototype.col0 = function () { + return (this.i % this.cols); + }; + TablerowloopDrop.prototype.col = function () { + return this.col0() + 1; + }; + TablerowloopDrop.prototype.col_first = function () { + return this.col0() === 0; + }; + TablerowloopDrop.prototype.col_last = function () { + return this.col() === this.cols; + }; + return TablerowloopDrop; + }(ForloopDrop)); + + var default_1$e = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid, parser) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + var variable = _this.tokenizer.readIdentifier(); + _this.tokenizer.skipBlank(); + var predicate = _this.tokenizer.readIdentifier(); + var collectionToken = _this.tokenizer.readValue(); + if (predicate.content !== 'in' || !collectionToken) { + throw new Error("illegal tag: ".concat(tagToken.getText())); + } + _this.variable = variable.content; + _this.collection = collectionToken; + _this.args = new Hash(_this.tokenizer, liquid.options.keyValueSeparator); + _this.templates = []; + var p; + var stream = parser.parseStream(remainTokens) + .on('start', function () { return (p = _this.templates); }) + .on('tag:endtablerow', function () { return stream.stop(); }) + .on('template', function (tpl) { return p.push(tpl); }) + .on('end', function () { + throw new Error("tag ".concat(tagToken.getText(), " not closed")); + }); + stream.start(); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var collection, _a, args, offset, limit, cols, r, tablerowloop, scope, idx; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + _a = toEnumerable; + return [4 /*yield*/, evalToken(this.collection, ctx)]; + case 1: + collection = _a.apply(void 0, [_b.sent()]); + return [4 /*yield*/, this.args.render(ctx)]; + case 2: + args = (_b.sent()); + offset = args.offset || 0; + limit = (args.limit === undefined) ? collection.length : args.limit; + collection = collection.slice(offset, offset + limit); + cols = args.cols || collection.length; + r = this.liquid.renderer; + tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable); + scope = createScope({ tablerowloop: tablerowloop }); + ctx.push(scope); + idx = 0; + _b.label = 3; + case 3: + if (!(idx < collection.length)) return [3 /*break*/, 6]; + scope[this.variable] = collection[idx]; + if (tablerowloop.col0() === 0) { + if (tablerowloop.row() !== 1) + emitter.write(''); + emitter.write("")); + } + emitter.write("")); + return [4 /*yield*/, r.renderTemplates(this.templates, ctx, emitter)]; + case 4: + _b.sent(); + emitter.write(''); + _b.label = 5; + case 5: + idx++, tablerowloop.next(); + return [3 /*break*/, 3]; + case 6: + if (collection.length) + emitter.write(''); + ctx.pop(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.templates]; + }); + }; + default_1.prototype.arguments = function () { + var _a, _b, v, e_1_1; + var e_1, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: return [4 /*yield*/, this.collection]; + case 1: + _d.sent(); + _d.label = 2; + case 2: + _d.trys.push([2, 7, 8, 9]); + _a = __values(Object.values(this.args.hash)), _b = _a.next(); + _d.label = 3; + case 3: + if (!!_b.done) return [3 /*break*/, 6]; + v = _b.value; + if (!isValueToken(v)) return [3 /*break*/, 5]; + return [4 /*yield*/, v]; + case 4: + _d.sent(); + _d.label = 5; + case 5: + _b = _a.next(); + return [3 /*break*/, 3]; + case 6: return [3 /*break*/, 9]; + case 7: + e_1_1 = _d.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (_b && !_b.done && (_c = _a.return)) _c.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 9: return [2 /*return*/]; + } + }); + }; + default_1.prototype.blockScope = function () { + return [this.variable, 'tablerowloop']; + }; + return default_1; + }(Tag)); + + var default_1$f = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid, parser) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + _this.branches = []; + _this.elseTemplates = []; + var p = []; + var elseCount = 0; + parser.parseStream(remainTokens) + .on('start', function () { return _this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), _this.liquid), + test: isFalsy, + templates: (p = []) + }); }) + .on('tag:elsif', function (token) { + if (elseCount > 0) { + p = []; + return; + } + _this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), _this.liquid), + test: isTruthy, + templates: (p = []) + }); + }) + .on('tag:else', function () { + elseCount++; + p = _this.elseTemplates; + }) + .on('tag:endunless', function () { this.stop(); }) + .on('template', function (tpl) { + if (p !== _this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', function () { throw new Error("tag ".concat(tagToken.getText(), " not closed")); }) + .start(); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var r, _a, _b, _c, value, test_1, templates, v, e_1_1; + var e_1, _d; + return __generator(this, function (_e) { + switch (_e.label) { + case 0: + r = this.liquid.renderer; + _e.label = 1; + case 1: + _e.trys.push([1, 7, 8, 9]); + _a = __values(this.branches), _b = _a.next(); + _e.label = 2; + case 2: + if (!!_b.done) return [3 /*break*/, 6]; + _c = _b.value, value = _c.value, test_1 = _c.test, templates = _c.templates; + return [4 /*yield*/, value.value(ctx, ctx.opts.lenientIf)]; + case 3: + v = _e.sent(); + if (!test_1(v, ctx)) return [3 /*break*/, 5]; + return [4 /*yield*/, r.renderTemplates(templates, ctx, emitter)]; + case 4: + _e.sent(); + return [2 /*return*/]; + case 5: + _b = _a.next(); + return [3 /*break*/, 2]; + case 6: return [3 /*break*/, 9]; + case 7: + e_1_1 = _e.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 9]; + case 8: + try { + if (_b && !_b.done && (_d = _a.return)) _d.call(_a); + } + finally { if (e_1) throw e_1.error; } + return [7 /*endfinally*/]; + case 9: return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)]; + case 10: + _e.sent(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + var children; + return __generator(this, function (_a) { + children = this.branches.flatMap(function (b) { return b.templates; }); + if (this.elseTemplates) { + children.push.apply(children, __spreadArray([], __read(this.elseTemplates), false)); + } + return [2 /*return*/, children]; + }); + }; + default_1.prototype.arguments = function () { + return this.branches.map(function (b) { return b.value; }); + }; + return default_1; + }(Tag)); + + var default_1$g = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + default_1.prototype.render = function (ctx, _emitter) { + ctx.breakCalled = true; + }; + return default_1; + }(Tag)); + + var default_1$h = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + default_1.prototype.render = function (ctx, _emitter) { + ctx.continueCalled = true; + }; + return default_1; + }(Tag)); + + var default_1$i = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + _this.tokenizer.skipBlank(); + if (!_this.tokenizer.end()) { + _this.value = new Value(_this.tokenizer.readFilteredValue(), _this.liquid); + } + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + var val; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!this.value) + return [2 /*return*/]; + return [4 /*yield*/, this.value.value(ctx, false)]; + case 1: + val = _a.sent(); + emitter.write(val); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.arguments = function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!this.value) return [3 /*break*/, 2]; + return [4 /*yield*/, this.value]; + case 1: + _a.sent(); + _a.label = 2; + case 2: return [2 /*return*/]; + } + }); + }; + return default_1; + }(Tag)); + + var default_1$j = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(token, remainTokens, liquid, parser) { + var _this = _super.call(this, token, remainTokens, liquid) || this; + var tokens = _this.tokenizer.readLiquidTagTokens(_this.liquid.options); + _this.templates = parser.parseTokens(tokens); + return _this; + } + default_1.prototype.render = function (ctx, emitter) { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, ctx, emitter)]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }; + default_1.prototype.children = function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.templates]; + }); + }; + return default_1; + }(Tag)); + + var default_1$k = /** @class */ (function (_super) { + __extends(default_1, _super); + function default_1(tagToken, remainTokens, liquid) { + var _this = _super.call(this, tagToken, remainTokens, liquid) || this; + if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) { + throw new Error('every line of an inline comment must start with a \'#\' character'); + } + return _this; + } + default_1.prototype.render = function () { }; + return default_1; + }(Tag)); + + var tags = { + assign: default_1, + 'for': default_1$1, + capture: default_1$2, + 'case': default_1$3, + comment: default_1$4, + include: default_1$6, + render: default_1$5, + decrement: default_1$7, + increment: default_1$a, + cycle: default_1$8, + 'if': default_1$9, + layout: default_1$b, + block: default_1$c, + raw: default_1$d, + tablerow: default_1$e, + unless: default_1$f, + 'break': default_1$g, + 'continue': default_1$h, + echo: default_1$i, + liquid: default_1$j, + '#': default_1$k + }; + + var Liquid = /** @class */ (function () { + function Liquid(opts) { + if (opts === void 0) { opts = {}; } + var _this = this; + this.renderer = new Render(); + this.filters = Object.create(null); + this.tags = Object.create(null); + this.options = normalize(opts); + // eslint-disable-next-line deprecation/deprecation + this.parser = new Parser(this); + forOwn(tags, function (conf, name) { return _this.registerTag(name, conf); }); + forOwn(filters, function (handler, name) { return _this.registerFilter(name, handler); }); + } + Liquid.prototype.parse = function (html, filepath) { + var parser = new Parser(this); + return parser.parse(html, filepath); + }; + Liquid.prototype._render = function (tpl, scope, renderOptions) { + var ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplates(tpl, ctx); + }; + Liquid.prototype.render = function (tpl, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, toPromise(this._render(tpl, scope, __assign(__assign({}, renderOptions), { sync: false })))]; + }); + }); + }; + Liquid.prototype.renderSync = function (tpl, scope, renderOptions) { + return toValueSync(this._render(tpl, scope, __assign(__assign({}, renderOptions), { sync: true }))); + }; + Liquid.prototype.renderToNodeStream = function (tpl, scope, renderOptions) { + if (renderOptions === void 0) { renderOptions = {}; } + var ctx = new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplatesToNodeStream(tpl, ctx); + }; + Liquid.prototype._parseAndRender = function (html, scope, renderOptions) { + var tpl = this.parse(html); + return this._render(tpl, scope, renderOptions); + }; + Liquid.prototype.parseAndRender = function (html, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, toPromise(this._parseAndRender(html, scope, __assign(__assign({}, renderOptions), { sync: false })))]; + }); + }); + }; + Liquid.prototype.parseAndRenderSync = function (html, scope, renderOptions) { + return toValueSync(this._parseAndRender(html, scope, __assign(__assign({}, renderOptions), { sync: true }))); + }; + Liquid.prototype._parsePartialFile = function (file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, exports.LookupType.Partials, currentFile); + }; + Liquid.prototype._parseLayoutFile = function (file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, exports.LookupType.Layouts, currentFile); + }; + Liquid.prototype._parseFile = function (file, sync, lookupType, currentFile) { + return new Parser(this).parseFile(file, sync, lookupType, currentFile); + }; + Liquid.prototype.parseFile = function (file, lookupType) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, toPromise(new Parser(this).parseFile(file, false, lookupType))]; + }); + }); + }; + Liquid.prototype.parseFileSync = function (file, lookupType) { + return toValueSync(new Parser(this).parseFile(file, true, lookupType)); + }; + Liquid.prototype._renderFile = function (file, ctx, renderFileOptions) { + var templates; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)]; + case 1: + templates = (_a.sent()); + return [4 /*yield*/, this._render(templates, ctx, renderFileOptions)]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }; + Liquid.prototype.renderFile = function (file, ctx, renderFileOptions) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, toPromise(this._renderFile(file, ctx, __assign(__assign({}, renderFileOptions), { sync: false })))]; + }); + }); + }; + Liquid.prototype.renderFileSync = function (file, ctx, renderFileOptions) { + return toValueSync(this._renderFile(file, ctx, __assign(__assign({}, renderFileOptions), { sync: true }))); + }; + Liquid.prototype.renderFileToNodeStream = function (file, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function () { + var templates; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.parseFile(file)]; + case 1: + templates = _a.sent(); + return [2 /*return*/, this.renderToNodeStream(templates, scope, renderOptions)]; + } + }); + }); + }; + Liquid.prototype._evalValue = function (str, scope) { + var value = new Value(str, this); + var ctx = scope instanceof Context ? scope : new Context(scope, this.options); + return value.value(ctx); + }; + Liquid.prototype.evalValue = function (str, scope) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, toPromise(this._evalValue(str, scope))]; + }); + }); + }; + Liquid.prototype.evalValueSync = function (str, scope) { + return toValueSync(this._evalValue(str, scope)); + }; + Liquid.prototype.registerFilter = function (name, filter) { + this.filters[name] = filter; + }; + Liquid.prototype.registerTag = function (name, tag) { + this.tags[name] = isFunction(tag) ? tag : createTagClass(tag); + }; + Liquid.prototype.plugin = function (plugin) { + return plugin.call(this, Liquid); + }; + Liquid.prototype.express = function () { + var self = this; // eslint-disable-line + var firstCall = true; + return function (filePath, ctx, callback) { + var _a, _b, _c; + if (firstCall) { + firstCall = false; + var dirs = normalizeDirectoryList(this.root); + (_a = self.options.root).unshift.apply(_a, __spreadArray([], __read(dirs), false)); + (_b = self.options.layouts).unshift.apply(_b, __spreadArray([], __read(dirs), false)); + (_c = self.options.partials).unshift.apply(_c, __spreadArray([], __read(dirs), false)); + } + self.renderFile(filePath, ctx).then(function (html) { return callback(null, html); }, callback); + }; + }; + Liquid.prototype.analyze = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, analyze(template, options)]; + }); + }); + }; + Liquid.prototype.analyzeSync = function (template, options) { + if (options === void 0) { options = {}; } + return analyzeSync(template, options); + }; + Liquid.prototype.parseAndAnalyze = function (html, filename, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, analyze(this.parse(html, filename), options)]; + }); + }); + }; + Liquid.prototype.parseAndAnalyzeSync = function (html, filename, options) { + if (options === void 0) { options = {}; } + return analyzeSync(this.parse(html, filename), options); + }; + /** Return an array of all variables without their properties. */ + Liquid.prototype.variables = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var analysis; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)]; + case 1: + analysis = _a.sent(); + return [2 /*return*/, Object.keys(analysis.variables)]; + } + }); + }); + }; + /** Return an array of all variables without their properties. */ + Liquid.prototype.variablesSync = function (template, options) { + if (options === void 0) { options = {}; } + var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + }; + /** Return an array of all variables including their properties/paths. */ + Liquid.prototype.fullVariables = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var analysis; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)]; + case 1: + analysis = _a.sent(); + return [2 /*return*/, Array.from(new Set(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return String(v); }); })))]; + } + }); + }); + }; + /** Return an array of all variables including their properties/paths. */ + Liquid.prototype.fullVariablesSync = function (template, options) { + if (options === void 0) { options = {}; } + var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return String(v); }); }))); + }; + /** Return an array of all variables, each as an array of properties/segments. */ + Liquid.prototype.variableSegments = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var analysis; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)]; + case 1: + analysis = _a.sent(); + return [2 /*return*/, Array.from(strictUniq(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); })))]; + } + }); + }); + }; + /** Return an array of all variables, each as an array of properties/segments. */ + Liquid.prototype.variableSegmentsSync = function (template, options) { + if (options === void 0) { options = {}; } + var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); }))); + }; + /** Return an array of all expected context variables without their properties. */ + Liquid.prototype.globalVariables = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var analysis; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)]; + case 1: + analysis = _a.sent(); + return [2 /*return*/, Object.keys(analysis.globals)]; + } + }); + }); + }; + /** Return an array of all expected context variables without their properties. */ + Liquid.prototype.globalVariablesSync = function (template, options) { + if (options === void 0) { options = {}; } + var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + }; + /** Return an array of all expected context variables including their properties/paths. */ + Liquid.prototype.globalFullVariables = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var analysis; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)]; + case 1: + analysis = _a.sent(); + return [2 /*return*/, Array.from(new Set(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return String(v); }); })))]; + } + }); + }); + }; + /** Return an array of all expected context variables including their properties/paths. */ + Liquid.prototype.globalFullVariablesSync = function (template, options) { + if (options === void 0) { options = {}; } + var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return String(v); }); }))); + }; + /** Return an array of all expected context variables, each as an array of properties/segments. */ + Liquid.prototype.globalVariableSegments = function (template, options) { + if (options === void 0) { options = {}; } + return __awaiter(this, void 0, void 0, function () { + var analysis; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)]; + case 1: + analysis = _a.sent(); + return [2 /*return*/, Array.from(strictUniq(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); })))]; + } + }); + }); + }; + /** Return an array of all expected context variables, each as an array of properties/segments. */ + Liquid.prototype.globalVariableSegmentsSync = function (template, options) { + if (options === void 0) { options = {}; } + var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); }))); + }; + return Liquid; + }()); + + /* istanbul ignore file */ + var version = '10.27.0'; + + exports.AssertionError = AssertionError; + exports.AssignTag = default_1; + exports.BlockTag = default_1$c; + exports.BreakTag = default_1$g; + exports.CaptureTag = default_1$2; + exports.CaseTag = default_1$3; + exports.CommentTag = default_1$4; + exports.Context = Context; + exports.ContinueTag = default_1$h; + exports.CycleTag = default_1$8; + exports.DecrementTag = default_1$7; + exports.Drop = Drop; + exports.EchoTag = default_1$i; + exports.Expression = Expression; + exports.Filter = Filter; + exports.ForTag = default_1$1; + exports.Hash = Hash; + exports.IfTag = default_1$9; + exports.IncludeTag = default_1$6; + exports.IncrementTag = default_1$a; + exports.InlineCommentTag = default_1$k; + exports.LayoutTag = default_1$b; + exports.Liquid = Liquid; + exports.LiquidError = LiquidError; + exports.LiquidTag = default_1$j; + exports.Output = Output; + exports.ParseError = ParseError; + exports.ParseStream = ParseStream; + exports.Parser = Parser; + exports.RawTag = default_1$d; + exports.RenderError = RenderError; + exports.RenderTag = default_1$5; + exports.TablerowTag = default_1$e; + exports.Tag = Tag; + exports.TagToken = TagToken; + exports.Token = Token; + exports.TokenizationError = TokenizationError; + exports.Tokenizer = Tokenizer; + exports.TypeGuards = typeGuards; + exports.UndefinedVariableError = UndefinedVariableError; + exports.UnlessTag = default_1$f; + exports.Value = Value; + exports.Variable = Variable; + exports.analyze = analyze; + exports.analyzeSync = analyzeSync; + exports.assert = assert; + exports.createTrie = createTrie; + exports.defaultOperators = defaultOperators; + exports.defaultOptions = defaultOptions; + exports.evalQuotedToken = evalQuotedToken; + exports.evalToken = evalToken; + exports.filters = filters; + exports.isFalsy = isFalsy; + exports.isTruthy = isTruthy; + exports.tags = tags; + exports.toPromise = toPromise; + exports.toValue = toValue; + exports.toValueSync = toValueSync; + exports.version = version; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=liquid.browser.umd.js.map diff --git a/node_modules/liquidjs/dist/liquid.browser.umd.js.map b/node_modules/liquidjs/dist/liquid.browser.umd.js.map new file mode 100644 index 0000000..b01f990 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"liquid.browser.umd.js","sources":["../src/tokens/token.ts","../src/drop/drop.ts","../src/util/underscore.ts","../src/util/error.ts","../src/util/character.ts","../src/util/assert.ts","../src/drop/null-drop.ts","../src/drop/empty-drop.ts","../src/drop/blank-drop.ts","../src/drop/forloop-drop.ts","../src/emitters/simple-emitter.ts","../src/build/streamed-emitter-browser.ts","../src/emitters/keeping-type-emitter.ts","../src/drop/block-drop.ts","../src/drop/comparable.ts","../src/util/literal.ts","../src/util/operator-trie.ts","../src/util/async.ts","../src/util/strftime.ts","../src/util/intl.ts","../src/util/liquid-date.ts","../src/util/limiter.ts","../src/tokens/delimited-token.ts","../src/tokens/tag-token.ts","../src/tokens/output-token.ts","../src/tokens/html-token.ts","../src/tokens/number-token.ts","../src/tokens/identifier-token.ts","../src/tokens/literal-token.ts","../src/tokens/operator-token.ts","../src/tokens/property-access-token.ts","../src/tokens/filter-token.ts","../src/tokens/hash-token.ts","../src/render/string.ts","../src/tokens/quoted-token.ts","../src/tokens/range-token.ts","../src/tokens/liquid-tag-token.ts","../src/tokens/filtered-value-token.ts","../src/util/performance.ts","../src/render/render.ts","../src/render/expression.ts","../src/render/boolean.ts","../src/render/operator.ts","../src/cache/lru.ts","../src/build/fs-impl-browser.ts","../src/filters/misc.ts","../src/filters/html.ts","../src/fs/map-fs.ts","../src/liquid-options.ts","../src/parser/whitespace-ctrl.ts","../src/parser/tokenizer.ts","../src/parser/parse-stream.ts","../src/template/template-impl.ts","../src/template/tag.ts","../src/template/hash.ts","../src/template/tag-options-adapter.ts","../src/parser/filter-arg.ts","../src/template/filter.ts","../src/template/value.ts","../src/template/output.ts","../src/template/html.ts","../src/template/analysis.ts","../src/fs/loader.ts","../src/parser/parser.ts","../src/parser/token-kind.ts","../src/util/type-guards.ts","../src/context/scope.ts","../src/context/context.ts","../src/context/block-mode.ts","../src/filters/math.ts","../src/filters/url.ts","../src/filters/array.ts","../src/filters/date.ts","../src/filters/string.ts","../src/build/base64-impl-browser.ts","../src/filters/base64.ts","../src/build/crypto-impl-browser.ts","../src/filters/crypto.ts","../src/filters/index.ts","../src/tags/assign.ts","../src/tags/for.ts","../src/tags/capture.ts","../src/tags/case.ts","../src/tags/comment.ts","../src/tags/render.ts","../src/tags/include.ts","../src/tags/decrement.ts","../src/tags/cycle.ts","../src/tags/if.ts","../src/tags/increment.ts","../src/tags/layout.ts","../src/tags/block.ts","../src/tags/raw.ts","../src/drop/tablerowloop-drop.ts","../src/tags/tablerow.ts","../src/tags/unless.ts","../src/tags/break.ts","../src/tags/continue.ts","../src/tags/echo.ts","../src/tags/liquid.ts","../src/tags/inline-comment.ts","../src/tags/index.ts","../src/liquid.ts","../src/index.ts"],"sourcesContent":["import { TokenKind } from '../parser'\n\nexport abstract class Token {\n public constructor (\n public kind: TokenKind,\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {}\n public getText () {\n return this.input.slice(this.begin, this.end)\n }\n public getPosition () {\n let [row, col] = [1, 1]\n for (let i = 0; i < this.begin; i++) {\n if (this.input[i] === '\\n') {\n row++\n col = 1\n } else col++\n }\n return [row, col]\n }\n public size () {\n return this.end - this.begin\n }\n}\n","import { Context } from '../context'\n\nexport abstract class Drop {\n public liquidMethodMissing (key: string | number, context: Context): Promise | any {\n return undefined\n }\n}\n","import { Drop } from '../drop/drop'\n\nexport const toString = Object.prototype.toString\nconst toLowerCase = String.prototype.toLowerCase\n\nexport const hasOwnProperty = Object.hasOwnProperty\n\nexport function isString (value: any): value is string {\n return typeof value === 'string'\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function isPromise (val: any): val is Promise {\n return val && isFunction(val.then)\n}\n\nexport function isIterator (val: any): val is IterableIterator {\n return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return)\n}\n\nexport function promisify (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise;\nexport function promisify (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise;\nexport function promisify (fn: any) {\n return function (...args: any[]) {\n return new Promise((resolve, reject) => {\n fn(...args, (err: Error, result: any) => {\n err ? reject(err) : resolve(result)\n })\n })\n }\n}\n\nexport function stringify (value: any): string {\n value = toValue(value)\n if (isString(value)) return value\n if (isNil(value)) return ''\n if (isArray(value)) return value.map(x => stringify(x)).join('')\n return String(value)\n}\n\nexport function toEnumerable (val: any): T[] {\n val = toValue(val)\n if (isArray(val)) return val\n if (isString(val) && val.length > 0) return [val] as unknown as T[]\n if (isIterable(val)) return Array.from(val)\n if (isObject(val)) return Object.keys(val).map((key) => [key, val[key]]) as unknown as T[]\n return []\n}\n\nexport function toArray (val: any) {\n val = toValue(val)\n if (isNil(val)) return []\n if (isArray(val)) return val\n return [ val ]\n}\n\nexport function toValue (value: any): any {\n return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value\n}\n\nexport function toNumber (value: any): number {\n return +toValue(value) || 0\n}\n\nexport function isNumber (value: any): value is number {\n return typeof value === 'number'\n}\n\nexport function toLiquid (value: any): any {\n if (value && isFunction(value.toLiquid)) return toLiquid(value.toLiquid())\n return value\n}\n\nexport function isNil (value: any): boolean {\n return value == null\n}\n\nexport function isUndefined (value: any): boolean {\n return value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toString.call(value) === '[object Array]'\n}\n\nexport function isArrayLike (value: any): value is any[] {\n return value && isNumber(value.length)\n}\n\nexport function isIterable (value: any): value is Iterable {\n return isObject(value) && Symbol.iterator in value\n}\n\n/*\n * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.\n * The iteratee is invoked with three arguments: (value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning false.\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @return {Object} Returns object.\n */\nexport function forOwn (\n obj: Record | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n obj = obj || {}\n for (const k in obj) {\n if (hasOwnProperty.call(obj, k)) {\n if (iteratee(obj[k], k, obj) === false) break\n }\n }\n return obj\n}\n\nexport function last (arr: T[]): T;\nexport function last (arr: string): string;\nexport function last (arr: any[] | string): any | string {\n return arr[arr.length - 1]\n}\n\n/*\n * Checks if value is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is an object, else false.\n */\nexport function isObject (value: any): value is object {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nexport function range (start: number, stop: number, step = 1) {\n const arr: number[] = []\n for (let i = start; i < stop; i += step) {\n arr.push(i)\n }\n return arr\n}\n\nexport function padStart (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => ch + str)\n}\n\nexport function padEnd (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => str + ch)\n}\n\nexport function pad (str: any, length: number, ch: string, add: (str: string, ch: string) => string) {\n str = String(str)\n const n = length - str.length\n if (n <= 0) return str\n return add(str, ch.repeat(n))\n}\n\nexport function identify (val: T): T {\n return val\n}\n\nexport function changeCase (str: string): string {\n const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z')\n return hasLowerCase ? str.toUpperCase() : str.toLowerCase()\n}\n\nexport function ellipsis (str: string, N: number): string {\n return str.length > N ? str.slice(0, N - 3) + '...' : str\n}\n\nexport function orderedCompare (a: any, b: any) {\n if (isNil(a) && isNil(b)) return 0\n if (isNil(a)) return 1\n if (isNil(b)) return -1\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\n// compare string in case-insensitive way, undefined values to the tail\nexport function caseInsensitiveCompare (a: any, b: any) {\n if (isNil(a) && isNil(b)) return 0\n if (isNil(a)) return 1\n if (isNil(b)) return -1\n a = toLowerCase.call(a)\n b = toLowerCase.call(b)\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\nexport function argumentsToValue any, T> (fn: F) {\n return function (this: T, ...args: Parameters) { return fn.call(this, ...args.map(toValue)) }\n}\n\nexport function argumentsToNumber any, T> (fn: F) {\n return function (this: T, ...args: Parameters) { return fn.call(this, ...args.map(toNumber)) }\n}\n\nexport function escapeRegExp (text: string) {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\n/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */\nexport function * strictUniq (array: Array): Generator {\n const seen = new Set()\n\n for (const element of array) {\n const key = JSON.stringify(element)\n if (!seen.has(key)) {\n seen.add(key)\n yield element\n }\n }\n}\n","import * as _ from './underscore'\nimport { Token } from '../tokens/token'\nimport { Template } from '../template/template'\n\n/**\n * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes\n */\nconst TRAIT = '__liquidClass__'\n\nexport abstract class LiquidError extends Error {\n public token!: Token\n public context = ''\n public originalError?: Error\n public constructor (err: Error | string, token: Token) {\n /**\n * note: for ES5 targeting, `this` will be replaced by return value of Error(),\n * thus everything on `this` will be lost, avoid calling `LiquidError` methods here\n */\n super(typeof err === 'string' ? err : err.message)\n if (typeof err !== 'string') Object.defineProperty(this, 'originalError', { value: err, enumerable: false })\n Object.defineProperty(this, 'token', { value: token, enumerable: false })\n Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false })\n }\n protected update () {\n Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false })\n this.message = mkMessage(this.message, this.token)\n this.stack = this.message + '\\n' + this.context +\n '\\n' + this.stack\n if (this.originalError) this.stack += '\\nFrom ' + this.originalError.stack\n }\n static is (obj: unknown): obj is LiquidError {\n return obj?.[TRAIT] === 'LiquidError'\n }\n}\n\nexport class TokenizationError extends LiquidError {\n public constructor (message: string, token: Token) {\n super(message, token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'ParseError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderError extends LiquidError {\n public constructor (err: Error, tpl: Template) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n public static is (obj: any): obj is RenderError {\n return obj.name === 'RenderError'\n }\n}\n\nexport class LiquidErrors extends LiquidError {\n public constructor (public errors: RenderError[]) {\n super(errors[0], errors[0].token)\n this.name = 'LiquidErrors'\n const s = errors.length > 1 ? 's' : ''\n this.message = `${errors.length} error${s} found`\n super.update()\n }\n public static is (obj: any): obj is LiquidErrors {\n return obj.name === 'LiquidErrors'\n }\n}\n\nexport class UndefinedVariableError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'UndefinedVariableError'\n this.message = err.message\n super.update()\n }\n}\n\n// only used internally; raised where we don't have token information,\n// so it can't be an UndefinedVariableError.\nexport class InternalUndefinedVariableError extends Error {\n variableName: string\n\n public constructor (variableName: string) {\n super(`undefined variable: ${variableName}`)\n this.name = 'InternalUndefinedVariableError'\n this.variableName = variableName\n }\n}\n\nexport class AssertionError extends Error {\n public constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const [line, col] = token.getPosition()\n const lines = token.input.split('\\n')\n const begin = Math.max(line - 2, 1)\n const end = Math.min(line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const rowIndicator = (lineNumber === line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n let text = `${rowIndicator}${num}| `\n\n const colIndicator = lineNumber === line\n ? '\\n' + _.padStart('^', col + text.length)\n : ''\n\n text += lines[lineNumber - 1]\n text += colIndicator\n return text\n })\n .join('\\n')\n\n return context\n}\n\nfunction mkMessage (msg: string, token: Token) {\n if (token.file) msg += `, file:${token.file}`\n const [line, col] = token.getPosition()\n msg += `, line:${line}, col:${col}`\n return msg\n}\n","// **DO NOT CHANGE THIS FILE**\n//\n// This file is generated by bin/character-gen.js\n// bitmask character types to boost performance\nexport const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]\nexport const WORD = 1\nexport const OPERATOR = 2\nexport const BLANK = 4\nexport const QUOTE = 8\nexport const INLINE_BLANK = 16\nexport const NUMBER = 32\nexport const SIGN = 64\nexport const PUNCTUATION = 128\n\nexport function isWord (char: string): boolean {\n const code = char.charCodeAt(0)\n return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD)\n}\nTYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK\nTYPES[8220] = TYPES[8221] = PUNCTUATION\n","import { AssertionError } from './error'\n\nexport function assert (predicate: T | null | undefined, message?: string | (() => string)) {\n if (!predicate) {\n const msg = typeof message === 'function'\n ? message()\n : (message || `expect ${predicate} to be true`)\n throw new AssertionError(msg)\n }\n}\n\nexport function assertEmpty (predicate: T | null | undefined, message = `unexpected ${JSON.stringify(predicate)}`) {\n assert(!predicate, message)\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isNil, toValue } from '../util'\n\nexport class NullDrop extends Drop implements Comparable {\n public equals (value: any) {\n return isNil(toValue(value))\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return null\n }\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isObject, isString, isArray, toValue } from '../util'\n\nexport class EmptyDrop extends Drop implements Comparable {\n public equals (value: any) {\n if (value instanceof EmptyDrop) return false\n value = toValue(value)\n if (isString(value) || isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return ''\n }\n static is (value: unknown) {\n return value instanceof EmptyDrop\n }\n}\n","import { isNil, isString, toValue } from '../util'\nimport { EmptyDrop } from '../drop'\n\nexport class BlankDrop extends EmptyDrop {\n public equals (value: any) {\n if (value === false) return true\n if (isNil(toValue(value))) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n static is (value: unknown) {\n return value instanceof BlankDrop\n }\n}\n","import { Drop } from './drop'\n\nexport class ForloopDrop extends Drop {\n protected i = 0\n public name: string\n public length: number\n public constructor (length: number, collection: string, variable: string) {\n super()\n this.length = length\n this.name = `${variable}-${collection}`\n }\n public next () {\n this.i++\n }\n public index0 () {\n return this.i\n }\n public index () {\n return this.i + 1\n }\n public first () {\n return this.i === 0\n }\n public last () {\n return this.i === this.length - 1\n }\n public rindex () {\n return this.length - this.i\n }\n public rindex0 () {\n return this.length - this.i - 1\n }\n public valueOf () {\n return JSON.stringify(this)\n }\n}\n","import { stringify } from '../util'\nimport { Emitter } from './emitter'\n\nexport class SimpleEmitter implements Emitter {\n public buffer = '';\n\n public write (html: any) {\n this.buffer += stringify(html)\n }\n}\n","import { Emitter } from '../emitters'\n\nexport class StreamedEmitter implements Emitter {\n public buffer = '';\n public stream: NodeJS.ReadableStream = null as any\n constructor () {\n throw new Error('streaming not supported in browser')\n }\n public write: (html: any) => void\n public error: (err: Error) => void\n public end: () => void\n}\n","import { stringify, toValue } from '../util'\nimport { Emitter } from './emitter'\n\nexport class KeepingTypeEmitter implements Emitter {\n public buffer: any = '';\n\n public write (html: any) {\n html = toValue(html)\n // This will only preserve the type if the value is isolated.\n // I.E:\n // {{ my-port }} -> 42\n // {{ my-host }}:{{ my-port }} -> 'host:42'\n if (typeof html !== 'string' && this.buffer === '') {\n this.buffer = html\n } else {\n this.buffer = stringify(this.buffer) + stringify(html)\n }\n }\n}\n","import { Emitter, SimpleEmitter } from '../emitters'\nimport { Drop } from './drop'\n\nexport class BlockDrop extends Drop {\n constructor (\n // the block render from layout template\n private superBlockRender: (emitter: Emitter) => IterableIterator | string = () => ''\n ) {\n super()\n }\n /**\n * Provide parent access in child block by\n * {{ block.super }}\n */\n public * super (): IterableIterator {\n const emitter = new SimpleEmitter()\n yield this.superBlockRender(emitter)\n return emitter.buffer\n }\n}\n","import { isFunction } from '../util'\n\nexport interface Comparable {\n equals: (rhs: any) => boolean;\n gt: (rhs: any) => boolean;\n geq: (rhs: any) => boolean;\n lt: (rhs: any) => boolean;\n leq: (rhs: any) => boolean;\n}\n\nexport function isComparable (arg: any): arg is Comparable {\n return (\n arg &&\n isFunction(arg.equals) &&\n isFunction(arg.gt) &&\n isFunction(arg.geq) &&\n isFunction(arg.lt) &&\n isFunction(arg.leq)\n )\n}\n","import { BlankDrop, EmptyDrop, NullDrop } from '../drop'\n\nconst nil = new NullDrop()\nexport const literalValues = {\n 'true': true,\n 'false': false,\n 'nil': nil,\n 'null': nil,\n 'empty': new EmptyDrop(),\n 'blank': new BlankDrop()\n}\n\nexport type LiteralKey = keyof typeof literalValues\nexport type LiteralValue = typeof literalValues[LiteralKey]\n","import { isWord } from '../util/character'\n\ninterface TrieInput {\n [key: string]: T\n}\n\ninterface TrieLeafNode {\n data: T;\n end: true;\n needBoundary?: true;\n}\n\nexport interface Trie {\n [key: string]: Trie | TrieLeafNode;\n}\n\nexport type TrieNode = Trie | TrieLeafNode\n\nexport function createTrie (input: TrieInput): Trie {\n const trie: Trie = {}\n for (const [name, data] of Object.entries(input)) {\n let node: Trie | TrieLeafNode = trie\n\n for (let i = 0; i < name.length; i++) {\n const c = name[i]\n node[c] = node[c] || {}\n\n if (i === name.length - 1 && isWord(name[i])) {\n node[c].needBoundary = true\n }\n\n node = node[c]\n }\n\n node.data = data\n node.end = true\n }\n return trie\n}\n","import { isPromise, isIterator } from './underscore'\n\nexport type LiquidAsync any> =\n (sync: boolean, ...args: Parameters) => ReturnType | Promise>\n\nexport function toLiquidAsync any> (\n asyncFn: (...args: Parameters) => Promise>,\n syncFn?: F\n): LiquidAsync {\n const syncImpl = syncFn || asyncFn as any\n return (sync: boolean, ...args: any[]) => {\n return sync ? syncImpl(...args as Parameters) : asyncFn(...args as Parameters)\n }\n}\n\n// convert an async iterator to a Promise\nexport async function toPromise (val: Generator | Promise | T): Promise {\n if (!isIterator(val)) return val\n let value: unknown\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n try {\n if (isIterator(value)) value = toPromise(value)\n if (isPromise(value)) value = await value\n } catch (err) {\n next = 'throw'\n value = err\n }\n } while (!done)\n return value as T\n}\n\n// convert an async iterator to a value in a synchronous manner\nexport function toValueSync (val: Generator | T): T {\n if (!isIterator(val)) return val\n let value: any\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n if (isIterator(value)) {\n try {\n value = toValueSync(value)\n } catch (err) {\n next = 'throw'\n value = err\n }\n }\n } while (!done)\n return value\n}\n","import { changeCase, padStart, padEnd } from './underscore'\nimport { LiquidDate } from './liquid-date'\nimport type { Limiter } from './limiter'\n\nconst rFormat = /%([-_0^#:]+)?(\\d+)?([EO])?(.)/\ninterface FormatOptions {\n flags: object;\n width?: string;\n modifier?: string;\n memoryLimit?: Pick;\n}\n\n// prototype extensions\nfunction daysInMonth (d: LiquidDate) {\n const feb = isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n}\nfunction getDayOfYear (d: LiquidDate) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += daysInMonth(d)[i]\n }\n return num + d.getDate()\n}\nfunction getWeekOfYear (d: LiquidDate, startDay: number) {\n // Skip to startDay of this week\n const now = getDayOfYear(d) + (startDay - d.getDay())\n // Find the first startDay of the year\n const jan1 = new Date(d.getFullYear(), 0, 1)\n const then = (7 - jan1.getDay() + startDay)\n return String(Math.floor((now - then) / 7) + 1)\n}\nfunction isLeapYear (d: LiquidDate) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n}\nfunction ordinal (d: LiquidDate) {\n const date = d.getDate()\n if ([11, 12, 13].includes(date)) return 'th'\n\n switch (date % 10) {\n case 1: return 'st'\n case 2: return 'nd'\n case 3: return 'rd'\n default: return 'th'\n }\n}\nfunction century (d: LiquidDate) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n}\n\n// default to 0\nconst padWidths = {\n d: 2,\n e: 2,\n H: 2,\n I: 2,\n j: 3,\n k: 2,\n l: 2,\n L: 3,\n m: 2,\n M: 2,\n S: 2,\n U: 2,\n W: 2\n}\n\nconst padSpaceChars = new Set('aAbBceklpP')\n\nfunction getTimezoneOffset (d: LiquidDate, opts: FormatOptions) {\n const nOffset = Math.abs(d.getTimezoneOffset())\n const h = Math.floor(nOffset / 60)\n const m = nOffset % 60\n return (d.getTimezoneOffset() > 0 ? '-' : '+') +\n padStart(h, 2, '0') +\n (opts.flags[':'] ? ':' : '') +\n padStart(m, 2, '0')\n}\nconst formatCodes = {\n a: (d: LiquidDate) => d.getShortWeekdayName(),\n A: (d: LiquidDate) => d.getLongWeekdayName(),\n b: (d: LiquidDate) => d.getShortMonthName(),\n B: (d: LiquidDate) => d.getLongMonthName(),\n c: (d: LiquidDate) => d.toLocaleString(),\n C: (d: LiquidDate) => century(d),\n d: (d: LiquidDate) => d.getDate(),\n e: (d: LiquidDate) => d.getDate(),\n H: (d: LiquidDate) => d.getHours(),\n I: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n j: (d: LiquidDate) => getDayOfYear(d),\n k: (d: LiquidDate) => d.getHours(),\n l: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n L: (d: LiquidDate) => d.getMilliseconds(),\n m: (d: LiquidDate) => d.getMonth() + 1,\n M: (d: LiquidDate) => d.getMinutes(),\n N: (d: LiquidDate, opts: FormatOptions) => {\n const width = Number(opts.width) || 9\n const str = String(d.getMilliseconds()).slice(0, width)\n opts.memoryLimit?.use(width - str.length)\n return padEnd(str, width, '0')\n },\n p: (d: LiquidDate) => (d.getHours() < 12 ? 'AM' : 'PM'),\n P: (d: LiquidDate) => (d.getHours() < 12 ? 'am' : 'pm'),\n q: (d: LiquidDate) => ordinal(d),\n s: (d: LiquidDate) => Math.round(d.getTime() / 1000),\n S: (d: LiquidDate) => d.getSeconds(),\n u: (d: LiquidDate) => d.getDay() || 7,\n U: (d: LiquidDate) => getWeekOfYear(d, 0),\n w: (d: LiquidDate) => d.getDay(),\n W: (d: LiquidDate) => getWeekOfYear(d, 1),\n x: (d: LiquidDate) => d.toLocaleDateString(),\n X: (d: LiquidDate) => d.toLocaleTimeString(),\n y: (d: LiquidDate) => d.getFullYear().toString().slice(2, 4),\n Y: (d: LiquidDate) => d.getFullYear(),\n z: getTimezoneOffset,\n Z: (d: LiquidDate, opts: FormatOptions) => d.getTimeZoneName() || getTimezoneOffset(d, opts),\n 't': () => '\\t',\n 'n': () => '\\n',\n '%': () => '%'\n};\n(formatCodes as any).h = formatCodes.b\n\nexport function strftime (d: LiquidDate, formatStr: string, memoryLimit?: Pick) {\n let output = ''\n let remaining = formatStr\n let match\n while ((match = rFormat.exec(remaining))) {\n output += remaining.slice(0, match.index)\n remaining = remaining.slice(match.index + match[0].length)\n output += format(d, match, memoryLimit)\n }\n return output + remaining\n}\n\nfunction format (d: LiquidDate, match: RegExpExecArray, memoryLimit?: Pick) {\n const [input, flagStr = '', width, modifier, conversion] = match\n const convert = formatCodes[conversion]\n if (!convert) return input\n const flags = {}\n for (const flag of flagStr) flags[flag] = true\n let ret = String(convert(d, { flags, width, modifier, memoryLimit }))\n let padChar = padSpaceChars.has(conversion) ? ' ' : '0'\n let padWidth = width || padWidths[conversion] || 0\n if (flags['^']) ret = ret.toUpperCase()\n else if (flags['#']) ret = changeCase(ret)\n if (flags['_']) padChar = ' '\n else if (flags['0']) padChar = '0'\n if (flags['-']) padWidth = 0\n memoryLimit?.use(Number(padWidth) - ret.length)\n return padStart(ret, padWidth, padChar)\n}\n","export function getDateTimeFormat () {\n return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined)\n}\n","import { getDateTimeFormat } from './intl'\nimport { isString } from './underscore'\n\n// one minute in milliseconds\nconst OneMinute = 60000\n/**\n * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS\n * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3\n */\nconst TIMEZONE_PATTERN = /([zZ]|([+-])(\\d{2}):?(\\d{2}))$/\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst monthNamesShort = monthNames.map(name => name.slice(0, 3))\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst dayNamesShort = dayNames.map(name => name.slice(0, 3))\n\n/**\n * A date implementation with timezone info, just like Ruby date\n *\n * Implementation:\n * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods\n * - rewrite getTimezoneOffset() to trick strftime\n */\nexport class LiquidDate {\n private timezoneOffset: number\n private timezoneName: string\n private date: Date\n private displayDate: Date\n private DateTimeFormat = getDateTimeFormat()\n public timezoneFixed: boolean\n constructor (\n init: string | number | Date,\n private locale: string,\n timezone?: number | string\n ) {\n this.date = new Date(init)\n this.timezoneFixed = timezone !== undefined\n if (timezone === undefined) {\n timezone = this.date.getTimezoneOffset()\n }\n this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone\n this.timezoneName = isString(timezone) ? timezone : ''\n\n const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute\n const time = this.date.getTime() + diff\n this.displayDate = new Date(time)\n }\n\n getTime () {\n return this.displayDate.getTime()\n }\n getMilliseconds () {\n return this.displayDate.getMilliseconds()\n }\n getSeconds () {\n return this.displayDate.getSeconds()\n }\n getMinutes () {\n return this.displayDate.getMinutes()\n }\n getHours () {\n return this.displayDate.getHours()\n }\n getDay () {\n return this.displayDate.getDay()\n }\n getDate () {\n return this.displayDate.getDate()\n }\n getMonth () {\n return this.displayDate.getMonth()\n }\n getFullYear () {\n return this.displayDate.getFullYear()\n }\n toLocaleString (locale?: string, init?: any) {\n if (init?.timeZone) {\n return this.date.toLocaleString(locale, init)\n }\n return this.displayDate.toLocaleString(locale, init)\n }\n toLocaleTimeString (locale?: string) {\n return this.displayDate.toLocaleTimeString(locale)\n }\n toLocaleDateString (locale?: string) {\n return this.displayDate.toLocaleDateString(locale)\n }\n getTimezoneOffset () {\n return this.timezoneOffset!\n }\n getTimeZoneName () {\n if (this.timezoneFixed) return this.timezoneName\n if (!this.DateTimeFormat) return\n return this.DateTimeFormat().resolvedOptions().timeZone\n }\n getLongMonthName () {\n return this.format({ month: 'long' }) ?? monthNames[this.getMonth()]\n }\n getShortMonthName () {\n return this.format({ month: 'short' }) ?? monthNamesShort[this.getMonth()]\n }\n getLongWeekdayName () {\n return this.format({ weekday: 'long' }) ?? dayNames[this.displayDate.getDay()]\n }\n getShortWeekdayName () {\n return this.format({ weekday: 'short' }) ?? dayNamesShort[this.displayDate.getDay()]\n }\n valid () {\n return !isNaN(this.getTime())\n }\n private format (options: Intl.DateTimeFormatOptions) {\n return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate)\n }\n\n /**\n * Create a Date object fixed to it's declared Timezone. Both\n * - 2021-08-06T02:29:00.000Z and\n * - 2021-08-06T02:29:00.000+08:00\n * will always be displayed as\n * - 2021-08-06 02:29:00\n * regardless timezoneOffset in JavaScript realm\n *\n * The implementation hack:\n * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,\n * we create a different Date to trick strftime, it's both simpler and more performant.\n * Given that a template is expected to be parsed fewer times than rendered.\n */\n static createDateFixedToTimezone (dateString: string, locale: string): LiquidDate {\n const m = dateString.match(TIMEZONE_PATTERN)\n // representing a UTC timestamp\n if (m && m[1] === 'Z') {\n return new LiquidDate(+new Date(dateString), locale, 0)\n }\n // has a timezone specified\n if (m && m[2] && m[3] && m[4]) {\n const [, , sign, hours, minutes] = m\n const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10))\n return new LiquidDate(+new Date(dateString), locale, offset)\n }\n return new LiquidDate(dateString, locale)\n }\n private static getTimezoneOffset (timezoneName: string, date: Date) {\n const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName })\n const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' })\n\n const localDate = new Date(localDateString)\n const utcDate = new Date(utcDateString)\n return (+utcDate - +localDate) / (60 * 1000)\n }\n}\n","import { assert } from './assert'\n\nexport class Limiter {\n private message: string\n private base = 0\n private limit: number\n constructor (resource: string, limit: number) {\n this.message = `${resource} limit exceeded`\n this.limit = limit\n }\n use (count: number) {\n if (+count > 0) {\n assert(this.base + +count <= this.limit, this.message)\n this.base += +count\n }\n }\n check (count: number) {\n if (+count > 0) {\n assert(+count <= this.limit, this.message)\n }\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { TYPES, BLANK } from '../util'\n\nexport abstract class DelimitedToken extends Token {\n public trimLeft = false\n public trimRight = false\n public contentRange: [number, number]\n public constructor (\n kind: TokenKind,\n [contentBegin, contentEnd]: [number, number],\n input: string,\n begin: number,\n end: number,\n trimLeft: boolean,\n trimRight: boolean,\n file?: string\n ) {\n super(kind, input, begin, end, file)\n const tl = input[contentBegin] === '-'\n const tr = input[contentEnd - 1] === '-'\n\n let l = tl ? contentBegin + 1 : contentBegin\n let r = tr ? contentEnd - 1 : contentEnd\n while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) l++\n while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) r--\n\n this.contentRange = [l, r]\n this.trimLeft = tl || trimLeft\n this.trimRight = tr || trimRight\n }\n get content () {\n return this.input.slice(this.contentRange[0], this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { Tokenizer, TokenKind } from '../parser'\nimport type { NormalizedFullOptions } from '../liquid-options'\n\nexport class TagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public readonly args: string;\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options\n const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]\n super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file)\n\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`)\n this.tokenizer.skipBlank()\n this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser'\n\nexport class OutputToken extends DelimitedToken {\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options\n const valueRange: [number, number] = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]\n super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class HTMLToken extends Token {\n trimLeft = 0\n trimRight = 0\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.HTML, input, begin, end, file)\n }\n public getContent () {\n return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class NumberToken extends Token {\n public content: number\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Number, input, begin, end, file)\n this.content = Number(this.getText())\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class IdentifierToken extends Token {\n public content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Word, input, begin, end, file)\n this.content = this.getText()\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { literalValues, LiteralValue } from '../util'\n\nexport class LiteralToken extends Token {\n public content: LiteralValue\n public literal: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Literal, input, begin, end, file)\n this.literal = this.getText()\n this.content = literalValues[this.literal]\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport const enum OperatorType {\n Binary,\n Unary\n}\n\nexport const operatorPrecedences = {\n '==': 2,\n '!=': 2,\n '>': 2,\n '<': 2,\n '>=': 2,\n '<=': 2,\n 'contains': 2,\n 'not': 1,\n 'and': 0,\n 'or': 0\n}\n\nexport const operatorTypes = {\n '==': OperatorType.Binary,\n '!=': OperatorType.Binary,\n '>': OperatorType.Binary,\n '<': OperatorType.Binary,\n '>=': OperatorType.Binary,\n '<=': OperatorType.Binary,\n 'contains': OperatorType.Binary,\n 'not': OperatorType.Unary,\n 'and': OperatorType.Binary,\n 'or': OperatorType.Binary\n}\n\nexport class OperatorToken extends Token {\n public operator: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Operator, input, begin, end, file)\n this.operator = this.getText()\n }\n getPrecedence () {\n const key = this.getText()\n return key in operatorPrecedences ? operatorPrecedences[key] : 1\n }\n}\n","import { Token } from './token'\nimport { LiteralToken } from './literal-token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { NumberToken } from './number-token'\nimport { RangeToken } from './range-token'\nimport { QuotedToken } from './quoted-token'\nimport { TokenKind } from '../parser'\n\nexport class PropertyAccessToken extends Token {\n constructor (\n public variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined,\n public props: (ValueToken | IdentifierToken)[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.PropertyAccess, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { FilterArg } from '../parser/filter-arg'\nimport { TokenKind } from '../parser'\n\nexport class FilterToken extends Token {\n public constructor (\n public name: string,\n public args: FilterArg[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.Filter, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { TokenKind } from '../parser'\n\nexport class HashToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public name: IdentifierToken,\n public value?: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Hash, input, begin, end, file)\n }\n}\n","const rHex = /[\\da-fA-F]/\nconst rOct = /[0-7]/\nconst escapeChar = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\x0B'\n}\n\nfunction hexVal (c: string) {\n const code = c.charCodeAt(0)\n if (code >= 97) return code - 87\n if (code >= 65) return code - 55\n return code - 48\n}\n\nexport function parseStringLiteral (str: string): string {\n let ret = ''\n for (let i = 1; i < str.length - 1; i++) {\n if (str[i] !== '\\\\') {\n ret += str[i]\n continue\n }\n if (escapeChar[str[i + 1]] !== undefined) {\n ret += escapeChar[str[++i]]\n } else if (str[i + 1] === 'u') {\n let val = 0\n let j = i + 2\n while (j <= i + 5 && rHex.test(str[j])) {\n val = val * 16 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n } else if (!rOct.test(str[i + 1])) {\n ret += str[++i]\n } else {\n let j = i + 1\n let val = 0\n while (j <= i + 3 && rOct.test(str[j])) {\n val = val * 8 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n }\n }\n return ret\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { parseStringLiteral } from '../render/string'\n\nexport class QuotedToken extends Token {\n public readonly content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Quoted, input, begin, end, file)\n this.content = parseStringLiteral(this.getText())\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { TokenKind } from '../parser'\n\nexport class RangeToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public lhs: ValueToken,\n public rhs: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Range, input, begin, end, file)\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { Tokenizer, TokenKind } from '../parser'\n\n/**\n * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`\n */\nexport class LiquidTagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file)\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, 'illegal liquid tag syntax')\n this.tokenizer.skipBlank()\n }\n\n get args (): string {\n return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { Token } from './token'\nimport { FilterToken } from './filter-token'\nimport { TokenKind } from '../parser'\nimport { Expression } from '../render'\n\n/**\n * value expression with optional filters\n * e.g.\n * {% assign foo=\"bar\" | append: \"coo\" %}\n */\nexport class FilteredValueToken extends Token {\n constructor (\n public initial: Expression,\n public filters: FilterToken[],\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.FilteredValue, input, begin, end, file)\n }\n}\n","interface LiquidPerformance {\n now: () => number\n}\n\nconst polyfill: LiquidPerformance = {\n now: () => Date.now()\n}\n\nexport function getPerformance (): LiquidPerformance {\n return (typeof global === 'object' && global.performance) ||\n (typeof window === 'object' && window.performance) ||\n polyfill\n}\n","import { getPerformance } from '../util/performance'\nimport { toPromise, RenderError, LiquidErrors, LiquidError } from '../util'\nimport { Context } from '../context'\nimport { Template } from '../template'\nimport { Emitter, KeepingTypeEmitter, StreamedEmitter, SimpleEmitter } from '../emitters'\n\nexport class Render {\n public renderTemplatesToNodeStream (templates: Template[], ctx: Context): NodeJS.ReadableStream {\n const emitter = new StreamedEmitter()\n Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))\n .then(() => emitter.end(), err => emitter.error(err))\n return emitter.stream\n }\n public * renderTemplates (templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator {\n if (!emitter) {\n emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()\n }\n ctx.renderLimit.check(getPerformance().now())\n const errors = []\n for (const tpl of templates) {\n ctx.renderLimit.check(getPerformance().now())\n try {\n // if tpl.render supports emitter, it'll return empty `html`\n const html = yield tpl.render(ctx, emitter)\n // if not, it'll return an `html`, write to the emitter for it\n html && emitter.write(html)\n if (ctx.breakCalled || ctx.continueCalled) break\n } catch (e) {\n const err = LiquidError.is(e) ? e : new RenderError(e as Error, tpl)\n if (ctx.opts.catchAllErrors) errors.push(err)\n else throw err\n }\n }\n if (errors.length) {\n throw new LiquidErrors(errors)\n }\n return emitter.buffer\n }\n}\n","import { QuotedToken, RangeToken, OperatorToken, Token, PropertyAccessToken, OperatorType, operatorTypes } from '../tokens'\nimport { isRangeToken, isPropertyAccessToken, UndefinedVariableError, range, isOperatorToken, assert } from '../util'\nimport type { Context } from '../context'\nimport type { UnaryOperatorHandler } from '../render'\nimport { Drop } from '../drop'\n\nexport class Expression {\n readonly postfix: Token[]\n\n public constructor (tokens: IterableIterator) {\n this.postfix = [...toPostfix(tokens)]\n }\n public * evaluate (ctx: Context, lenient?: boolean): Generator {\n assert(ctx, 'unable to evaluate: context not defined')\n const operands: any[] = []\n for (const token of this.postfix) {\n if (isOperatorToken(token)) {\n const r = operands.pop()\n let result\n if (operatorTypes[token.operator] === OperatorType.Unary) {\n result = yield (ctx.opts.operators[token.operator] as UnaryOperatorHandler)(r, ctx)\n } else {\n const l = operands.pop()\n result = yield ctx.opts.operators[token.operator](l, r, ctx)\n }\n operands.push(result)\n } else {\n operands.push(yield evalToken(token, ctx, lenient))\n }\n }\n return operands[0]\n }\n public valid () {\n return !!this.postfix.length\n }\n}\n\nexport function * evalToken (token: Token | undefined, ctx: Context, lenient = false): IterableIterator {\n if (!token) return\n if ('content' in token) return token.content\n if (isPropertyAccessToken(token)) return yield evalPropertyAccessToken(token, ctx, lenient)\n if (isRangeToken(token)) return yield evalRangeToken(token, ctx)\n}\n\nfunction * evalPropertyAccessToken (token: PropertyAccessToken, ctx: Context, lenient: boolean): IterableIterator {\n const props: (string | number | Drop)[] = []\n for (const prop of token.props) {\n props.push((yield evalToken(prop, ctx, false)) as unknown as string | number | Drop)\n }\n try {\n if (token.variable) {\n const variable = yield evalToken(token.variable, ctx, lenient)\n return yield ctx._getFromScope(variable, props)\n } else {\n return yield ctx._get(props)\n }\n } catch (e) {\n if (lenient && (e as Error).name === 'InternalUndefinedVariableError') return null\n throw (new UndefinedVariableError(e as Error, token))\n }\n}\n\nexport function evalQuotedToken (token: QuotedToken) {\n return token.content\n}\n\nfunction * evalRangeToken (token: RangeToken, ctx: Context) {\n const low: number = yield evalToken(token.lhs, ctx)\n const high: number = yield evalToken(token.rhs, ctx)\n ctx.memoryLimit.use(high - low + 1)\n return range(+low, +high + 1)\n}\n\nfunction * toPostfix (tokens: IterableIterator): IterableIterator {\n const ops: OperatorToken[] = []\n for (const token of tokens) {\n if (isOperatorToken(token)) {\n while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {\n yield ops.pop()!\n }\n ops.push(token)\n } else yield token\n }\n while (ops.length) {\n yield ops.pop()!\n }\n}\n","import { Context } from '../context/context'\nimport { toValue } from '../util'\n\nexport function isTruthy (val: any, ctx: Context): boolean {\n return !isFalsy(val, ctx)\n}\n\nexport function isFalsy (val: any, ctx: Context): boolean {\n val = toValue(val)\n\n if (ctx.opts.jsTruthy) {\n return !val\n } else {\n return val === false || undefined === val || val === null\n }\n}\n","import { isComparable } from '../drop/comparable'\nimport { Context } from '../context'\nimport { toValue } from '../util'\nimport { isFalsy, isTruthy } from '../render/boolean'\nimport { isArray, isFunction } from '../util/underscore'\n\nexport type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean;\nexport type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean;\nexport type OperatorHandler = UnaryOperatorHandler | BinaryOperatorHandler;\nexport type Operators = Record\n\nexport const defaultOperators: Operators = {\n '==': equals,\n '!=': (l: any, r: any) => !equals(l, r),\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return toValue(l) > toValue(r)\n },\n '<': (l: any, r: any) => {\n if (isComparable(l)) return l.lt(r)\n if (isComparable(r)) return r.gt(l)\n return toValue(l) < toValue(r)\n },\n '>=': (l: any, r: any) => {\n if (isComparable(l)) return l.geq(r)\n if (isComparable(r)) return r.leq(l)\n return toValue(l) >= toValue(r)\n },\n '<=': (l: any, r: any) => {\n if (isComparable(l)) return l.leq(r)\n if (isComparable(r)) return r.geq(l)\n return toValue(l) <= toValue(r)\n },\n 'contains': (l: any, r: any) => {\n l = toValue(l)\n if (isArray(l)) return l.some((i) => equals(i, r))\n if (isFunction(l?.indexOf)) return l.indexOf(toValue(r)) > -1\n return false\n },\n 'not': (v: any, ctx: Context) => isFalsy(toValue(v), ctx),\n 'and': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),\n 'or': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)\n}\n\nexport function equals (lhs: any, rhs: any): boolean {\n if (isComparable(lhs)) return lhs.equals(rhs)\n if (isComparable(rhs)) return rhs.equals(lhs)\n lhs = toValue(lhs)\n rhs = toValue(rhs)\n if (isArray(lhs)) {\n return isArray(rhs) && arrayEquals(lhs, rhs)\n }\n return lhs === rhs\n}\n\nfunction arrayEquals (lhs: any[], rhs: any[]): boolean {\n if (lhs.length !== rhs.length) return false\n return !lhs.some((value, i) => !equals(value, rhs[i]))\n}\n\nexport function arrayIncludes (arr: any[], item: any): boolean {\n return arr.some(value => equals(value, item))\n}\n","import { Cache } from './cache'\n\nclass Node {\n constructor (\n public key: string,\n public value: T,\n public next: Node,\n public prev: Node\n ) {}\n}\n\nexport class LRU implements Cache {\n private cache: Record> = {}\n private head: Node\n private tail: Node\n\n constructor (\n public limit: number,\n public size = 0\n ) {\n this.head = new Node('HEAD', null as any, null as any, null as any)\n this.tail = new Node('TAIL', null as any, null as any, null as any)\n this.head.next = this.tail\n this.tail.prev = this.head\n }\n\n write (key: string, value: T) {\n if (this.cache[key]) {\n this.cache[key].value = value\n } else {\n const node = new Node(key, value, this.head.next, this.head)\n this.head.next.prev = node\n this.head.next = node\n\n this.cache[key] = node\n this.size++\n this.ensureLimit()\n }\n }\n\n read (key: string): T | undefined {\n if (!this.cache[key]) return\n const { value } = this.cache[key]\n this.remove(key)\n this.write(key, value)\n return value\n }\n\n remove (key: string) {\n const node = this.cache[key]\n node.prev.next = node.next\n node.next.prev = node.prev\n delete this.cache[key]\n this.size--\n }\n\n clear () {\n this.head.next = this.tail\n this.tail.prev = this.head\n this.size = 0\n this.cache = {}\n }\n\n private ensureLimit () {\n if (this.size > this.limit) this.remove(this.tail.prev.key)\n }\n}\n","import { last } from '../util'\n\nfunction domResolve (root: string, path: string) {\n const base = document.createElement('base')\n base.href = root\n\n const head = document.getElementsByTagName('head')[0]\n head.insertBefore(base, head.firstChild)\n\n const a = document.createElement('a')\n a.href = path\n const resolved = a.href\n head.removeChild(base)\n\n return resolved\n}\n\nexport function resolve (root: string, filepath: string, ext: string) {\n if (root.length && last(root) !== '/') root += '/'\n const url = domResolve(root, filepath)\n return url.replace(/^(\\w+:\\/\\/[^/]+)(\\/[^?]+)/, (str, origin, path) => {\n const last = path.split('/').pop()\n if (/\\.\\w+$/.test(last)) return str\n return origin + path + ext\n })\n}\n\nexport async function readFile (url: string): Promise {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText as string)\n } else {\n reject(new Error(xhr.statusText))\n }\n }\n xhr.onerror = () => {\n reject(new Error('An error occurred whilst receiving the response.'))\n }\n xhr.open('GET', url)\n xhr.send()\n })\n}\n\nexport function readFileSync (url: string): string {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.send()\n if (xhr.status < 200 || xhr.status >= 300) {\n throw new Error(xhr.statusText)\n }\n return xhr.responseText as string\n}\n\nexport async function exists (filepath: string) {\n return true\n}\n\nexport function existsSync (filepath: string) {\n return true\n}\n\nexport function dirname (filepath: string) {\n return domResolve(filepath, '.')\n}\n\nexport const sep = '/'\n","import { isFalsy } from '../render/boolean'\nimport { identify, isArray, isString, toValue } from '../util/underscore'\nimport { FilterImpl } from '../template'\n\nfunction defaultFilter (this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2 {\n value = toValue(value)\n if (isArray(value) || isString(value)) return value.length ? value : defaultValue\n if (value === false && (new Map(args)).get('allow_false')) return false as T1\n return isFalsy(value, this.context) ? defaultValue : value\n}\n\nfunction json (value: any, space = 0) {\n return JSON.stringify(value, null, space)\n}\n\nfunction inspect (value: any, space = 0) {\n const ancestors: object[] = []\n return JSON.stringify(value, function (this: unknown, _key: unknown, value: any) {\n if (typeof value !== 'object' || value === null) return value\n // `this` is the object that value is contained in, i.e., its direct parent.\n while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) ancestors.pop()\n if (ancestors.includes(value)) return '[Circular]'\n ancestors.push(value)\n return value\n }, space)\n}\n\nfunction to_integer (value: any) {\n return Number(value)\n}\n\nconst raw = {\n raw: true,\n handler: identify\n}\n\nexport default {\n default: defaultFilter,\n raw,\n jsonify: json,\n to_integer,\n json,\n inspect\n}\n","import { FilterImpl } from '../template'\nimport { stringify } from '../util/underscore'\n\nconst escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nexport function escape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nexport function xml_escape (this: FilterImpl, str: string) {\n return escape.call(this, str)\n}\n\nfunction unescape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport function escape_once (this: FilterImpl, str: string) {\n return escape.call(this, unescape.call(this, str))\n}\n\nexport function newline_to_br (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '
    \\n')\n}\n\n// Raw-text blocks (HTML5) plus '<...>' as the catch-all kind; a regex\n// equivalent is O(n^2) in V8 on unclosed openers.\nexport function strip_html (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const blocks = new Map([[''], [''], [''], ['<', '>']])\n let out = ''\n let i = 0\n while (i < str.length) {\n const lt = str.indexOf('<', i)\n if (lt < 0) return out + str.slice(i)\n out += str.slice(i, lt)\n for (const [opener, closer] of blocks) {\n if (!str.startsWith(opener, lt)) continue\n const e = str.indexOf(closer, lt + opener.length)\n if (e >= 0) { i = e + closer.length; break }\n blocks.delete(opener)\n }\n if (i === lt) return out + str.slice(lt)\n }\n return out\n}\n","import { isNil } from '../util'\n\nexport class MapFS {\n constructor (private mapping: {[key: string]: string}) {}\n\n public sep = '/'\n\n async exists (filepath: string) {\n return this.existsSync(filepath)\n }\n\n existsSync (filepath: string) {\n return !isNil(this.mapping[filepath])\n }\n\n async readFile (filepath: string) {\n return this.readFileSync(filepath)\n }\n\n readFileSync (filepath: string) {\n const content = this.mapping[filepath]\n if (isNil(content)) throw new Error(`ENOENT: ${filepath}`)\n return content\n }\n\n dirname (filepath: string) {\n const segments = filepath.split(this.sep)\n segments.pop()\n return segments.join(this.sep)\n }\n\n resolve (dir: string, file: string, ext: string) {\n file += ext\n if (dir === '.') return file\n const segments = dir.split(/\\/+/)\n for (const segment of file.split(this.sep)) {\n if (segment === '.' || segment === '') continue\n else if (segment === '..') {\n if (segments.length > 1 || segments[0] !== '') segments.pop()\n } else segments.push(segment)\n }\n return segments.join(this.sep)\n }\n}\n","import { assert, isArray, isString, isFunction } from './util'\nimport { getDateTimeFormat } from './util/intl'\nimport { LRU, LiquidCache } from './cache'\nimport { FS, LookupType } from './fs'\nimport * as fs from './fs/fs-impl'\nimport { defaultOperators, Operators } from './render'\nimport misc from './filters/misc'\nimport { escape } from './filters/html'\nimport { MapFS } from './fs/map-fs'\n\ntype OutputEscape = (value: any) => string\ntype OutputEscapeOption = 'escape' | 'json' | OutputEscape\n\nexport interface LiquidOptions {\n /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[];\n /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n partials?: string | string[];\n /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n layouts?: string | string[];\n /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */\n relativeReference?: boolean;\n /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */\n jekyllInclude?: boolean;\n /** Use jekyll style where filter, enables array item match. Defaults to `false`. */\n jekyllWhere?: boolean;\n /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string;\n /** Whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean | number | LiquidCache;\n /** Use JavaScript Truthiness. Defaults to `false`. */\n jsTruthy?: boolean;\n /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean;\n /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strictFilters?: boolean;\n /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strictVariables?: boolean;\n /** Catch all errors instead of exit upon one. Please note that render errors won't be reached when parse fails. */\n catchAllErrors?: boolean;\n /** Hide scope variables from prototypes, useful when you're passing a not sanitized object into LiquidJS or need to hide prototypes from templates. */\n ownPropertyOnly?: boolean;\n /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/\n lenientIf?: boolean;\n /** JavaScript timezone name or timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to `-600` or `Australia/Lindeman` */\n timezoneOffset?: number | string;\n /** Default date format to use if the date filter doesn't include a format. Defaults to `%A, %B %-e, %Y at %-l:%M %P %z`. */\n dateFormat?: string;\n /** Default locale, will be used by date filter. Defaults to system locale. */\n locale?: string;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trimTagRight?: boolean;\n /** Similar to `trimTagRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimTagLeft?: boolean;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trimOutputRight?: boolean;\n /** Similar to `trimOutputRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimOutputLeft?: boolean;\n /** The left delimiter for liquid tags. **/\n tagDelimiterLeft?: string;\n /** The right delimiter for liquid tags. **/\n tagDelimiterRight?: string;\n /** The left delimiter for liquid outputs. **/\n outputDelimiterLeft?: string;\n /** The right delimiter for liquid outputs. **/\n outputDelimiterRight?: string;\n /** Whether input strings to date filter preserve the given timezone **/\n preserveTimezones?: boolean;\n /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimmed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean;\n /** `fs` is used to override the default file-system module with a custom implementation. */\n fs?: FS;\n /** keyValue separator */\n keyValueSeparator?: string;\n /** Render from in-memory `templates` mapping instead of file system. File system related options like `fs`, 'root', and `relativeReference` will be ignored when `templates` is specified. */\n templates?: {[key: string]: string};\n /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */\n globals?: object;\n /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */\n keepOutputType?: boolean;\n /** Default escape filter applied to output values, when set, you'll have to add `| raw` for values don't need to be escaped. Defaults to `undefined`. */\n outputEscape?: OutputEscapeOption;\n /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */\n operators?: Operators;\n /** Respect parameter order when using filters like \"for ... reversed limit\", Defaults to `false`. */\n orderedFilterParameters?: boolean;\n /** For DoS handling, limit total length of templates parsed in one `parse()` call. A typical PC can handle 1e8 (100M) characters without issues. */\n parseLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue. */\n memoryLimit?: number;\n}\n\nexport interface RenderOptions {\n /**\n * This call is sync or async? It's used by Liquid internal methods, you'll not need this.\n */\n sync?: boolean;\n /**\n * Same as `globals` on LiquidOptions, but only for current render() call\n */\n globals?: object;\n /**\n * Same as `strictVariables` on LiquidOptions, but only for current render() call\n */\n strictVariables?: boolean;\n /**\n * Same as `ownPropertyOnly` on LiquidOptions, but only for current render() call\n */\n ownPropertyOnly?: boolean;\n /** For DoS handling, limit total renders of tag/HTML/output in one `render()` call. A typical PC can handle 1e5 renders of typical templates per second. */\n templateLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue.. */\n memoryLimit?: number;\n}\n\nexport interface RenderFileOptions extends RenderOptions {\n lookupType?: LookupType;\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[];\n partials?: string[];\n layouts?: string[];\n cache?: LiquidCache;\n outputEscape?: OutputEscape;\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n jekyllInclude: boolean;\n extname: string;\n cache?: LiquidCache;\n jsTruthy: boolean;\n dynamicPartials: boolean;\n fs: FS;\n strictFilters: boolean;\n strictVariables: boolean;\n ownPropertyOnly: boolean;\n lenientIf: boolean;\n dateFormat: string;\n locale: string;\n trimTagRight: boolean;\n trimTagLeft: boolean;\n trimOutputRight: boolean;\n trimOutputLeft: boolean;\n tagDelimiterLeft: string;\n tagDelimiterRight: string;\n outputDelimiterLeft: string;\n outputDelimiterRight: string;\n preserveTimezones: boolean;\n greedy: boolean;\n globals: object;\n keepOutputType: boolean;\n operators: Operators;\n parseLimit: number;\n renderLimit: number;\n memoryLimit: number;\n}\n\nexport const defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n layouts: ['.'],\n partials: ['.'],\n relativeReference: true,\n jekyllInclude: false,\n keyValueSeparator: ':',\n cache: undefined,\n extname: '',\n fs: fs,\n dynamicPartials: true,\n jsTruthy: false,\n dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',\n locale: '',\n trimTagRight: false,\n trimTagLeft: false,\n trimOutputRight: false,\n trimOutputLeft: false,\n greedy: true,\n tagDelimiterLeft: '{%',\n tagDelimiterRight: '%}',\n outputDelimiterLeft: '{{',\n outputDelimiterRight: '}}',\n preserveTimezones: false,\n strictFilters: false,\n strictVariables: false,\n ownPropertyOnly: true,\n lenientIf: false,\n globals: {},\n keepOutputType: false,\n operators: defaultOperators,\n memoryLimit: Infinity,\n parseLimit: Infinity,\n renderLimit: Infinity\n}\n\nexport function normalize (options: LiquidOptions): NormalizedFullOptions {\n if (options.hasOwnProperty('root')) {\n if (!options.hasOwnProperty('partials')) options.partials = options.root\n if (!options.hasOwnProperty('layouts')) options.layouts = options.root\n }\n if (options.hasOwnProperty('cache')) {\n let cache: LiquidCache | undefined\n if (typeof options.cache === 'number') cache = options.cache > 0 ? new LRU(options.cache) : undefined\n else if (typeof options.cache === 'object') cache = options.cache\n else cache = options.cache ? new LRU(1024) : undefined\n options.cache = cache\n }\n options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options }\n if ((!options.fs!.dirname || !options.fs!.sep) && options.relativeReference) {\n console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning')\n options.relativeReference = false\n }\n options.root = normalizeDirectoryList(options.root)\n options.partials = normalizeDirectoryList(options.partials)\n options.layouts = normalizeDirectoryList(options.layouts)\n options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape)\n if (!options.locale) {\n options.locale = getDateTimeFormat()?.().resolvedOptions().locale ?? 'en-US'\n }\n if (options.templates) {\n options.fs = new MapFS(options.templates)\n options.relativeReference = true\n options.root = options.partials = options.layouts = '.'\n }\n return options as NormalizedFullOptions\n}\n\nfunction getOutputEscapeFunction (nameOrFunction: OutputEscapeOption): OutputEscape {\n if (nameOrFunction === 'escape') return escape\n if (nameOrFunction === 'json') return misc.json\n assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function')\n return nameOrFunction\n}\n\nexport function normalizeDirectoryList (value: any): string[] {\n let list: string[] = []\n if (isArray(value)) list = value\n if (isString(value)) list = [value]\n return list\n}\n","import { Token } from '../tokens'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { isTagToken, isHTMLToken, isDelimitedToken, TYPES, INLINE_BLANK, BLANK } from '../util'\n\nexport function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n let inRaw = false\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n if (!isDelimitedToken(token)) continue\n if (!inRaw && token.trimLeft) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (isTagToken(token)) {\n if (token.name === 'raw') inRaw = true\n else if (token.name === 'endraw') inRaw = false\n }\n\n if (!inRaw && token.trimRight) {\n trimRight(tokens[i + 1], options.greedy)\n }\n }\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) token.trimRight++\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) token.trimLeft++\n if (token.input.charAt(token.begin + token.trimLeft) === '\\n') token.trimLeft++\n}\n","import { FilteredValueToken, TagToken, HTMLToken, HashToken, QuotedToken, LiquidTagToken, OutputToken, ValueToken, Token, RangeToken, FilterToken, TopLevelToken, PropertyAccessToken, OperatorToken, LiteralToken, IdentifierToken, NumberToken } from '../tokens'\nimport { OperatorHandler } from '../render/operator'\nimport { TrieNode, LiteralValue, Trie, createTrie, ellipsis, literalValues, TokenizationError, TYPES, QUOTE, BLANK, NUMBER, SIGN, isWord, isString } from '../util'\nimport { Operators, Expression } from '../render'\nimport { NormalizedFullOptions, defaultOptions } from '../liquid-options'\nimport { FilterArg } from './filter-arg'\nimport { whiteSpaceCtrl } from './whitespace-ctrl'\n\nexport class Tokenizer {\n p: number\n N: number\n private rawBeginAt = -1\n private opTrie: Trie\n private literalTrie: Trie\n\n constructor (\n public input: string,\n operators: Operators = defaultOptions.operators,\n public file?: string,\n range?: [number, number]\n ) {\n this.p = range ? range[0] : 0\n this.N = range ? range[1] : input.length\n this.opTrie = createTrie(operators)\n this.literalTrie = createTrie(literalValues)\n }\n\n readExpression () {\n return new Expression(this.readExpressionTokens())\n }\n\n * readExpressionTokens (): IterableIterator {\n while (this.p < this.N) {\n const operator = this.readOperator()\n if (operator) {\n yield operator\n continue\n }\n const operand = this.readValue()\n if (operand) {\n yield operand\n continue\n }\n return\n }\n }\n readOperator (): OperatorToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.opTrie)\n if (end === -1) return\n return new OperatorToken(this.input, this.p, (this.p = end), this.file)\n }\n matchTrie (trie: Trie) {\n let node: TrieNode = trie\n let i = this.p\n let info\n while (node[this.input[i]] && i < this.N) {\n node = node[this.input[i++]]\n if (node['end']) info = node\n }\n if (!info) return -1\n if (info['needBoundary'] && isWord(this.peek(i - this.p))) return -1\n return i\n }\n readFilteredValue (): FilteredValueToken {\n const begin = this.p\n const initial = this.readExpression()\n this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`)\n const filters = this.readFilters()\n return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file)\n }\n readFilters (): FilterToken[] {\n const filters = []\n while (true) {\n const filter = this.readFilter()\n if (!filter) return filters\n filters.push(filter)\n }\n }\n readFilter (): FilterToken | null {\n this.skipBlank()\n if (this.end()) return null\n this.assert(this.read() === '|', `expected \"|\" before filter`)\n const name = this.readIdentifier()\n if (!name.size()) {\n this.assert(this.end(), `expected filter name`)\n return null\n }\n const args = []\n this.skipBlank()\n if (this.peek() === ':') {\n do {\n ++this.p\n const arg = this.readFilterArg()\n arg && args.push(arg)\n this.skipBlank()\n this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`)\n } while (this.peek() === ',')\n } else if (this.peek() === '|' || this.end()) {\n // do nothing\n } else {\n throw this.error('expected \":\" after filter name')\n }\n return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file)\n }\n\n readFilterArg (): FilterArg | undefined {\n const key = this.readValue()\n if (!key) return\n this.skipBlank()\n if (this.peek() !== ':') return key\n ++this.p\n const value = this.readValue()\n return [key.getText(), value]\n }\n\n readTopLevelTokens (options: NormalizedFullOptions = defaultOptions): TopLevelToken[] {\n const tokens: TopLevelToken[] = []\n while (this.p < this.N) {\n const token = this.readTopLevelToken(options)\n tokens.push(token)\n }\n whiteSpaceCtrl(tokens, options)\n return tokens\n }\n\n readTopLevelToken (options: NormalizedFullOptions): TopLevelToken {\n const { tagDelimiterLeft, outputDelimiterLeft } = options\n if (this.rawBeginAt > -1) return this.readEndrawOrRawContent(options)\n if (this.match(tagDelimiterLeft)) return this.readTagToken(options)\n if (this.match(outputDelimiterLeft)) return this.readOutputToken(options)\n return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft])\n }\n\n readHTMLToken (stopStrings: string[]): HTMLToken {\n const begin = this.p\n while (this.p < this.N) {\n if (stopStrings.some(str => this.match(str))) break\n ++this.p\n }\n return new HTMLToken(this.input, begin, this.p, this.file)\n }\n\n readTagToken (options: NormalizedFullOptions): TagToken {\n const { file, input } = this\n const begin = this.p\n if (this.readToDelimiter(options.tagDelimiterRight) === -1) {\n throw this.error(`tag ${this.snapshot(begin)} not closed`, begin)\n }\n const token = new TagToken(input, begin, this.p, options, file)\n if (token.name === 'raw') this.rawBeginAt = begin\n return token\n }\n\n readToDelimiter (delimiter: string, respectQuoted = false) {\n this.skipBlank()\n while (this.p < this.N) {\n if (respectQuoted && (this.peekType() & QUOTE)) {\n this.readQuoted()\n continue\n }\n ++this.p\n if (this.rmatch(delimiter)) return this.p\n }\n return -1\n }\n\n readOutputToken (options: NormalizedFullOptions = defaultOptions): OutputToken {\n const { file, input } = this\n const { outputDelimiterRight } = options\n const begin = this.p\n if (this.readToDelimiter(outputDelimiterRight, true) === -1) {\n throw this.error(`output ${this.snapshot(begin)} not closed`, begin)\n }\n return new OutputToken(input, begin, this.p, options, file)\n }\n\n readEndrawOrRawContent (options: NormalizedFullOptions): HTMLToken | TagToken {\n const { tagDelimiterLeft, tagDelimiterRight } = options\n const begin = this.p\n let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n while (this.p < this.N) {\n if (this.readIdentifier().getText() !== 'endraw') {\n leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n continue\n }\n while (this.p <= this.N) {\n if (this.rmatch(tagDelimiterRight)) {\n const end = this.p\n if (begin === leftPos) {\n this.rawBeginAt = -1\n return new TagToken(this.input, begin, end, options, this.file)\n } else {\n this.p = leftPos\n return new HTMLToken(this.input, begin, leftPos, this.file)\n }\n }\n if (this.rmatch(tagDelimiterLeft)) break\n this.p++\n }\n }\n throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin)\n }\n\n readLiquidTagTokens (options: NormalizedFullOptions = defaultOptions): LiquidTagToken[] {\n const tokens: LiquidTagToken[] = []\n while (this.p < this.N) {\n const token = this.readLiquidTagToken(options)\n token && tokens.push(token)\n }\n return tokens\n }\n\n readLiquidTagToken (options: NormalizedFullOptions): LiquidTagToken | undefined {\n this.skipBlank()\n if (this.end()) return\n\n const begin = this.p\n this.readToDelimiter('\\n')\n const end = this.p\n return new LiquidTagToken(this.input, begin, end, options, this.file)\n }\n\n error (msg: string, pos: number = this.p) {\n return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file))\n }\n\n assert (pred: unknown, msg: string | (() => string), pos?: number) {\n if (!pred) throw this.error(typeof msg === 'function' ? msg() : msg, pos)\n }\n\n snapshot (begin: number = this.p) {\n return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32))\n }\n\n /**\n * @deprecated use #readIdentifier instead\n */\n readWord () {\n return this.readIdentifier()\n }\n\n readIdentifier (): IdentifierToken {\n this.skipBlank()\n const begin = this.p\n while (!this.end() && isWord(this.peek())) ++this.p\n return new IdentifierToken(this.input, begin, this.p, this.file)\n }\n\n readNonEmptyIdentifier (): IdentifierToken | undefined {\n const id = this.readIdentifier()\n return id.size() ? id : undefined\n }\n\n readTagName (): string {\n this.skipBlank()\n // Handle inline comment tags\n if (this.input[this.p] === '#') return this.input.slice(this.p, ++this.p)\n return this.readIdentifier().getText()\n }\n\n readHashes (jekyllStyle?: boolean | string) {\n const hashes = []\n while (true) {\n const hash = this.readHash(jekyllStyle)\n if (!hash) return hashes\n hashes.push(hash)\n }\n }\n\n readHash (jekyllStyle?: boolean | string): HashToken | undefined {\n this.skipBlank()\n if (this.peek() === ',') ++this.p\n const begin = this.p\n const name = this.readNonEmptyIdentifier()\n if (!name) return\n let value\n\n this.skipBlank()\n const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':')\n if (this.peek() === sep) {\n ++this.p\n value = this.readValue()\n }\n return new HashToken(this.input, begin, this.p, name, value, this.file)\n }\n\n remaining () {\n return this.input.slice(this.p, this.N)\n }\n\n advance (step = 1) {\n this.p += step\n }\n\n end () {\n return this.p >= this.N\n }\n read () {\n return this.input[this.p++]\n }\n readTo (end: string): number {\n while (this.p < this.N) {\n ++this.p\n if (this.rmatch(end)) return this.p\n }\n return -1\n }\n\n readValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber()\n const props = this.readProperties(!variable)\n if (!props.length) return variable\n return new PropertyAccessToken(variable, props, this.input, begin, this.p)\n }\n\n readScopeValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const props = this.readProperties()\n if (!props.length) return undefined\n return new PropertyAccessToken(undefined, props, this.input, begin, this.p)\n }\n\n private readProperties (isBegin = true): (ValueToken | IdentifierToken)[] {\n const props: (ValueToken | IdentifierToken)[] = []\n while (true) {\n if (this.peek() === '[') {\n this.p++\n const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file)\n this.assert(this.readTo(']') !== -1, '[ not closed')\n props.push(prop)\n continue\n }\n if (isBegin && !props.length) {\n const prop = this.readNonEmptyIdentifier()\n if (prop) {\n props.push(prop)\n continue\n }\n }\n if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax\n this.p++\n const prop = this.readNonEmptyIdentifier()\n if (!prop) break\n props.push(prop)\n continue\n }\n break\n }\n return props\n }\n\n readNumber (): NumberToken | undefined {\n this.skipBlank()\n let decimalFound = false\n let digitFound = false\n let n = 0\n if (this.peekType() & SIGN) n++\n while (this.p + n <= this.N) {\n if (this.peekType(n) & NUMBER) {\n digitFound = true\n n++\n } else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {\n if (decimalFound || !digitFound) return\n decimalFound = true\n n++\n } else break\n }\n if (digitFound && !isWord(this.peek(n))) {\n const num = new NumberToken(this.input, this.p, this.p + n, this.file)\n this.advance(n)\n return num\n }\n }\n\n readLiteral (): LiteralToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.literalTrie)\n if (end === -1) return\n const literal = new LiteralToken(this.input, this.p, end, this.file)\n this.p = end\n return literal\n }\n\n readRange (): RangeToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (this.peek() !== '(') return\n ++this.p\n const lhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax')\n const rhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === ')', 'invalid range syntax')\n return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file)\n }\n\n readValueOrThrow (): ValueToken {\n const value = this.readValue()\n this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`)\n return value!\n }\n\n readQuoted (): QuotedToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (!(this.peekType() & QUOTE)) return\n ++this.p\n let escaped = false\n while (this.p < this.N) {\n ++this.p\n if (this.input[this.p - 1] === this.input[begin] && !escaped) break\n if (escaped) escaped = false\n else if (this.input[this.p - 1] === '\\\\') escaped = true\n }\n return new QuotedToken(this.input, begin, this.p, this.file)\n }\n\n * readFileNameTemplate (options: NormalizedFullOptions): IterableIterator {\n const { outputDelimiterLeft } = options\n const htmlStopStrings = [',', ' ', '\\r', '\\n', '\\t', outputDelimiterLeft]\n const htmlStopStringSet = new Set(htmlStopStrings)\n // break on ',' and ' ', outputDelimiterLeft only stops HTML token\n while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {\n yield this.match(outputDelimiterLeft)\n ? this.readOutputToken(options)\n : this.readHTMLToken(htmlStopStrings)\n }\n }\n\n match (word: string) {\n for (let i = 0; i < word.length; i++) {\n if (word[i] !== this.input[this.p + i]) return false\n }\n return true\n }\n\n rmatch (pattern: string) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) return false\n }\n return true\n }\n\n peekType (n = 0) {\n return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]\n }\n\n peek (n = 0): string {\n return this.p + n >= this.N ? '' : this.input[this.p + n]\n }\n\n skipBlank () {\n while (this.peekType() & BLANK) ++this.p\n }\n}\n","import { Token, TopLevelToken } from '../tokens'\nimport { Template } from '../template'\nimport { isTagToken } from '../util'\n\ntype ParseToken = ((token: T, remainTokens: T[]) => Template)\n\nexport class ParseStream {\n private tokens: T[]\n private handlers: Record void> = {}\n private stopRequested = false\n private parseToken: ParseToken\n\n public constructor (tokens: T[], parseToken: ParseToken) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n public on (name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream {\n this.handlers[name] = cb\n return this\n }\n private trigger (event: string, arg?: T) {\n const h = this.handlers[event]\n return h ? (h.call(this, arg), true) : false\n }\n public start () {\n this.trigger('start')\n let token: T | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) {\n continue\n }\n const template = this.parseToken(token, this.tokens)\n this.trigger('template', template)\n }\n if (!this.stopRequested) this.trigger('end')\n return this\n }\n public stop () {\n this.stopRequested = true\n return this\n }\n}\n","export abstract class TemplateImpl {\n public token: T;\n public constructor (token: T) {\n this.token = token\n }\n}\n","import { TemplateImpl } from './template-impl'\nimport type { Emitter } from '../emitters/emitter'\nimport type { Parser, Tokenizer } from '../parser'\nimport type { Context } from '../context/context'\nimport type { TopLevelToken, TagToken } from '../tokens'\nimport type { Template } from './template'\nimport type { Liquid } from '../liquid'\n\nexport type TagRenderReturn = Generator | Promise | unknown\n\nexport abstract class Tag extends TemplateImpl implements Template {\n public name: string\n public liquid: Liquid\n protected tokenizer: Tokenizer\n\n public constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token)\n this.name = token.name\n this.liquid = liquid\n this.tokenizer = token.tokenizer\n }\n public abstract render (ctx: Context, emitter: Emitter): TagRenderReturn;\n}\n\nexport interface TagClass {\n new(token: TagToken, tokens: TopLevelToken[], liquid: Liquid, parser: Parser): Tag\n}\n","import { evalToken } from '../render/expression'\nimport { Context } from '../context/context'\nimport { Tokenizer } from '../parser/tokenizer'\nimport { Token } from '../tokens/token'\n\ntype HashValueTokens = Record\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `, foo:'bar', coo:2 reversed %}`,\n * hash['foo'] === 'bar'\n * hash['coo'] === 2\n * hash['reversed'] === undefined\n */\nexport class Hash {\n hash: HashValueTokens = {}\n\n constructor (input: string | Tokenizer, jekyllStyle?: boolean | string) {\n const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {})\n for (const hash of tokenizer.readHashes(jekyllStyle)) {\n this.hash[hash.name.content] = hash.value\n }\n }\n\n * render (ctx: Context): Generator, unknown> {\n const hash = {}\n for (const key of Object.keys(this.hash)) {\n hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx)\n }\n return hash\n }\n}\n","import { isFunction } from '../util'\nimport { Hash } from './hash'\nimport { Tag, TagClass, TagRenderReturn } from './tag'\nimport { TagToken, TopLevelToken } from '../tokens'\nimport { Emitter } from '../emitters'\nimport { Context } from '../context'\nimport type { Liquid } from '../liquid'\n\nexport interface TagImplOptions {\n [key: string]: any\n parse?: (this: Tag & TagImplOptions, token: TagToken, remainingTokens: TopLevelToken[]) => void;\n render: (this: Tag & TagImplOptions, ctx: Context, emitter: Emitter, hash: Record) => TagRenderReturn;\n}\n\nexport function createTagClass (options: TagImplOptions): TagClass {\n return class extends Tag {\n constructor (token: TagToken, tokens: TopLevelToken[], liquid: Liquid) {\n super(token, tokens, liquid)\n if (isFunction(options.parse)) {\n options.parse.call(this, token, tokens)\n }\n }\n * render (ctx: Context, emitter: Emitter): TagRenderReturn {\n const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)) as Record\n return yield options.render.call(this, ctx, emitter, hash)\n }\n }\n}\n","import { isArray } from '../util/underscore'\nimport { ValueToken } from '../tokens/value-token'\n\ntype KeyValuePair = [string?, ValueToken?]\n\nexport type FilterArg = ValueToken | KeyValuePair\n\nexport function isKeyValuePair (arr: FilterArg): arr is KeyValuePair {\n return isArray(arr)\n}\n","import { evalToken } from '../render'\nimport { Context } from '../context'\nimport { identify, isFunction } from '../util/underscore'\nimport { FilterHandler, FilterImplOptions } from './filter-impl-options'\nimport { FilterArg, isKeyValuePair } from '../parser/filter-arg'\nimport { Liquid } from '../liquid'\nimport { FilterToken } from '../tokens'\n\nexport class Filter {\n public name: string\n public args: FilterArg[]\n public readonly raw: boolean\n private handler: FilterHandler\n private liquid: Liquid\n private token: FilterToken\n\n public constructor (token: FilterToken, options: FilterImplOptions | undefined, liquid: Liquid) {\n this.token = token\n this.name = token.name\n this.handler = isFunction(options)\n ? options\n : (isFunction(options?.handler) ? options!.handler : identify)\n this.raw = !isFunction(options) && !!options?.raw\n this.args = token.args\n this.liquid = liquid\n }\n public * render (value: any, context: Context): IterableIterator {\n const argv: any[] = []\n for (const arg of this.args as FilterArg[]) {\n if (isKeyValuePair(arg)) argv.push([arg[0], yield evalToken(arg[1], context)])\n else argv.push(yield evalToken(arg, context))\n }\n return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv])\n }\n}\n","import { Filter } from './filter'\nimport { Expression } from '../render'\nimport { Tokenizer } from '../parser'\nimport { assert } from '../util'\nimport type { FilteredValueToken } from '../tokens'\nimport type { Liquid } from '../liquid'\nimport type { Context } from '../context'\n\nexport class Value {\n public readonly filters: Filter[] = []\n public readonly initial: Expression\n\n /**\n * @param str the value to be valuated, eg.: \"foobar\" | truncate: 3\n */\n public constructor (input: string | FilteredValueToken, liquid: Liquid) {\n const token: FilteredValueToken = typeof input === 'string'\n ? new Tokenizer(input, liquid.options.operators).readFilteredValue()\n : input\n this.initial = token.initial\n this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid))\n }\n\n public * value (ctx: Context, lenient?: boolean): Generator {\n lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default')\n let val = yield this.initial.evaluate(ctx, lenient)\n\n for (const filter of this.filters) {\n val = yield filter.render(val, ctx)\n }\n return val\n }\n\n private getFilter (liquid: Liquid, name: string) {\n const impl = liquid.filters[name]\n assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`)\n return impl\n }\n}\n","import { Value } from './value'\nimport { Arguments, Template, TemplateImpl } from '../template'\nimport { Context } from '../context/context'\nimport { Emitter } from '../emitters/emitter'\nimport { OutputToken } from '../tokens/output-token'\nimport { Tokenizer } from '../parser'\nimport { Liquid } from '../liquid'\nimport { Filter } from './filter'\nimport { FilterToken } from '../tokens'\n\nexport class Output extends TemplateImpl implements Template {\n value: Value\n public constructor (token: OutputToken, liquid: Liquid) {\n super(token)\n const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange)\n this.value = new Value(tokenizer.readFilteredValue(), liquid)\n const filters = this.value.filters\n const outputEscape = liquid.options.outputEscape\n if (!filters[filters.length - 1]?.raw && outputEscape) {\n const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0)\n filters.push(new Filter(token, outputEscape, liquid))\n }\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator {\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n}\n","import { TemplateImpl, Template } from '../template'\nimport { HTMLToken } from '../tokens'\nimport { Context } from '../context'\nimport { Emitter } from '../emitters'\n\nexport class HTML extends TemplateImpl implements Template {\n private str: string\n public constructor (token: HTMLToken) {\n super(token)\n this.str = token.getContent()\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator {\n emitter.write(this.str)\n }\n}\n","import { Argument, Template, Value } from '.'\nimport { isKeyValuePair } from '../parser/filter-arg'\nimport { PropertyAccessToken, ValueToken } from '../tokens'\nimport {\n isNumberToken,\n isPropertyAccessToken,\n isQuotedToken,\n isRangeToken,\n isString,\n isValueToken,\n isWordToken,\n toPromise,\n toValueSync\n} from '../util'\n\n/**\n * Row, column and file name where a variable was found.\n */\nexport interface VariableLocation {\n row: number;\n col: number;\n file?: string;\n}\n\n/**\n * A variable's segments as an array, possibly with nested arrays of segments.\n */\nexport type SegmentArray = Array\n\n/**\n * A variable's segments and location, which can be coerced to a string.\n */\nexport class Variable {\n constructor (\n readonly segments: Array,\n readonly location: VariableLocation\n ) {}\n\n public toString (): string {\n return segmentsString(this.segments, true)\n }\n\n /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */\n public toArray (): SegmentArray {\n function * _visit (...segments: Array): Generator {\n for (const segment of segments) {\n if (segment instanceof Variable) {\n yield Array.from(_visit(...segment.segments))\n } else {\n yield segment\n }\n }\n }\n return Array.from(_visit(...this.segments))\n }\n}\n\n/**\n * Property names and array indexes that make up a path to a variable.\n */\nexport type VariableSegments = Array;\n\n/**\n * A mapping of variable names to an array of locations at which the variable was found.\n */\nexport type Variables = { [key: string]: Variable[] };\n\n/**\n * Group variables by the string representation of their root segment.\n */\nexport class VariableMap {\n private map: Map\n\n constructor () {\n this.map = new Map()\n }\n\n public get (key: Variable): Variable[] {\n const k = segmentsString([key.segments[0]])\n if (!this.map.has(k)) {\n this.map.set(k, [])\n }\n return this.map.get(k) as Variable[]\n }\n\n public has (key: Variable): boolean {\n return this.map.has(segmentsString([key.segments[0]]))\n }\n\n public push (variable: Variable): void {\n this.get(variable).push(variable)\n }\n\n public asObject (): Variables {\n return Object.fromEntries(this.map)\n }\n}\n\n/**\n * The result of calling `analyze()` or `analyzeSync()`.\n */\nexport interface StaticAnalysis {\n /**\n * All variables, whether they are in scope or not. Including references to names\n * such as `forloop` from the `for` tag.\n */\n variables: Variables;\n\n /**\n * Variables that are not in scope. These could be a \"global\" variables that are\n * expected to be provided by the application developer, or possible mistakes\n * from the template author.\n *\n * If a variable is referenced before and after assignment, you should expect\n * that variable to be included in `globals`, `variables` and `locals`, each with\n * a different location.\n */\n globals: Variables;\n\n /**\n * Template variables that are added to the template local scope using tags like\n * `assign`, `capture` or `increment`.\n */\n locals: Variables;\n}\n\nexport interface StaticAnalysisOptions {\n /**\n * When `true` (the default), try to load partial templates and analyze them too.\n */\n partials?: boolean;\n}\n\nexport const defaultStaticAnalysisOptions: StaticAnalysisOptions = {\n partials: true\n}\n\nfunction * _analyze (templates: Template[], partials: boolean, sync: boolean): Generator {\n const variables = new VariableMap()\n const globals = new VariableMap()\n const locals = new VariableMap()\n\n const rootScope = new DummyScope(new Set())\n\n // Names of partial templates that we've already analyzed.\n const seen: Set = new Set()\n\n function updateVariables (variable: Variable, scope: DummyScope) {\n variables.push(variable)\n const aliased = scope.alias(variable)\n\n if (aliased !== undefined) {\n const root = aliased.segments[0]\n // TODO: What if a a template renders a rendered template? Do we need scope.parent?\n if (isString(root) && !rootScope.has(root)) {\n globals.push(aliased)\n }\n } else {\n const root = variable.segments[0]\n if (isString(root) && !scope.has(root)) {\n globals.push(variable)\n }\n }\n\n // Recurse for nested Variables\n for (const segment of variable.segments) {\n if (segment instanceof Variable) {\n updateVariables(segment, scope)\n }\n }\n }\n\n function * visit (template: Template, scope: DummyScope): Generator {\n if (template.arguments) {\n for (const arg of template.arguments()) {\n for (const variable of extractVariables(arg)) {\n updateVariables(variable, scope)\n }\n }\n }\n\n if (template.localScope) {\n for (const ident of template.localScope()) {\n scope.add(ident.content)\n scope.deleteAlias(ident.content)\n const [row, col] = ident.getPosition()\n locals.push(new Variable([ident.content], { row, col, file: ident.file }))\n }\n }\n\n if (template.children) {\n if (template.partialScope) {\n const partial = template.partialScope()\n\n if (partial === undefined) {\n // Layouts, for example, can have children that are not partials.\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n return\n }\n\n if (seen.has(partial.name)) return\n\n const partialScopeNames: Set = new Set()\n const partialScope = partial.isolated\n ? new DummyScope(partialScopeNames)\n : scope.push(partialScopeNames)\n\n for (const name of partial.scope) {\n if (isString(name)) {\n partialScopeNames.add(name)\n } else {\n const [alias, argument] = name\n partialScopeNames.add(alias)\n const variables = Array.from(extractVariables(argument))\n if (variables.length) {\n partialScope.setAlias(alias, variables[0].segments)\n }\n }\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, partialScope)\n seen.add(partial.name)\n }\n\n partialScope.pop()\n } else {\n if (template.blockScope) {\n scope.push(new Set(template.blockScope()))\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n\n if (template.blockScope) {\n scope.pop()\n }\n }\n }\n }\n\n for (const template of templates) {\n yield visit(template, rootScope)\n }\n\n return {\n variables: variables.asObject(),\n globals: globals.asObject(),\n locals: locals.asObject()\n }\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required\n return toPromise(_analyze(template, opts.partials, false))\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required\n return toValueSync(_analyze(template, opts.partials, true))\n}\n\ninterface ScopeStackItem {\n names: Set;\n aliases: Map;\n}\n\n/**\n * A stack to manage scopes while traversing templates during static analysis.\n */\nclass DummyScope {\n private stack: Array\n\n constructor (globals: Set) {\n this.stack = [{ names: globals, aliases: new Map() }]\n }\n\n /** Return true if `name` is in scope. */\n public has (name: string): boolean {\n for (const scope of this.stack) {\n if (scope.names.has(name)) {\n return true\n }\n }\n return false\n }\n\n public push (scope: Set): DummyScope {\n this.stack.push({ names: scope, aliases: new Map() })\n return this\n }\n\n public pop (): Set | undefined {\n return this.stack.pop()?.names\n }\n\n // Add a name to the template scope.\n public add (name: string): void {\n this.stack[0].names.add(name)\n }\n\n /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */\n public alias (variable: Variable): Variable | undefined {\n const root = variable.segments[0]\n if (!isString(root)) return undefined\n const alias = this.getAlias(root)\n if (alias === undefined) return undefined\n return new Variable([...alias, ...variable.segments.slice(1)], variable.location)\n }\n\n // TODO: `from` could be a path with multiple segments, like `include.x`.\n public setAlias (from: string, to: VariableSegments): void {\n this.stack[this.stack.length - 1].aliases.set(from, to)\n }\n\n public deleteAlias (name: string): void {\n this.stack[this.stack.length - 1].aliases.delete(name)\n }\n\n private getAlias (name: string): VariableSegments | undefined {\n for (const scope of this.stack) {\n if (scope.aliases.has(name)) {\n return scope.aliases.get(name)\n }\n\n // If a scope has defined `name`, then it masks aliases in parent scopes.\n if (scope.names.has(name)) {\n return undefined\n }\n }\n return undefined\n }\n}\n\nfunction * extractVariables (value: Argument): Generator {\n if (isValueToken(value)) {\n yield * extractValueTokenVariables(value)\n } else if (value instanceof Value) {\n yield * extractFilteredValueVariables(value)\n }\n}\n\nfunction * extractFilteredValueVariables (value: Value): Generator {\n for (const token of value.initial.postfix) {\n if (isValueToken(token)) {\n yield * extractValueTokenVariables(token)\n }\n }\n\n for (const filter of value.filters) {\n for (const arg of filter.args) {\n if (isKeyValuePair(arg) && arg[1]) {\n yield * extractValueTokenVariables(arg[1])\n } else if (isValueToken(arg)) {\n yield * extractValueTokenVariables(arg)\n }\n }\n }\n}\n\nfunction * extractValueTokenVariables (token: ValueToken): Generator {\n if (isRangeToken(token)) {\n yield * extractValueTokenVariables(token.lhs)\n yield * extractValueTokenVariables(token.rhs)\n } else if (isPropertyAccessToken(token)) {\n yield extractPropertyAccessVariable(token)\n }\n}\n\nfunction extractPropertyAccessVariable (token: PropertyAccessToken): Variable {\n const segments: VariableSegments = []\n\n // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.\n let file: string | undefined = token.file\n\n // Here we're flattening the first segment of a path if it is a nested path.\n const root = token.props[0]\n file = file || root.file\n if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {\n segments.push(root.content)\n } else if (isPropertyAccessToken(root)) {\n // Flatten paths that start with a nested path.\n segments.push(...extractPropertyAccessVariable(root).segments)\n }\n\n for (const prop of token.props.slice(1)) {\n file = file || prop.file\n if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {\n segments.push(prop.content)\n } else if (isPropertyAccessToken(prop)) {\n segments.push(extractPropertyAccessVariable(prop))\n }\n }\n\n const [row, col] = token.getPosition()\n return new Variable(segments, {\n row,\n col,\n file\n })\n}\n\n// This is used to detect segments that can be represented with dot notation\n// when creating a string representation of VariableSegments.\nconst RE_PROPERTY = /^[\\u0080-\\uFFFFa-zA-Z_][\\u0080-\\uFFFFa-zA-Z0-9_-]*$/\n\n/**\n * Return a string representation of segments using dot notation where possible.\n * @param segments - The property names and array indices that make up a path to a variable.\n * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.\n */\nfunction segmentsString (segments: VariableSegments, bracketedRoot = false): string {\n const buf: string[] = []\n\n const root = segments[0]\n if (isString(root)) {\n if (!bracketedRoot || root.match(RE_PROPERTY)) {\n buf.push(`${root}`)\n } else {\n buf.push(`['${root}']`)\n }\n }\n\n for (const segment of segments.slice(1)) {\n if (segment instanceof Variable) {\n buf.push(`[${segmentsString(segment.segments)}]`)\n } else if (isString(segment)) {\n if (segment.match(RE_PROPERTY)) {\n buf.push(`.${segment}`)\n } else {\n buf.push(`['${segment}']`)\n }\n } else {\n buf.push(`[${segment}]`)\n }\n }\n\n return buf.join('')\n}\n","import { FS } from './fs'\nimport { assert, LiquidAsync, toLiquidAsync } from '../util'\n\nexport interface LoaderOptions {\n fs: FS;\n extname: string;\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n}\nexport enum LookupType {\n Partials = 'partials',\n Layouts = 'layouts',\n Root = 'root'\n}\nexport class Loader {\n public shouldLoadRelative: (referencedFile: string) => boolean\n private options: LoaderOptions\n private contains: LiquidAsync>\n private exists: LiquidAsync\n\n constructor (options: LoaderOptions) {\n this.options = options\n if (options.relativeReference) {\n const sep = options.fs.sep\n assert(sep, '`fs.sep` is required for relative reference')\n const prefixes = ['.' + sep, '..' + sep, './', '../']\n this.shouldLoadRelative = (referencedFile: string) => prefixes.some(prefix => referencedFile.startsWith(prefix))\n } else {\n this.shouldLoadRelative = (_referencedFile: string) => false\n }\n const fs = options.fs\n this.contains = toLiquidAsync(\n fs.contains?.bind(fs) || (async () => true),\n fs.containsSync?.bind(fs) || (() => true)\n )\n this.exists = toLiquidAsync(\n fs.exists?.bind(fs) || (async () => false),\n fs.existsSync?.bind(fs)\n )\n }\n\n public * lookup (file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator {\n const dirs = this.options[type]\n for (const filepath of this.candidates(file, dirs, currentFile)) {\n let allowed = false\n for (const dir of dirs) {\n if (yield this.contains(!!sync, dir, filepath)) { allowed = true; break }\n }\n if (!allowed) continue\n if (yield this.exists(!!sync, filepath)) return filepath\n }\n throw this.lookupError(file, dirs)\n }\n\n public * candidates (file: string, dirs: string[], currentFile?: string) {\n const { fs, extname } = this.options\n\n if (this.shouldLoadRelative(file) && currentFile) {\n const referenced = fs.resolve(this.dirname(currentFile), file, extname)\n yield referenced\n }\n for (const dir of dirs) {\n const referenced = fs.resolve(dir, file, extname)\n yield referenced\n }\n\n if (fs.fallback !== undefined) {\n const filepath = fs.fallback(file)\n if (filepath !== undefined) yield filepath\n }\n }\n\n private dirname (path: string) {\n const fs = this.options.fs\n assert(fs.dirname, '`fs.dirname` is required for relative reference')\n return fs.dirname!(path)\n }\n\n private lookupError (file: string, roots: string[]) {\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n return err\n }\n}\n","import { Limiter, toPromise, assert, isTagToken, isOutputToken, ParseError, toLiquidAsync, LiquidAsync } from '../util'\nimport { Tokenizer } from './tokenizer'\nimport { ParseStream } from './parse-stream'\nimport { TopLevelToken, OutputToken } from '../tokens'\nimport { Template, Output, HTML } from '../template'\nimport { LiquidCache } from '../cache'\nimport { FS, Loader, LookupType } from '../fs'\nimport { LiquidError, LiquidErrors } from '../util/error'\nimport type { Liquid } from '../liquid'\n\nexport class Parser {\n public parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator\n\n private liquid: Liquid\n private fs: FS\n private cache?: LiquidCache\n private loader: Loader\n private parseLimit: Limiter\n private readFile: LiquidAsync\n\n public constructor (liquid: Liquid) {\n this.liquid = liquid\n this.cache = this.liquid.options.cache\n this.fs = this.liquid.options.fs\n this.parseFile = this.cache ? this._parseFileCached : this._parseFile\n this.loader = new Loader(this.liquid.options)\n this.parseLimit = new Limiter('parse length', liquid.options.parseLimit)\n this.readFile = toLiquidAsync(\n this.fs.readFile?.bind(this.fs) || (async () => { throw new Error('readFile not implemented') }),\n this.fs.readFileSync?.bind(this.fs)\n )\n }\n public parse (html: string, filepath?: string): Template[] {\n html = String(html)\n this.parseLimit.use(html.length)\n const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath)\n const tokens = tokenizer.readTopLevelTokens(this.liquid.options)\n return this.parseTokens(tokens)\n }\n public parseTokens (tokens: TopLevelToken[]) {\n let token\n const templates: Template[] = []\n const errors: LiquidError[] = []\n while ((token = tokens.shift())) {\n try {\n templates.push(this.parseToken(token, tokens))\n } catch (err) {\n if (this.liquid.options.catchAllErrors) errors.push(err as LiquidError)\n else throw err\n }\n }\n if (errors.length) throw new LiquidErrors(errors)\n return templates\n }\n public parseToken (token: TopLevelToken, remainTokens: TopLevelToken[]) {\n try {\n if (isTagToken(token)) {\n const TagClass = this.liquid.tags[token.name]\n assert(TagClass, `tag \"${token.name}\" not found`)\n return new TagClass(token, remainTokens, this.liquid, this)\n }\n if (isOutputToken(token)) {\n return new Output(token as OutputToken, this.liquid)\n }\n return new HTML(token)\n } catch (e) {\n if (LiquidError.is(e)) throw e\n throw new ParseError(e as Error, token)\n }\n }\n public parseStream (tokens: TopLevelToken[]) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n private * _parseFileCached (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator {\n const cache = this.cache!\n const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file\n const tpls = yield cache.read(key)\n if (tpls) return tpls\n\n const task = this._parseFile(file, sync, type, currentFile)\n // sync mode: exec the task and cache the result\n // async mode: cache the task before exec\n const taskOrTpl = sync ? yield task : toPromise(task)\n cache.write(key, taskOrTpl as any)\n // note: concurrent tasks will be reused, cache for failed task is removed until its end\n try { return yield taskOrTpl } catch (err) { cache.remove(key); throw err }\n }\n private * _parseFile (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator {\n const filepath = yield this.loader.lookup(file, type, sync, currentFile)\n return this.parse(yield this.readFile(!!sync, filepath), filepath)\n }\n}\n","export enum TokenKind {\n Number = 1,\n Literal = 2,\n Tag = 4,\n Output = 8,\n HTML = 16,\n Filter = 32,\n Hash = 64,\n PropertyAccess = 128,\n Word = 256,\n Range = 512,\n Quoted = 1024,\n Operator = 2048,\n FilteredValue = 4096,\n Delimited = Tag | Output\n}\n","import { RangeToken, NumberToken, QuotedToken, LiteralToken, PropertyAccessToken, OutputToken, HTMLToken, TagToken, IdentifierToken, DelimitedToken, OperatorToken, ValueToken } from '../tokens'\nimport { TokenKind } from '../parser'\n\nexport function isDelimitedToken (val: any): val is DelimitedToken {\n return !!(getKind(val) & TokenKind.Delimited)\n}\n\nexport function isOperatorToken (val: any): val is OperatorToken {\n return getKind(val) === TokenKind.Operator\n}\n\nexport function isHTMLToken (val: any): val is HTMLToken {\n return getKind(val) === TokenKind.HTML\n}\n\nexport function isOutputToken (val: any): val is OutputToken {\n return getKind(val) === TokenKind.Output\n}\n\nexport function isTagToken (val: any): val is TagToken {\n return getKind(val) === TokenKind.Tag\n}\n\nexport function isQuotedToken (val: any): val is QuotedToken {\n return getKind(val) === TokenKind.Quoted\n}\n\nexport function isLiteralToken (val: any): val is LiteralToken {\n return getKind(val) === TokenKind.Literal\n}\n\nexport function isNumberToken (val: any): val is NumberToken {\n return getKind(val) === TokenKind.Number\n}\n\nexport function isPropertyAccessToken (val: any): val is PropertyAccessToken {\n return getKind(val) === TokenKind.PropertyAccess\n}\n\nexport function isWordToken (val: any): val is IdentifierToken {\n return getKind(val) === TokenKind.Word\n}\n\nexport function isRangeToken (val: any): val is RangeToken {\n return getKind(val) === TokenKind.Range\n}\n\nexport function isValueToken (val: any): val is ValueToken {\n // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range\n return (getKind(val) & 1667) > 0\n}\n\nfunction getKind (val: any) {\n return val ? val.kind : -1\n}\n","import { Drop } from '../drop/drop'\n\nexport interface ScopeObject extends Record {\n toLiquid?: () => any;\n}\n\nexport type Scope = ScopeObject | Drop\n\nexport function createScope (from?: ScopeObject): ScopeObject {\n const scope = Object.create(null)\n if (from) Object.assign(scope, from)\n return scope\n}\n","import { getPerformance } from '../util/performance'\nimport { Drop } from '../drop/drop'\nimport { __assign } from 'tslib'\nimport { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'\nimport { createScope, Scope } from './scope'\nimport { hasOwnProperty, isArray, isNil, isUndefined, isString, isFunction, toLiquid, InternalUndefinedVariableError, toValueSync, isObject, Limiter, toValue } from '../util'\n\ntype PropertyKey = string | number;\n\nexport class Context {\n /**\n * insert a Context-level empty scope,\n * for tags like `{% capture %}` `{% assign %}` to operate\n */\n private scopes: Scope[] = [createScope()]\n private registers = {}\n /**\n * user passed in scope\n * `{% increment %}`, `{% decrement %}` changes this scope,\n * whereas `{% capture %}`, `{% assign %}` only hide this scope\n */\n public environments: Scope\n /**\n * global scope used as fallback for missing variables\n */\n public globals: Scope\n public sync: boolean\n public breakCalled = false\n public continueCalled = false\n /**\n * The normalized liquid options object\n */\n public opts: NormalizedFullOptions\n /**\n * Throw when accessing undefined variable?\n */\n public strictVariables: boolean;\n public ownPropertyOnly: boolean;\n public memoryLimit: Limiter;\n public renderLimit: Limiter;\n public constructor (env: object = {}, opts: NormalizedFullOptions = defaultOptions, renderOptions: RenderOptions = {}, { memoryLimit, renderLimit }: { [key: string]: Limiter } = {}) {\n this.sync = !!renderOptions.sync\n this.opts = opts\n this.globals = renderOptions.globals ?? opts.globals\n this.environments = isObject(env) ? env : Object(env)\n this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables\n this.ownPropertyOnly = renderOptions.ownPropertyOnly ?? opts.ownPropertyOnly\n this.memoryLimit = memoryLimit ?? new Limiter('memory alloc', renderOptions.memoryLimit ?? opts.memoryLimit)\n this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit))\n }\n public getRegister (key: string, defaultValue: T = undefined as T): T {\n return (this.registers[key] = this.registers[key] || defaultValue)\n }\n public setRegister (key: string, value: any) {\n return (this.registers[key] = value)\n }\n public saveRegister (...keys: string[]): [string, any][] {\n return keys.map(key => [key, this.getRegister(key)])\n }\n public restoreRegister (keyValues: [string, any][]) {\n return keyValues.forEach(([key, value]) => this.setRegister(key, value))\n }\n public getAll () {\n return [this.globals, this.environments, ...this.scopes]\n .reduce((ctx, val) => __assign(ctx, val), {})\n }\n /**\n * @deprecated use `_get()` or `getSync()` instead\n */\n public get (paths: PropertyKey[]): unknown {\n return this.getSync(paths)\n }\n public getSync (paths: PropertyKey[]): unknown {\n return toValueSync(this._get(paths))\n }\n public * _get (paths: (PropertyKey | Drop)[]): IterableIterator {\n const scope = this.findScope(paths[0] as string) // first prop should always be a string\n return yield this._getFromScope(scope, paths)\n }\n /**\n * @deprecated use `_get()` instead\n */\n public getFromScope (scope: unknown, paths: PropertyKey[] | string): IterableIterator {\n return toValueSync(this._getFromScope(scope, paths))\n }\n public * _getFromScope (scope: unknown, paths: (PropertyKey | Drop)[] | string, strictVariables = this.strictVariables): IterableIterator {\n if (isString(paths)) paths = paths.split('.')\n for (let i = 0; i < paths.length; i++) {\n scope = yield this.readProperty(scope as object, paths[i])\n if (strictVariables && isUndefined(scope)) {\n throw new InternalUndefinedVariableError((paths as string[]).slice(0, i + 1).join!('.'))\n }\n }\n return scope\n }\n public push (ctx: object) {\n return this.scopes.push(ctx)\n }\n public pop () {\n return this.scopes.pop()\n }\n public bottom () {\n return this.scopes[0]\n }\n public spawn (scope = {}) {\n return new Context(scope, this.opts, {\n sync: this.sync,\n globals: this.globals,\n strictVariables: this.strictVariables,\n ownPropertyOnly: this.ownPropertyOnly\n }, {\n renderLimit: this.renderLimit,\n memoryLimit: this.memoryLimit\n })\n }\n private findScope (key: string | number) {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const candidate = this.scopes[i]\n if (key in candidate) return candidate\n }\n if (key in this.environments) return this.environments\n return this.globals\n }\n readProperty (obj: Scope, key: (PropertyKey | Drop)) {\n obj = toLiquid(obj)\n key = toValue(key) as PropertyKey\n if (isNil(obj)) return obj\n if (isArray(obj) && (key as number) < 0) return obj[obj.length + +key]\n const value = readJSProperty(obj, key, this.ownPropertyOnly)\n if (value === undefined && obj instanceof Drop) return obj.liquidMethodMissing(key, this)\n if (isFunction(value)) return value.call(obj)\n if (key === 'size') return readSize(obj)\n else if (key === 'first') return readFirst(obj)\n else if (key === 'last') return readLast(obj)\n return value\n }\n}\n\nexport function readJSProperty (obj: Scope, key: PropertyKey, ownPropertyOnly: boolean) {\n if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) return undefined\n return obj[key]\n}\n\nfunction readFirst (obj: Scope) {\n if (isArray(obj)) return obj[0]\n return obj['first']\n}\n\nfunction readLast (obj: Scope) {\n if (isArray(obj)) return obj[obj.length - 1]\n return obj['last']\n}\n\nfunction readSize (obj: Scope) {\n if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) return obj['size']\n if (isArray(obj) || isString(obj)) return obj.length\n if (typeof obj === 'object') return Object.keys(obj).length\n}\n","export enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n","import { toNumber, argumentsToNumber } from '../util/underscore'\n\nexport const abs = argumentsToNumber(Math.abs)\nexport const at_least = argumentsToNumber(Math.max)\nexport const at_most = argumentsToNumber(Math.min)\nexport const ceil = argumentsToNumber(Math.ceil)\nexport const divided_by = argumentsToNumber((dividend: number, divisor: number, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor)\nexport const floor = argumentsToNumber(Math.floor)\nexport const minus = argumentsToNumber((v: number, arg: number) => v - arg)\nexport const plus = argumentsToNumber((lhs: number, rhs: number) => lhs + rhs)\nexport const modulo = argumentsToNumber((v: number, arg: number) => v % arg)\nexport const times = argumentsToNumber((v: number, arg: number) => v * arg)\n\nexport function round (v: number, arg = 0) {\n v = toNumber(v)\n arg = toNumber(arg)\n const amp = Math.pow(10, arg)\n const scaled = v * amp\n // Round half away from zero\n return Math.sign(v) * Math.round(Math.abs(scaled)) / amp\n}\n","import { stringify } from '../util/underscore'\n\nexport const url_decode = (x: string) => decodeURIComponent(stringify(x)).replace(/\\+/g, ' ')\nexport const url_encode = (x: string) => encodeURIComponent(stringify(x)).replace(/%20/g, '+')\nexport const cgi_escape = (x: string) => encodeURIComponent(stringify(x))\n .replace(/%20/g, '+')\n .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase())\nexport const uri_escape = (x: string) => encodeURI(stringify(x))\n .replace(/%5B/g, '[')\n .replace(/%5D/g, ']')\n\nconst rSlugifyDefault = /[^\\p{M}\\p{L}\\p{Nd}]+/ug\nconst rSlugifyReplacers = {\n 'raw': /\\s+/g,\n 'default': rSlugifyDefault,\n 'pretty': /[^\\p{M}\\p{L}\\p{Nd}._~!$&'()+,;=@]+/ug,\n 'ascii': /[^A-Za-z0-9]+/g,\n 'latin': rSlugifyDefault,\n 'none': null\n}\n\nexport function slugify (str: string, mode: keyof typeof rSlugifyReplacers = 'default', cased = false): string {\n str = stringify(str)\n\n const replacer = rSlugifyReplacers[mode]\n if (replacer) {\n if (mode === 'latin') str = removeAccents(str)\n str = str.replace(replacer, '-').replace(/^-|-$/g, '')\n }\n\n return cased ? str : str.toLowerCase()\n}\n\nfunction removeAccents (str: string): string {\n return str.replace(/[àáâãäå]/g, 'a')\n .replace(/[æ]/g, 'ae')\n .replace(/[ç]/g, 'c')\n .replace(/[èéêë]/g, 'e')\n .replace(/[ìíîï]/g, 'i')\n .replace(/[ð]/g, 'd')\n .replace(/[ñ]/g, 'n')\n .replace(/[òóôõöø]/g, 'o')\n .replace(/[ùúûü]/g, 'u')\n .replace(/[ýÿ]/g, 'y')\n .replace(/[ß]/g, 'ss')\n .replace(/[œ]/g, 'oe')\n .replace(/[þ]/g, 'th')\n .replace(/[ẞ]/g, 'SS')\n .replace(/[Œ]/g, 'OE')\n .replace(/[Þ]/g, 'TH')\n}\n","import { toArray, argumentsToValue, toValue, stringify, caseInsensitiveCompare, orderedCompare, isArray, isNil, last as arrayLast, isArrayLike, toEnumerable } from '../util'\nimport { arrayIncludes, equals, evalToken, isTruthy } from '../render'\nimport { Value, FilterImpl } from '../template'\nimport { Tokenizer } from '../parser'\nimport type { Scope } from '../context'\nimport { EmptyDrop } from '../drop'\n\nexport const join = argumentsToValue(function (this: FilterImpl, v: any[], arg: string) {\n const array = toArray(v)\n const sep = isNil(arg) ? ' ' : stringify(arg)\n const complexity = array.length * (1 + sep.length)\n this.context.memoryLimit.use(complexity)\n return array.join(sep)\n})\nexport const last = argumentsToValue((v: any) => isArrayLike(v) ? arrayLast(v) : '')\nexport const first = argumentsToValue((v: any) => isArrayLike(v) ? v[0] : '')\nexport const reverse = argumentsToValue(function (this: FilterImpl, v: any[]) {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n return [...array].reverse()\n})\n\nfunction * sortBy (this: FilterImpl, arr: T[], property: string | undefined, comparator: (a: unknown, b: unknown) => number): IterableIterator {\n const values: [T, unknown][] = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n values.push([\n item,\n property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item\n ])\n }\n return values.sort((lhs, rhs) => comparator(lhs[1], rhs[1])).map(tuple => tuple[0])\n}\n\nexport function * sort (this: FilterImpl, arr: T[], property?: string): IterableIterator {\n return yield * sortBy.call(this, arr, property, orderedCompare)\n}\n\nexport function * sort_natural (this: FilterImpl, arr: T[], property?: string): IterableIterator {\n return yield * sortBy.call(this, arr, property, caseInsensitiveCompare)\n}\n\nexport const size = (v: string | any[]) => (v && v.length) || 0\n\nexport function * map (this: FilterImpl, arr: Scope[], property: string): IterableIterator {\n const results = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n results.push(yield this.context._getFromScope(item, stringify(property), false))\n }\n return results\n}\n\nexport function * sum (this: FilterImpl, arr: Scope[], property?: string): IterableIterator {\n let sum = 0\n const array = toArray(arr)\n for (const item of array) {\n const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item)\n sum += Number.isNaN(data) ? 0 : data\n }\n return sum\n}\n\nexport function compact (this: FilterImpl, arr: T[]) {\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n return array.filter(x => !isNil(toValue(x)))\n}\n\nexport function concat (this: FilterImpl, v: T1[], arg: T2[] = []): (T1 | T2)[] {\n const lhs = toArray(v)\n const rhs = toArray(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs.concat(rhs)\n}\n\nexport function push (this: FilterImpl, v: T[], arg: T): T[] {\n return concat.call(this, v, [arg]) as T[]\n}\n\nexport function unshift (this: FilterImpl, v: T[], arg: T): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.unshift(arg)\n return clone\n}\n\nexport function pop (v: T[]): T[] {\n const clone = [...toArray(v)]\n clone.pop()\n return clone\n}\n\nexport function shift (this: FilterImpl, v: T[]): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.shift()\n return clone\n}\n\nexport function slice (this: FilterImpl, v: T[] | string, begin: number, length = 1): T[] | string {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n begin = begin < 0 ? v.length + begin : begin\n this.context.memoryLimit.use(length)\n return v.slice(begin, begin + length)\n}\n\nfunction expectedMatcher (this: FilterImpl, expected: any): (v: any) => boolean {\n if (this.context.opts.jekyllWhere) {\n return (v: any) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected))\n } else if (expected === undefined) {\n return (v: any) => isTruthy(v, this.context)\n } else {\n return (v: any) => equals(v, expected)\n }\n}\n\nfunction * filter (this: FilterImpl, include: boolean, arr: T[], property: string, expected: any): IterableIterator {\n const values: unknown[] = []\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n for (const item of arr) {\n values.push(yield evalToken(token, this.context.spawn(item)))\n }\n const matcher = expectedMatcher.call(this, expected)\n return arr.filter((_, i) => matcher(values[i]) === include)\n}\n\nfunction * filter_exp (this: FilterImpl, include: boolean, arr: T[], itemName: string, exp: string): IterableIterator {\n const filtered: unknown[] = []\n const keyTemplate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n this.context.push({ [itemName]: item })\n const value = yield keyTemplate.value(this.context)\n this.context.pop()\n if (value === include) filtered.push(item)\n }\n return filtered\n}\n\nexport function * where (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n return yield * filter.call(this, true, arr, property, expected)\n}\n\nexport function * reject (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n return yield * filter.call(this, false, arr, property, expected)\n}\n\nexport function * where_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n return yield * filter_exp.call(this, true, arr, itemName, exp)\n}\n\nexport function * reject_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n return yield * filter_exp.call(this, false, arr, itemName, exp)\n}\n\nexport function * group_by (this: FilterImpl, arr: T[], property: string): IterableIterator {\n const map = new Map()\n arr = toEnumerable(arr)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n const key = yield evalToken(token, this.context.spawn(item))\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nexport function * group_by_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const map = new Map()\n const keyTemplate = new Value(stringify(exp), this.liquid)\n arr = toEnumerable(arr)\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n this.context.push({ [itemName]: item })\n const key = yield keyTemplate.value(this.context)\n this.context.pop()\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nfunction * search (this: FilterImpl, arr: T[], property: string, expected: string): IterableIterator {\n const token = new Tokenizer(stringify(property)).readScopeValue()\n const array = toArray(arr)\n const matcher = expectedMatcher.call(this, expected)\n for (let index = 0; index < array.length; index++) {\n const value = yield evalToken(token, this.context.spawn(array[index]))\n if (matcher(value)) return [index, array[index]]\n }\n}\n\nfunction * search_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const predicate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n for (let index = 0; index < array.length; index++) {\n this.context.push({ [itemName]: array[index] })\n const value = yield predicate.value(this.context)\n this.context.pop()\n if (value) return [index, array[index]]\n }\n}\n\nexport function * has (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n const result = yield * search.call(this, arr, property, expected)\n return !!result\n}\n\nexport function * has_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return !!result\n}\n\nexport function * find_index (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[0] : undefined\n}\n\nexport function * find_index_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[0] : undefined\n}\n\nexport function * find (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[1] : undefined\n}\n\nexport function * find_exp (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[1] : undefined\n}\n\nexport function uniq (this: FilterImpl, arr: T[]): T[] {\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n return [...new Set(arr)]\n}\n\nexport function sample (this: FilterImpl, v: T[] | string, count = 1): T | string | (T | string)[] {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n this.context.memoryLimit.use(count)\n const shuffled = [...v].sort(() => Math.random() - 0.5)\n if (count === 1) return shuffled[0]\n return shuffled.slice(0, count)\n}\n","import { toValue, stringify, isString, isNumber, LiquidDate, strftime, isNil } from '../util'\nimport { FilterImpl } from '../template'\nimport { NormalizedFullOptions } from '../liquid-options'\n\nexport function date (this: FilterImpl, v: string | Date, format?: string, timezoneOffset?: number | string) {\n const size = ((v as string)?.length ?? 0) + ((timezoneOffset as string)?.length ?? 0)\n this.context.memoryLimit.use(size)\n const date = parseDate(v, this.context.opts, timezoneOffset)\n if (!date) return v\n format = toValue(format)\n format = isNil(format) ? this.context.opts.dateFormat : stringify(format)\n this.context.memoryLimit.use(format.length)\n return strftime(date, format, this.context.memoryLimit)\n}\n\nexport function date_to_xmlschema (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z')\n}\n\nexport function date_to_rfc822 (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z')\n}\n\nexport function date_to_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%b', type, style)\n}\n\nexport function date_to_long_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%B', type, style)\n}\n\nfunction stringify_date (this: FilterImpl, v: string | Date, month_type: string, type?: string, style?: string) {\n const date = parseDate(v, this.context.opts)\n if (!date) return v\n const ml = this.context.memoryLimit\n if (type === 'ordinal') {\n const d = date.getDate()\n return style === 'US'\n ? strftime(date, `${month_type} ${d}%q, %Y`, ml)\n : strftime(date, `${d}%q ${month_type} %Y`, ml)\n }\n return strftime(date, `%d ${month_type} %Y`, ml)\n}\n\nfunction parseDate (v: string | Date, opts: NormalizedFullOptions, timezoneOffset?: number | string): LiquidDate | undefined {\n let date: LiquidDate | undefined\n const defaultTimezoneOffset = timezoneOffset ?? opts.timezoneOffset\n const locale = opts.locale\n v = toValue(v)\n if (isNil(v)) {\n return undefined\n } else if (v === 'now' || v === 'today') {\n date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset)\n } else if (isNumber(v)) {\n date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset)\n } else if (isString(v)) {\n if (/^\\d+$/.test(v)) {\n date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset)\n } else if (opts.preserveTimezones && timezoneOffset === undefined) {\n date = LiquidDate.createDateFixedToTimezone(v, locale)\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n return date.valid() ? date : undefined\n}\n","/**\n * String related filters\n *\n * * prefer stringify() to String() since `undefined`, `null` should eval ''\n */\n\n// Han (Chinese) characters: \\u4E00-\\u9FFF\n// Additional Han characters: \\uF900-\\uFAFF (CJK Compatibility Ideographs)\n// Additional Han characters: \\u3400-\\u4DBF (CJK Unified Ideographs Extension A)\n// Katakana (Japanese): \\u30A0-\\u30FF\n// Hiragana (Japanese): \\u3040-\\u309F\n// Hangul (Korean): \\uAC00-\\uD7AF\nimport { FilterImpl } from '../template'\nimport { assert, stringify } from '../util'\n\nconst rCJKWord = /[\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/gu\n\n// Word boundary followed by word characters (for detecting words)\nconst rNonCJKWord = /[^\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF\\s]+/gu\n\nexport function append (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'append expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs + rhs\n}\n\nexport function prepend (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'prepend expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return rhs + lhs\n}\n\nexport function lstrip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = stringify(chars)\n this.context.memoryLimit.use(chars.length)\n for (let i = 0, set = new Set(chars); i < str.length; i++) {\n if (!set.has(str[i])) return str.slice(i)\n }\n return ''\n }\n return str.trimStart()\n}\n\nexport function downcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.toLowerCase()\n}\n\nexport function upcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return stringify(str).toUpperCase()\n}\n\nexport function remove (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n arg = stringify(arg)\n this.context.memoryLimit.use(str.length + arg.length)\n return str.split(arg).join('')\n}\n\nexport function remove_first (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n l = stringify(l)\n this.context.memoryLimit.use(str.length + l.length)\n return str.replace(l, '')\n}\n\nexport function remove_last (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n const pattern = stringify(l)\n this.context.memoryLimit.use(str.length + pattern.length)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n return str.substring(0, index) + str.substring(index + pattern.length)\n}\n\nexport function rstrip (this: FilterImpl, str: string, chars?: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = stringify(chars)\n this.context.memoryLimit.use(chars.length)\n for (let i = str.length - 1, set = new Set(chars); i >= 0; i--) {\n if (!set.has(str[i])) return str.slice(0, i + 1)\n }\n return ''\n }\n return str.trimEnd()\n}\n\nexport function split (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const arr = str.split(stringify(arg))\n // align to ruby split, which is the behavior of shopify/liquid\n // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split\n while (arr.length && arr[arr.length - 1] === '') arr.pop()\n return arr\n}\n\nexport function strip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n const set = new Set(stringify(chars))\n this.context.memoryLimit.use(set.size)\n let i = 0\n let j = str.length - 1\n while (set.has(str[i])) i++\n while (j >= i && set.has(str[j])) j--\n return str.slice(i, j + 1)\n }\n return str.trim()\n}\n\nexport function strip_newlines (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '')\n}\n\nexport function capitalize (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport function replace (this: FilterImpl, v: string, pattern: string, replacement: string) {\n const str = stringify(v)\n pattern = stringify(pattern)\n replacement = stringify(replacement)\n const parts = str.split(pattern)\n const outputSize = str.length + (parts.length - 1) * (replacement.length - pattern.length)\n this.context.memoryLimit.use(outputSize)\n return parts.join(replacement)\n}\n\nexport function replace_first (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n arg1 = stringify(arg1)\n arg2 = stringify(arg2)\n this.context.memoryLimit.use(str.length + arg1.length + arg2.length)\n return str.replace(arg1, () => arg2)\n}\n\nexport function replace_last (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n const pattern = stringify(arg1)\n const replacement = stringify(arg2)\n this.context.memoryLimit.use(str.length + pattern.length + replacement.length)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n return str.substring(0, index) + replacement + str.substring(index + pattern.length)\n}\n\nexport function truncate (this: FilterImpl, v: string, l = 50, o = '...') {\n const str = stringify(v)\n o = stringify(o)\n this.context.memoryLimit.use(str.length + o.length)\n if (str.length <= l) return v\n return str.substring(0, l - o.length) + o\n}\n\nexport function truncatewords (this: FilterImpl, v: string, words = 15, o = '...') {\n const str = stringify(v)\n o = stringify(o)\n this.context.memoryLimit.use(str.length + o.length)\n const arr = str.split(/\\s+/)\n if (words <= 0) words = 1\n let ret = arr.slice(0, words).join(' ')\n if (arr.length >= words) ret += o\n return ret\n}\n\nexport function normalize_whitespace (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\s+/g, ' ')\n}\n\nexport function number_of_words (this: FilterImpl, input: string, mode?: 'cjk' | 'auto') {\n const str = stringify(input)\n this.context.memoryLimit.use(str.length)\n input = str.trim()\n if (!input) return 0\n switch (mode) {\n case 'cjk':\n // Count CJK characters and words\n return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length\n case 'auto':\n // Count CJK characters, if none, count words\n return rCJKWord.test(input)\n ? input.match(rCJKWord)!.length + (input.match(rNonCJKWord) || []).length\n : input.split(/\\s+/).length\n default:\n // Count words only\n return input.split(/\\s+/).length\n }\n}\n\nexport function array_to_sentence_string (this: FilterImpl, array: unknown[], connector = 'and') {\n connector = stringify(connector)\n this.context.memoryLimit.use(array.length + connector.length)\n switch (array.length) {\n case 0:\n return ''\n case 1:\n return array[0]\n case 2:\n return `${array[0]} ${connector} ${array[1]}`\n default:\n return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`\n }\n}\n","\nexport function base64Encode (str: string): string {\n return btoa(String.fromCharCode(...new TextEncoder().encode(str)))\n}\n\nexport function base64Decode (str: string): string {\n return new TextDecoder().decode(\n Uint8Array.from(atob(str), c => c.charCodeAt(0))\n )\n}\n","/**\n * Base64 related filters\n *\n * Implements base64_encode and base64_decode filters for Shopify compatibility\n */\n\nimport { FilterImpl } from '../template'\nimport { stringify } from '../util'\nimport { base64Encode, base64Decode } from './base64-impl'\n\nexport function base64_encode (this: FilterImpl, value: string | Buffer): string {\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n this.context.memoryLimit.use(value.byteLength)\n return value.toString('base64')\n }\n const str = stringify(value)\n this.context.memoryLimit.use(str.length)\n return base64Encode(str)\n}\n\nexport function base64_decode (this: FilterImpl, value: string): string {\n const str = stringify(value)\n this.context.memoryLimit.use(str.length)\n return base64Decode(str)\n}\n","function bufferToHex (buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let hex = ''\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, '0')\n }\n return hex\n}\n\nexport async function sha256 (str: string): Promise {\n const data = new TextEncoder().encode(str)\n const digest = await crypto.subtle.digest('SHA-256', data)\n return bufferToHex(digest)\n}\n\nexport async function hmacSha256 (str: string, key: string): Promise {\n const encoder = new TextEncoder()\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(key),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(str))\n return bufferToHex(signature)\n}\n","/**\n * Crypto related filters\n *\n * Implements sha256 and hmac_sha256 filters for Shopify compatibility\n */\n\nimport { FilterImpl } from '../template'\nimport { stringify } from '../util'\nimport { sha256 as sha256Impl, hmacSha256 as hmacSha256Impl } from './crypto-impl'\n\nexport function sha256 (this: FilterImpl, value: unknown): string | Promise {\n const str = stringify(value)\n this.context.memoryLimit.use(str.length)\n return sha256Impl(str)\n}\n\nexport function hmac_sha256 (this: FilterImpl, value: unknown, key: unknown): string | Promise {\n const str = stringify(value)\n const keyStr = stringify(key)\n this.context.memoryLimit.use(str.length + keyStr.length)\n return hmacSha256Impl(str, keyStr)\n}\n","import * as htmlFilters from './html'\nimport * as mathFilters from './math'\nimport * as urlFilters from './url'\nimport * as arrayFilters from './array'\nimport * as dateFilters from './date'\nimport * as stringFilters from './string'\nimport * as base64Filters from './base64'\nimport * as cryptoFilters from './crypto'\nimport misc from './misc'\nimport { FilterImplOptions } from '../template'\n\nexport const filters: Record = {\n ...htmlFilters,\n ...mathFilters,\n ...urlFilters,\n ...arrayFilters,\n ...dateFilters,\n ...stringFilters,\n ...base64Filters,\n ...cryptoFilters,\n ...misc\n}\n","import { Value, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private key: string\n private value: Value\n private identifier: IdentifierToken\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.key = this.identifier.content\n this.tokenizer.assert(this.key, 'expected variable name')\n\n this.tokenizer.skipBlank()\n this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected \"=\"')\n\n this.tokenizer.advance()\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n * render (ctx: Context): Generator {\n ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { Hash, ValueToken, Liquid, Tag, evalToken, Emitter, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { assertEmpty, isValueToken, toEnumerable } from '../util'\nimport { createScope } from '../context/scope'\nimport { ForloopDrop } from '../drop/forloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nconst MODIFIERS = ['offset', 'limit', 'reversed']\n\ntype valueOf = T[keyof T]\n\nexport default class extends Tag {\n variable: string\n collection: ValueToken\n hash: Hash\n templates: Template[]\n elseTemplates: Template[]\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n const inStr = this.tokenizer.readIdentifier()\n const collection = this.tokenizer.readValue()\n if (!variable.size() || inStr.content !== 'in' || !collection) {\n throw new Error(`illegal tag: ${token.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collection\n this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates })\n .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${token.getText()} not closed`) })\n\n stream.start()\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n\n if (!collection.length) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n return\n }\n\n const continueKey = 'continue-' + this.variable + '-' + this.collection.getText()\n ctx.push(createScope({ continue: ctx.getRegister(continueKey, {}) }))\n const hash = yield this.hash.render(ctx)\n ctx.pop()\n\n const modifiers = this.liquid.options.orderedFilterParameters\n ? Object.keys(hash).filter(x => MODIFIERS.includes(x))\n : MODIFIERS.filter(x => hash[x] !== undefined)\n\n collection = modifiers.reduce((collection, modifier: valueOf) => {\n if (modifier === 'offset') return offset(collection, hash['offset'])\n if (modifier === 'limit') return limit(collection, hash['limit'])\n return reversed(collection)\n }, collection)\n\n ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length)\n const scope = createScope({ forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) })\n ctx.push(scope)\n for (const item of collection) {\n scope[this.variable] = item\n ctx.continueCalled = ctx.breakCalled = false\n yield r.renderTemplates(this.templates, ctx, emitter)\n if (ctx.breakCalled) break\n scope.forloop.next()\n }\n ctx.continueCalled = ctx.breakCalled = false\n ctx.pop()\n }\n\n public * children (): Generator {\n const templates = this.templates.slice()\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): Iterable {\n return [this.variable, 'forloop']\n }\n}\n\nfunction reversed (arr: Array) {\n return [...arr].reverse()\n}\n\nfunction offset (arr: Array, count: number) {\n return arr.slice(count)\n}\n\nfunction limit (arr: Array, count: number) {\n return arr.slice(0, count)\n}\n","import { Liquid, Tag, Template, Context, TagToken, TopLevelToken } from '..'\nimport { Parser } from '../parser'\nimport { IdentifierToken, QuotedToken } from '../tokens'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n identifier: IdentifierToken | QuotedToken\n variable: string\n templates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.identifier = this.readVariable()\n this.variable = this.identifier.content\n\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcapture') return\n this.templates.push(parser.parseToken(token, remainTokens))\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n\n private readVariable (): IdentifierToken | QuotedToken {\n let ident: IdentifierToken | QuotedToken | undefined = this.tokenizer.readIdentifier()\n if (ident.content) return ident\n ident = this.tokenizer.readQuoted()\n if (ident) return ident\n throw this.tokenizer.error('invalid capture name')\n }\n\n * render (ctx: Context): Generator {\n const r = this.liquid.renderer\n const html = yield r.renderTemplates(this.templates, ctx)\n ctx.bottom()[this.variable] = html\n }\n\n public * children (): Generator {\n return this.templates\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { ValueToken, Liquid, toValue, evalToken, Value, Emitter, TagToken, TopLevelToken, Context, Template, Tag, ParseStream } from '..'\nimport { Parser } from '../parser'\nimport { equals } from '../render'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n value: Value\n branches: { values: ValueToken[], templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n this.elseTemplates = []\n\n let p: Template[] = []\n let elseCount = 0\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n if (elseCount > 0) {\n return\n }\n\n p = []\n\n const values: ValueToken[] = []\n while (!token.tokenizer.end()) {\n values.push(token.tokenizer.readValueOrThrow())\n token.tokenizer.skipBlank()\n if (token.tokenizer.peek() === ',') {\n token.tokenizer.readTo(',')\n } else {\n token.tokenizer.readTo('or')\n }\n }\n this.branches.push({\n values,\n templates: p\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf))\n let branchHit = false\n for (const branch of this.branches) {\n for (const valueToken of branch.values) {\n const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf)\n if (equals(target, value)) {\n yield r.renderTemplates(branch.templates, ctx, emitter)\n branchHit = true\n break\n }\n }\n }\n if (!branchHit) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n }\n\n public * arguments (): Arguments {\n yield this.value\n yield * this.branches.flatMap(b => b.values)\n }\n\n public * children (): Generator {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n}\n","import { Liquid, TopLevelToken, TagToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcomment') return\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {}\n}\n","import { __assign } from 'tslib'\nimport { ForloopDrop } from '../drop'\nimport { isString, isValueToken, toEnumerable } from '../util'\nimport { TopLevelToken, assert, Liquid, Token, Template, evalQuotedToken, TypeGuards, Tokenizer, evalToken, Hash, Emitter, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\n\nexport type ParsedFileName = Template[] | Token | string | undefined\n\nexport default class extends Tag {\n private file: ParsedFileName\n private currentFile?: string\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokenizer = this.tokenizer\n this.file = parseFilePath(tokenizer, this.liquid, parser)\n this.currentFile = token.file\n while (!tokenizer.end()) {\n tokenizer.skipBlank()\n const begin = tokenizer.p\n const keyword = tokenizer.readIdentifier()\n if (keyword.content === 'with' || keyword.content === 'for') {\n tokenizer.skipBlank()\n // can be normal key/value pair, like \"with: true\"\n if (tokenizer.peek() !== ':') {\n const value = tokenizer.readValue()\n // can be normal key, like \"with,\"\n if (value) {\n const beforeAs = tokenizer.p\n const asStr = tokenizer.readIdentifier()\n let alias\n if (asStr.content === 'as') alias = tokenizer.readIdentifier()\n else tokenizer.p = beforeAs\n\n this[keyword.content] = { value, alias: alias && alias.content }\n tokenizer.skipBlank()\n if (tokenizer.peek() === ',') tokenizer.advance()\n continue // matched!\n }\n }\n }\n /**\n * restore cursor if with/for not matched\n */\n tokenizer.p = begin\n break\n }\n this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const { liquid, hash } = this\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const childCtx = ctx.spawn()\n const scope = childCtx.bottom()\n __assign(scope, yield hash.render(ctx))\n if (this['with']) {\n const { value, alias } = this['with']\n scope[alias || filepath] = yield evalToken(value, ctx)\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n const collection = toEnumerable(yield evalToken(value, ctx))\n scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias)\n for (const item of collection) {\n scope[alias] = item\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n scope['forloop'].next()\n }\n } else {\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n }\n }\n\n public * children (partials: boolean, sync: boolean): Generator {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n const names: Array = Object.keys(this.hash.hash)\n\n if (this['with']) {\n const { value, alias } = this['with']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n return { name: this['file'], isolated: true, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (this['with']) {\n const { value } = this['with']\n if (isValueToken(value)) {\n yield value\n }\n }\n\n if (this['for']) {\n const { value } = this['for']\n if (isValueToken(value)) {\n yield value\n }\n }\n }\n}\n\n/**\n * @return null for \"none\",\n * @return Template[] for quoted with tags and/or filters\n * @return Token for expression (not quoted)\n * @throws TypeError if cannot read next token\n */\nexport function parseFilePath (tokenizer: Tokenizer, liquid: Liquid, parser: Parser): ParsedFileName {\n if (liquid.options.dynamicPartials) {\n const file = tokenizer.readValue()\n tokenizer.assert(file, 'illegal file path')\n if (file!.getText() === 'none') return\n if (TypeGuards.isQuotedToken(file)) {\n // for filenames like \"files/{{file}}\", eval as liquid template\n const templates = parser.parse(evalQuotedToken(file))\n return optimize(templates)\n }\n return file\n }\n const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]\n const templates = optimize(parser.parseTokens(tokens))\n return templates === 'none' ? undefined : templates\n}\n\nfunction optimize (templates: Template[]): string | Template[] {\n // for filenames like \"files/file.liquid\", extract the string directly\n if (templates.length === 1 && TypeGuards.isHTMLToken(templates[0].token)) return templates[0].token.getContent()\n return templates\n}\n\nexport function * renderFilePath (file: ParsedFileName, ctx: Context, liquid: Liquid): IterableIterator {\n if (typeof file === 'string') return file\n if (Array.isArray(file)) return liquid.renderer.renderTemplates(file, ctx)\n return yield evalToken(file, ctx)\n}\n","import { Template, ValueToken, TopLevelToken, Liquid, Tag, assert, evalToken, Hash, Emitter, TagToken, Context } from '..'\nimport { BlockMode, createScope, Scope } from '../context'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\nimport { parseFilePath, renderFilePath } from './render'\n\nexport default class extends Tag {\n private withVar?: ValueToken\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const { tokenizer } = token\n this['file'] = parseFilePath(tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n\n const begin = tokenizer.p\n const withStr = tokenizer.readIdentifier()\n if (withStr.content === 'with') {\n tokenizer.skipBlank()\n if (tokenizer.peek() !== ':') {\n this.withVar = tokenizer.readValue()\n } else tokenizer.p = begin\n } else tokenizer.p = begin\n\n this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const { liquid, hash, withVar } = this\n const { renderer } = liquid\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const saved = ctx.saveRegister('blocks', 'blockMode')\n ctx.setRegister('blocks', {})\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n const scope = createScope((yield hash.render(ctx)) as Scope)\n if (withVar) scope[filepath] = yield evalToken(withVar, ctx)\n const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n ctx.push(ctx.opts.jekyllInclude ? createScope({ include: scope }) : scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n ctx.restoreRegister(saved)\n }\n\n public * children (partials: boolean, sync: boolean): Generator {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n let names: Array\n\n if (this.liquid.options.jekyllInclude) {\n names = ['include']\n } else {\n names = Object.keys(this.hash.hash)\n if (this.withVar) {\n names.push([this['file'], this.withVar])\n }\n }\n\n return { name: this['file'], isolated: false, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n yield * Object.values(this.hash.hash).filter(isValueToken)\n\n if (isValueToken(this['file'])) {\n yield this['file']\n }\n\n if (isValueToken(this.withVar)) {\n yield this.withVar\n }\n }\n}\n","import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\nimport { isNumber, stringify } from '../util'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n emitter.write(stringify(--scope[this.variable]))\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { TopLevelToken, Liquid, ValueToken, evalToken, Emitter, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private candidates: ValueToken[] = []\n private group?: ValueToken\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n const group = this.tokenizer.readValue()\n this.tokenizer.skipBlank()\n\n if (group) {\n if (this.tokenizer.peek() === ':') {\n this.group = group\n this.tokenizer.advance()\n } else this.candidates.push(group)\n }\n\n while (!this.tokenizer.end()) {\n const value = this.tokenizer.readValue()\n if (value) this.candidates.push(value)\n this.tokenizer.readTo(',')\n }\n this.tokenizer.assert(this.candidates.length, () => `empty candidates: \"${token.getText()}\"`)\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const group = (yield evalToken(this.group, ctx)) as ValueToken\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = ctx.getRegister('cycle', {} as Record)\n let idx = groups[fingerprint]\n\n if (idx === undefined) {\n idx = groups[fingerprint] = 0\n }\n\n const candidate = this.candidates[idx]\n idx = (idx + 1) % this.candidates.length\n groups[fingerprint] = idx\n return yield evalToken(candidate, ctx)\n }\n\n public * arguments (): Arguments {\n yield * this.candidates\n\n if (this.group) {\n yield this.group\n }\n }\n}\n","import { Liquid, Tag, Value, Emitter, isTruthy, TagToken, TopLevelToken, Context, Template } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\nimport { assert, assertEmpty } from '../util'\n\nexport default class extends Tag {\n branches: { value: Value, templates: Template[] }[] = []\n elseTemplates: Template[] | undefined\n\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n assert(!this.elseTemplates, 'unexpected elsif after else')\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n })\n })\n .on('tag:else', tag => {\n assertEmpty(tag.args)\n assert(!this.elseTemplates, 'duplicated else')\n p = this.elseTemplates = []\n })\n .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n\n for (const { value, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (isTruthy(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n yield r.renderTemplates(this.elseTemplates || [], ctx, emitter)\n }\n\n public * children (): Generator {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { isNumber, stringify } from '../util'\nimport { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n const val = scope[this.variable]\n scope[this.variable]++\n emitter.write(stringify(val))\n }\n\n public * localScope (): Iterable {\n yield this.identifier\n }\n}\n","import { Scope, Template, Liquid, Tag, assert, Emitter, Hash, TagToken, TopLevelToken, Context } from '..'\nimport { BlockMode, createScope } from '../context'\nimport { parseFilePath, renderFilePath, ParsedFileName } from './render'\nimport { BlankDrop } from '../drop'\nimport { Parser } from '../parser'\nimport { Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\n\nexport default class extends Tag {\n args: Hash\n templates: Template[]\n file?: ParsedFileName\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n this.file = parseFilePath(this.tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = parser.parseTokens(remainTokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n const { liquid, args, file } = this\n const { renderer } = liquid\n if (file === undefined) {\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n yield renderer.renderTemplates(this.templates, ctx, emitter)\n return\n }\n const filepath = (yield renderFilePath(this.file, ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n\n // render remaining contents and store rendered results\n ctx.setRegister('blockMode', BlockMode.STORE)\n const html = yield renderer.renderTemplates(this.templates, ctx)\n const blocks = ctx.getRegister('blocks', {} as Record)\n\n // set whole content to anonymous block if anonymous doesn't specified\n if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n\n // render the layout file use stored blocks\n ctx.push(createScope((yield args.render(ctx)) as Scope))\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n\n public * children (partials: boolean): Generator {\n const templates = this.templates.slice()\n\n if (partials && isString(this.file)) {\n templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])) as Template[])\n }\n\n return templates\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (isValueToken(this.file)) {\n yield this.file\n }\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this.file)) {\n return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }\n }\n }\n}\n","import { BlockMode, createScope } from '../context'\nimport { isTagToken } from '../util'\nimport { BlockDrop } from '../drop'\nimport { Liquid, TagToken, TopLevelToken, Template, Context, Emitter, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n block: string\n templates: Template[] = []\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endblock') return\n const template = parser.parseToken(token, remainTokens)\n this.templates.push(template)\n }\n throw new Error(`tag ${token.getText()} not closed`)\n }\n\n * render (ctx: Context, emitter: Emitter) {\n const blockRender = this.getBlockRender(ctx)\n if (ctx.getRegister('blockMode') === BlockMode.STORE) {\n ctx.getRegister('blocks', {} as Record)[this.block] = blockRender\n } else {\n yield blockRender(new BlockDrop(), emitter)\n }\n }\n\n private getBlockRender (ctx: Context) {\n const self = this as Tag\n const { liquid, templates } = this\n const renderChild = ctx.getRegister('blocks', {} as Record)[this.block]\n const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {\n const stack: Tag[] = ctx.getRegister('blockStack', [])\n if (stack.includes(self)) throw new Error('block tag cannot be nested')\n\n stack.push(self)\n ctx.push(createScope({ block: superBlock }))\n yield liquid.renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n stack.pop()\n }\n return renderChild\n ? (superBlock: BlockDrop, emitter: Emitter) => renderChild(\n new BlockDrop(\n (emitter: Emitter) => renderCurrent(superBlock, emitter)\n ),\n emitter)\n : renderCurrent\n }\n\n public * children (): Generator {\n return this.templates\n }\n\n public blockScope (): Iterable {\n return ['block']\n }\n}\n","import { Liquid, TagToken, TopLevelToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n private tokens: TopLevelToken[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endraw') return\n this.tokens.push(token)\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {\n return this.tokens.map((token: TopLevelToken) => token.getText()).join('')\n }\n}\n","import { ForloopDrop } from './forloop-drop'\n\nexport class TablerowloopDrop extends ForloopDrop {\n private cols: number\n public constructor (length: number, cols: number, collection: string, variable: string) {\n super(length, collection, variable)\n this.length = length\n this.cols = cols\n }\n public row () {\n return Math.floor(this.i / this.cols) + 1\n }\n public col0 () {\n return (this.i % this.cols)\n }\n public col () {\n return this.col0() + 1\n }\n public col_first () { // eslint-disable-line\n return this.col0() === 0\n }\n public col_last () { // eslint-disable-line\n return this.col() === this.cols\n }\n}\n","import { isValueToken, toEnumerable } from '../util'\nimport { createScope } from '../context/scope'\nimport { ValueToken, Liquid, Tag, evalToken, Emitter, Hash, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { TablerowloopDrop } from '../drop/tablerowloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n variable: string\n args: Hash\n templates: Template[]\n collection: ValueToken\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n this.tokenizer.skipBlank()\n\n const predicate = this.tokenizer.readIdentifier()\n const collectionToken = this.tokenizer.readValue()\n if (predicate.content !== 'in' || !collectionToken) {\n throw new Error(`illegal tag: ${tagToken.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collectionToken\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n const args = (yield this.args.render(ctx)) as Record\n const offset = args.offset || 0\n const limit = (args.limit === undefined) ? collection.length : args.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = args.cols || collection.length\n\n const r = this.liquid.renderer\n const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable)\n const scope = createScope({ tablerowloop })\n ctx.push(scope)\n\n for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {\n scope[this.variable] = collection[idx]\n if (tablerowloop.col0() === 0) {\n if (tablerowloop.row() !== 1) emitter.write('')\n emitter.write(``)\n }\n emitter.write(``)\n yield r.renderTemplates(this.templates, ctx, emitter)\n emitter.write('')\n }\n if (collection.length) emitter.write('')\n ctx.pop()\n }\n\n public * children (): Generator {\n return this.templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): string[] {\n return [this.variable, 'tablerowloop']\n }\n}\n","import { Liquid, Tag, Value, TopLevelToken, Template, Emitter, isTruthy, isFalsy, Context, TagToken } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n branches: { value: Value, test: (val: any, ctx: Context) => boolean, templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n let elseCount = 0\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n test: isFalsy,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n if (elseCount > 0) {\n p = []\n return\n }\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n test: isTruthy,\n templates: (p = [])\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endunless', function () { this.stop() })\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator {\n const r = this.liquid.renderer\n\n for (const { value, test, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (test(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n\n public * children (): Generator {\n const children = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n children.push(...this.elseTemplates)\n }\n return children\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { Context, Emitter, Tag } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.breakCalled = true\n }\n}\n","import { Tag, Emitter, Context } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.continueCalled = true\n }\n}\n","import { Liquid, TopLevelToken, Emitter, Value, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private value?: Value\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.tokenizer.skipBlank()\n if (!this.tokenizer.end()) {\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n if (!this.value) return\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n if (this.value) {\n yield this.value\n }\n }\n}\n","import { Template, Emitter, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n templates: Template[]\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options)\n this.templates = parser.parseTokens(tokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator {\n yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter)\n }\n\n public * children (): Generator {\n return this.templates\n }\n}\n","import { TagToken, Liquid, TopLevelToken, Tag } from '..'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n if (tagToken.args.search(/\\n\\s*[^#\\s]/g) !== -1) {\n throw new Error('every line of an inline comment must start with a \\'#\\' character')\n }\n }\n render () { }\n}\n","import AssignTag from './assign'\nimport ForTag from './for'\nimport CaptureTag from './capture'\nimport CaseTag from './case'\nimport CommentTag from './comment'\nimport IncludeTag from './include'\nimport RenderTag from './render'\nimport DecrementTag from './decrement'\nimport CycleTag from './cycle'\nimport IfTag from './if'\nimport IncrementTag from './increment'\nimport LayoutTag from './layout'\nimport BlockTag from './block'\nimport RawTag from './raw'\nimport TablerowTag from './tablerow'\nimport UnlessTag from './unless'\nimport BreakTag from './break'\nimport ContinueTag from './continue'\nimport EchoTag from './echo'\nimport LiquidTag from './liquid'\nimport InlineCommentTag from './inline-comment'\nimport type { TagClass } from '../template/tag'\n\nexport const tags: Record = {\n assign: AssignTag,\n 'for': ForTag,\n capture: CaptureTag,\n 'case': CaseTag,\n comment: CommentTag,\n include: IncludeTag,\n render: RenderTag,\n decrement: DecrementTag,\n increment: IncrementTag,\n cycle: CycleTag,\n 'if': IfTag,\n layout: LayoutTag,\n block: BlockTag,\n raw: RawTag,\n tablerow: TablerowTag,\n unless: UnlessTag,\n 'break': BreakTag,\n 'continue': ContinueTag,\n echo: EchoTag,\n liquid: LiquidTag,\n '#': InlineCommentTag\n}\n\nexport { AssignTag, ForTag, CaptureTag, CaseTag, CommentTag, IncludeTag, RenderTag, DecrementTag, IncrementTag, CycleTag, IfTag, LayoutTag, BlockTag, RawTag, TablerowTag, UnlessTag, BreakTag, ContinueTag, EchoTag, LiquidTag, InlineCommentTag }\n","import { Context } from './context'\nimport { toPromise, toValueSync, isFunction, forOwn, isString, strictUniq } from './util'\nimport { TagClass, createTagClass, TagImplOptions, FilterImplOptions, Template, Value, StaticAnalysisOptions, StaticAnalysis, analyze, analyzeSync, SegmentArray } from './template'\nimport { LookupType } from './fs/loader'\nimport { Render } from './render'\nimport { Parser } from './parser'\nimport { tags } from './tags'\nimport { filters } from './filters'\nimport { LiquidOptions, normalizeDirectoryList, NormalizedFullOptions, normalize, RenderOptions, RenderFileOptions } from './liquid-options'\n\nexport class Liquid {\n public readonly options: NormalizedFullOptions\n public readonly renderer = new Render()\n /**\n * @deprecated will be removed. In tags use `this.parser` instead\n */\n public readonly parser: Parser\n public readonly filters: Record = Object.create(null)\n public readonly tags: Record = Object.create(null)\n\n public constructor (opts: LiquidOptions = {}) {\n this.options = normalize(opts)\n // eslint-disable-next-line deprecation/deprecation\n this.parser = new Parser(this)\n forOwn(tags, (conf: TagClass, name: string) => this.registerTag(name, conf))\n forOwn(filters, (handler: FilterImplOptions, name: string) => this.registerFilter(name, handler))\n }\n public parse (html: string, filepath?: string): Template[] {\n const parser = new Parser(this)\n return parser.parse(html, filepath)\n }\n\n public _render (tpl: Template[], scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator {\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplates(tpl, ctx)\n }\n public async render (tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise {\n return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false }))\n }\n public renderSync (tpl: Template[], scope?: object, renderOptions?: RenderOptions): any {\n return toValueSync(this._render(tpl, scope, { ...renderOptions, sync: true }))\n }\n public renderToNodeStream (tpl: Template[], scope?: object, renderOptions: RenderOptions = {}): NodeJS.ReadableStream {\n const ctx = new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplatesToNodeStream(tpl, ctx)\n }\n\n public _parseAndRender (html: string, scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator {\n const tpl = this.parse(html)\n return this._render(tpl, scope, renderOptions)\n }\n public async parseAndRender (html: string, scope?: Context | object, renderOptions?: RenderOptions): Promise {\n return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false }))\n }\n public parseAndRenderSync (html: string, scope?: Context | object, renderOptions?: RenderOptions): any {\n return toValueSync(this._parseAndRender(html, scope, { ...renderOptions, sync: true }))\n }\n\n public _parsePartialFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile)\n }\n public _parseLayoutFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile)\n }\n public _parseFile (file: string, sync?: boolean, lookupType?: LookupType, currentFile?: string): Generator {\n return new Parser(this).parseFile(file, sync, lookupType, currentFile)\n }\n public async parseFile (file: string, lookupType?: LookupType): Promise {\n return toPromise(new Parser(this).parseFile(file, false, lookupType))\n }\n public parseFileSync (file: string, lookupType?: LookupType): Template[] {\n return toValueSync(new Parser(this).parseFile(file, true, lookupType))\n }\n public * _renderFile (file: string, ctx: Context | object | undefined, renderFileOptions: RenderFileOptions): Generator {\n const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)) as Template[]\n return yield this._render(templates, ctx, renderFileOptions)\n }\n public async renderFile (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toPromise(this._renderFile(file, ctx, { ...renderFileOptions, sync: false }))\n }\n public renderFileSync (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toValueSync(this._renderFile(file, ctx, { ...renderFileOptions, sync: true }))\n }\n public async renderFileToNodeStream (file: string, scope?: object, renderOptions?: RenderOptions) {\n const templates = await this.parseFile(file)\n return this.renderToNodeStream(templates, scope, renderOptions)\n }\n\n public _evalValue (str: string, scope?: object | Context): IterableIterator {\n const value = new Value(str, this)\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options)\n return value.value(ctx)\n }\n public async evalValue (str: string, scope?: object | Context): Promise {\n return toPromise(this._evalValue(str, scope))\n }\n public evalValueSync (str: string, scope?: object | Context): any {\n return toValueSync(this._evalValue(str, scope))\n }\n\n public registerFilter (name: string, filter: FilterImplOptions) {\n this.filters[name] = filter\n }\n public registerTag (name: string, tag: TagClass | TagImplOptions) {\n this.tags[name] = isFunction(tag) ? tag : createTagClass(tag)\n }\n public plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n public express () {\n const self = this // eslint-disable-line\n let firstCall = true\n\n return function (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) {\n if (firstCall) {\n firstCall = false\n const dirs = normalizeDirectoryList(this.root)\n self.options.root.unshift(...dirs)\n self.options.layouts.unshift(...dirs)\n self.options.partials.unshift(...dirs)\n }\n self.renderFile(filePath, ctx).then(html => callback(null, html) as any, callback as any)\n }\n }\n\n public async analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise {\n return analyze(template, options)\n }\n\n public analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(template, options)\n }\n\n public async parseAndAnalyze (html: string, filename?: string, options: StaticAnalysisOptions = {}): Promise {\n return analyze(this.parse(html, filename), options)\n }\n\n public parseAndAnalyzeSync (html: string, filename?: string, options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(this.parse(html, filename), options)\n }\n\n /** Return an array of all variables without their properties. */\n public async variables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables without their properties. */\n public variablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables including their properties/paths. */\n public async fullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables including their properties/paths. */\n public fullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public async variableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public variableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables without their properties. */\n public async globalVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables without their properties. */\n public globalVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public async globalFullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public globalFullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public async globalVariableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public globalVariableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n}\n","/* istanbul ignore file */\nexport const version = '[VI]{version}[/VI]'\nexport * as TypeGuards from './util/type-guards'\nexport { toValue, createTrie, Trie, toPromise, toValueSync, assert, LiquidError, ParseError, RenderError, UndefinedVariableError, TokenizationError, AssertionError } from './util'\nexport type { LiquidErrors } from './util/error'\nexport { Drop } from './drop'\nexport type { Comparable } from './drop'\nexport { Emitter } from './emitters'\nexport { defaultOperators, Operators, evalToken, evalQuotedToken, Expression, isFalsy, isTruthy } from './render'\nexport { Context, Scope } from './context'\nexport { Value, Hash, Template, FilterImplOptions, Tag, Filter, Output, Variable, VariableLocation, VariableSegments, Variables, StaticAnalysis, StaticAnalysisOptions, analyze, analyzeSync, Arguments, PartialScope } from './template'\nexport type { TagRenderReturn } from './template'\nexport { Token, TopLevelToken, TagToken, ValueToken } from './tokens'\nexport type { RangeToken, LiteralToken, QuotedToken, PropertyAccessToken, NumberToken } from './tokens'\nexport { TokenKind, Tokenizer, ParseStream, Parser } from './parser'\nexport { filters } from './filters'\nexport * from './tags'\nexport { defaultOptions } from './liquid-options'\nexport type { LiquidOptions, RenderOptions, RenderFileOptions } from './liquid-options'\nexport { FS, LookupType } from './fs'\nexport { Liquid } from './liquid'\n"],"names":["toString","_\r\n .range","_.padStart","TokenKind","LookupType","last","arrayLast","sha256","sha256Impl","hmacSha256Impl","TypeGuards.isQuotedToken","TypeGuards.isHTMLToken","AssignTag","ForTag","CaptureTag","CaseTag","CommentTag","IncludeTag","RenderTag","DecrementTag","IncrementTag","CycleTag","IfTag","LayoutTag","BlockTag","RawTag","TablerowTag","UnlessTag","BreakTag","ContinueTag","EchoTag","LiquidTag","InlineCommentTag"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/liquidjs/dist/liquid.d.ts b/node_modules/liquidjs/dist/liquid.d.ts new file mode 100644 index 0000000..c703cd2 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.d.ts @@ -0,0 +1,70 @@ +/// +import { Context } from './context'; +import { TagClass, TagImplOptions, FilterImplOptions, Template, StaticAnalysisOptions, StaticAnalysis, SegmentArray } from './template'; +import { LookupType } from './fs/loader'; +import { Render } from './render'; +import { Parser } from './parser'; +import { LiquidOptions, NormalizedFullOptions, RenderOptions, RenderFileOptions } from './liquid-options'; +export declare class Liquid { + readonly options: NormalizedFullOptions; + readonly renderer: Render; + /** + * @deprecated will be removed. In tags use `this.parser` instead + */ + readonly parser: Parser; + readonly filters: Record; + readonly tags: Record; + constructor(opts?: LiquidOptions); + parse(html: string, filepath?: string): Template[]; + _render(tpl: Template[], scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator; + render(tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise; + renderSync(tpl: Template[], scope?: object, renderOptions?: RenderOptions): any; + renderToNodeStream(tpl: Template[], scope?: object, renderOptions?: RenderOptions): NodeJS.ReadableStream; + _parseAndRender(html: string, scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator; + parseAndRender(html: string, scope?: Context | object, renderOptions?: RenderOptions): Promise; + parseAndRenderSync(html: string, scope?: Context | object, renderOptions?: RenderOptions): any; + _parsePartialFile(file: string, sync?: boolean, currentFile?: string): Generator; + _parseLayoutFile(file: string, sync?: boolean, currentFile?: string): Generator; + _parseFile(file: string, sync?: boolean, lookupType?: LookupType, currentFile?: string): Generator; + parseFile(file: string, lookupType?: LookupType): Promise; + parseFileSync(file: string, lookupType?: LookupType): Template[]; + _renderFile(file: string, ctx: Context | object | undefined, renderFileOptions: RenderFileOptions): Generator; + renderFile(file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions): Promise; + renderFileSync(file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions): any; + renderFileToNodeStream(file: string, scope?: object, renderOptions?: RenderOptions): Promise; + _evalValue(str: string, scope?: object | Context): IterableIterator; + evalValue(str: string, scope?: object | Context): Promise; + evalValueSync(str: string, scope?: object | Context): any; + registerFilter(name: string, filter: FilterImplOptions): void; + registerTag(name: string, tag: TagClass | TagImplOptions): void; + plugin(plugin: (this: Liquid, L: typeof Liquid) => void): void; + express(): (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) => void; + analyze(template: Template[], options?: StaticAnalysisOptions): Promise; + analyzeSync(template: Template[], options?: StaticAnalysisOptions): StaticAnalysis; + parseAndAnalyze(html: string, filename?: string, options?: StaticAnalysisOptions): Promise; + parseAndAnalyzeSync(html: string, filename?: string, options?: StaticAnalysisOptions): StaticAnalysis; + /** Return an array of all variables without their properties. */ + variables(template: string | Template[], options?: StaticAnalysisOptions): Promise; + /** Return an array of all variables without their properties. */ + variablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[]; + /** Return an array of all variables including their properties/paths. */ + fullVariables(template: string | Template[], options?: StaticAnalysisOptions): Promise; + /** Return an array of all variables including their properties/paths. */ + fullVariablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[]; + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegments(template: string | Template[], options?: StaticAnalysisOptions): Promise>; + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegmentsSync(template: string | Template[], options?: StaticAnalysisOptions): Array; + /** Return an array of all expected context variables without their properties. */ + globalVariables(template: string | Template[], options?: StaticAnalysisOptions): Promise; + /** Return an array of all expected context variables without their properties. */ + globalVariablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[]; + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariables(template: string | Template[], options?: StaticAnalysisOptions): Promise; + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[]; + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegments(template: string | Template[], options?: StaticAnalysisOptions): Promise>; + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegmentsSync(template: string | Template[], options?: StaticAnalysisOptions): Array; +} diff --git a/node_modules/liquidjs/dist/liquid.node.js b/node_modules/liquidjs/dist/liquid.node.js new file mode 100644 index 0000000..b33dcbf --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.node.js @@ -0,0 +1,5127 @@ +/* + * liquidjs@10.27.0, https://github.com/harttle/liquidjs + * (c) 2016-2026 harttle + * Released under the MIT License. + */ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var stream = require('stream'); +var path = require('path'); +var fs$1 = require('fs'); +var crypto = require('crypto'); + +class Token { + constructor(kind, input, begin, end, file) { + this.kind = kind; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } + getText() { + return this.input.slice(this.begin, this.end); + } + getPosition() { + let [row, col] = [1, 1]; + for (let i = 0; i < this.begin; i++) { + if (this.input[i] === '\n') { + row++; + col = 1; + } + else + col++; + } + return [row, col]; + } + size() { + return this.end - this.begin; + } +} + +class Drop { + liquidMethodMissing(key, context) { + return undefined; + } +} + +const toString$1 = Object.prototype.toString; +const toLowerCase = String.prototype.toLowerCase; +const hasOwnProperty = Object.hasOwnProperty; +function isString(value) { + return typeof value === 'string'; +} +// eslint-disable-next-line @typescript-eslint/ban-types +function isFunction(value) { + return typeof value === 'function'; +} +function isPromise(val) { + return val && isFunction(val.then); +} +function isIterator(val) { + return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return); +} +function promisify(fn) { + return function (...args) { + return new Promise((resolve, reject) => { + fn(...args, (err, result) => { + err ? reject(err) : resolve(result); + }); + }); + }; +} +function stringify(value) { + value = toValue(value); + if (isString(value)) + return value; + if (isNil(value)) + return ''; + if (isArray(value)) + return value.map(x => stringify(x)).join(''); + return String(value); +} +function toEnumerable(val) { + val = toValue(val); + if (isArray(val)) + return val; + if (isString(val) && val.length > 0) + return [val]; + if (isIterable(val)) + return Array.from(val); + if (isObject(val)) + return Object.keys(val).map((key) => [key, val[key]]); + return []; +} +function toArray(val) { + val = toValue(val); + if (isNil(val)) + return []; + if (isArray(val)) + return val; + return [val]; +} +function toValue(value) { + return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value; +} +function toNumber(value) { + return +toValue(value) || 0; +} +function isNumber(value) { + return typeof value === 'number'; +} +function toLiquid(value) { + if (value && isFunction(value.toLiquid)) + return toLiquid(value.toLiquid()); + return value; +} +function isNil(value) { + return value == null; +} +function isUndefined(value) { + return value === undefined; +} +function isArray(value) { + // be compatible with IE 8 + return toString$1.call(value) === '[object Array]'; +} +function isArrayLike(value) { + return value && isNumber(value.length); +} +function isIterable(value) { + return isObject(value) && Symbol.iterator in value; +} +/* + * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property. + * The iteratee is invoked with three arguments: (value, key, object). + * Iteratee functions may exit iteration early by explicitly returning false. + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @return {Object} Returns object. + */ +function forOwn(obj, iteratee) { + obj = obj || {}; + for (const k in obj) { + if (hasOwnProperty.call(obj, k)) { + if (iteratee(obj[k], k, obj) === false) + break; + } + } + return obj; +} +function last(arr) { + return arr[arr.length - 1]; +} +/* + * Checks if value is the language type of Object. + * (e.g. arrays, functions, objects, regexes, new Number(0), and new String('')) + * @param {any} value The value to check. + * @return {Boolean} Returns true if value is an object, else false. + */ +function isObject(value) { + const type = typeof value; + return value !== null && (type === 'object' || type === 'function'); +} +function range(start, stop, step = 1) { + const arr = []; + for (let i = start; i < stop; i += step) { + arr.push(i); + } + return arr; +} +function padStart(str, length, ch = ' ') { + return pad(str, length, ch, (str, ch) => ch + str); +} +function padEnd(str, length, ch = ' ') { + return pad(str, length, ch, (str, ch) => str + ch); +} +function pad(str, length, ch, add) { + str = String(str); + const n = length - str.length; + if (n <= 0) + return str; + return add(str, ch.repeat(n)); +} +function identify(val) { + return val; +} +function changeCase(str) { + const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z'); + return hasLowerCase ? str.toUpperCase() : str.toLowerCase(); +} +function ellipsis(str, N) { + return str.length > N ? str.slice(0, N - 3) + '...' : str; +} +function orderedCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} +// compare string in case-insensitive way, undefined values to the tail +function caseInsensitiveCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + a = toLowerCase.call(a); + b = toLowerCase.call(b); + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} +function argumentsToValue(fn) { + return function (...args) { return fn.call(this, ...args.map(toValue)); }; +} +function argumentsToNumber(fn) { + return function (...args) { return fn.call(this, ...args.map(toNumber)); }; +} +/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */ +function* strictUniq(array) { + const seen = new Set(); + for (const element of array) { + const key = JSON.stringify(element); + if (!seen.has(key)) { + seen.add(key); + yield element; + } + } +} + +/** + * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes + */ +const TRAIT = '__liquidClass__'; +class LiquidError extends Error { + constructor(err, token) { + /** + * note: for ES5 targeting, `this` will be replaced by return value of Error(), + * thus everything on `this` will be lost, avoid calling `LiquidError` methods here + */ + super(typeof err === 'string' ? err : err.message); + this.context = ''; + if (typeof err !== 'string') + Object.defineProperty(this, 'originalError', { value: err, enumerable: false }); + Object.defineProperty(this, 'token', { value: token, enumerable: false }); + Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false }); + } + update() { + Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false }); + this.message = mkMessage(this.message, this.token); + this.stack = this.message + '\n' + this.context + + '\n' + this.stack; + if (this.originalError) + this.stack += '\nFrom ' + this.originalError.stack; + } + static is(obj) { + return obj?.[TRAIT] === 'LiquidError'; + } +} +class TokenizationError extends LiquidError { + constructor(message, token) { + super(message, token); + this.name = 'TokenizationError'; + super.update(); + } +} +class ParseError extends LiquidError { + constructor(err, token) { + super(err, token); + this.name = 'ParseError'; + this.message = err.message; + super.update(); + } +} +class RenderError extends LiquidError { + constructor(err, tpl) { + super(err, tpl.token); + this.name = 'RenderError'; + this.message = err.message; + super.update(); + } + static is(obj) { + return obj.name === 'RenderError'; + } +} +class LiquidErrors extends LiquidError { + constructor(errors) { + super(errors[0], errors[0].token); + this.errors = errors; + this.name = 'LiquidErrors'; + const s = errors.length > 1 ? 's' : ''; + this.message = `${errors.length} error${s} found`; + super.update(); + } + static is(obj) { + return obj.name === 'LiquidErrors'; + } +} +class UndefinedVariableError extends LiquidError { + constructor(err, token) { + super(err, token); + this.name = 'UndefinedVariableError'; + this.message = err.message; + super.update(); + } +} +// only used internally; raised where we don't have token information, +// so it can't be an UndefinedVariableError. +class InternalUndefinedVariableError extends Error { + constructor(variableName) { + super(`undefined variable: ${variableName}`); + this.name = 'InternalUndefinedVariableError'; + this.variableName = variableName; + } +} +class AssertionError extends Error { + constructor(message) { + super(message); + this.name = 'AssertionError'; + this.message = message + ''; + } +} +function mkContext(token) { + const [line, col] = token.getPosition(); + const lines = token.input.split('\n'); + const begin = Math.max(line - 2, 1); + const end = Math.min(line + 3, lines.length); + const context = range(begin, end + 1) + .map(lineNumber => { + const rowIndicator = (lineNumber === line) ? '>> ' : ' '; + const num = padStart(String(lineNumber), String(end).length); + let text = `${rowIndicator}${num}| `; + const colIndicator = lineNumber === line + ? '\n' + padStart('^', col + text.length) + : ''; + text += lines[lineNumber - 1]; + text += colIndicator; + return text; + }) + .join('\n'); + return context; +} +function mkMessage(msg, token) { + if (token.file) + msg += `, file:${token.file}`; + const [line, col] = token.getPosition(); + msg += `, line:${line}, col:${col}`; + return msg; +} + +// **DO NOT CHANGE THIS FILE** +// +// This file is generated by bin/character-gen.js +// bitmask character types to boost performance +const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; +const WORD = 1; +const BLANK = 4; +const QUOTE = 8; +const INLINE_BLANK = 16; +const NUMBER = 32; +const SIGN = 64; +const PUNCTUATION = 128; +function isWord(char) { + const code = char.charCodeAt(0); + return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD); +} +TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK; +TYPES[8220] = TYPES[8221] = PUNCTUATION; + +function assert(predicate, message) { + if (!predicate) { + const msg = typeof message === 'function' + ? message() + : (message || `expect ${predicate} to be true`); + throw new AssertionError(msg); + } +} +function assertEmpty(predicate, message = `unexpected ${JSON.stringify(predicate)}`) { + assert(!predicate, message); +} + +class NullDrop extends Drop { + equals(value) { + return isNil(toValue(value)); + } + gt() { + return false; + } + geq() { + return false; + } + lt() { + return false; + } + leq() { + return false; + } + valueOf() { + return null; + } +} + +class EmptyDrop extends Drop { + equals(value) { + if (value instanceof EmptyDrop) + return false; + value = toValue(value); + if (isString(value) || isArray(value)) + return value.length === 0; + if (isObject(value)) + return Object.keys(value).length === 0; + return false; + } + gt() { + return false; + } + geq() { + return false; + } + lt() { + return false; + } + leq() { + return false; + } + valueOf() { + return ''; + } + static is(value) { + return value instanceof EmptyDrop; + } +} + +class BlankDrop extends EmptyDrop { + equals(value) { + if (value === false) + return true; + if (isNil(toValue(value))) + return true; + if (isString(value)) + return /^\s*$/.test(value); + return super.equals(value); + } + static is(value) { + return value instanceof BlankDrop; + } +} + +class ForloopDrop extends Drop { + constructor(length, collection, variable) { + super(); + this.i = 0; + this.length = length; + this.name = `${variable}-${collection}`; + } + next() { + this.i++; + } + index0() { + return this.i; + } + index() { + return this.i + 1; + } + first() { + return this.i === 0; + } + last() { + return this.i === this.length - 1; + } + rindex() { + return this.length - this.i; + } + rindex0() { + return this.length - this.i - 1; + } + valueOf() { + return JSON.stringify(this); + } +} + +class SimpleEmitter { + constructor() { + this.buffer = ''; + } + write(html) { + this.buffer += stringify(html); + } +} + +class StreamedEmitter { + constructor() { + this.buffer = ''; + this.stream = new stream.PassThrough(); + } + write(html) { + this.stream.write(stringify(html)); + } + error(err) { + this.stream.emit('error', err); + } + end() { + this.stream.end(); + } +} + +class KeepingTypeEmitter { + constructor() { + this.buffer = ''; + } + write(html) { + html = toValue(html); + // This will only preserve the type if the value is isolated. + // I.E: + // {{ my-port }} -> 42 + // {{ my-host }}:{{ my-port }} -> 'host:42' + if (typeof html !== 'string' && this.buffer === '') { + this.buffer = html; + } + else { + this.buffer = stringify(this.buffer) + stringify(html); + } + } +} + +class BlockDrop extends Drop { + constructor( + // the block render from layout template + superBlockRender = () => '') { + super(); + this.superBlockRender = superBlockRender; + } + /** + * Provide parent access in child block by + * {{ block.super }} + */ + *super() { + const emitter = new SimpleEmitter(); + yield this.superBlockRender(emitter); + return emitter.buffer; + } +} + +function isComparable(arg) { + return (arg && + isFunction(arg.equals) && + isFunction(arg.gt) && + isFunction(arg.geq) && + isFunction(arg.lt) && + isFunction(arg.leq)); +} + +const nil = new NullDrop(); +const literalValues = { + 'true': true, + 'false': false, + 'nil': nil, + 'null': nil, + 'empty': new EmptyDrop(), + 'blank': new BlankDrop() +}; + +function createTrie(input) { + const trie = {}; + for (const [name, data] of Object.entries(input)) { + let node = trie; + for (let i = 0; i < name.length; i++) { + const c = name[i]; + node[c] = node[c] || {}; + if (i === name.length - 1 && isWord(name[i])) { + node[c].needBoundary = true; + } + node = node[c]; + } + node.data = data; + node.end = true; + } + return trie; +} + +function toLiquidAsync(asyncFn, syncFn) { + const syncImpl = syncFn || asyncFn; + return (sync, ...args) => { + return sync ? syncImpl(...args) : asyncFn(...args); + }; +} +// convert an async iterator to a Promise +async function toPromise(val) { + if (!isIterator(val)) + return val; + let value; + let done = false; + let next = 'next'; + do { + const state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + try { + if (isIterator(value)) + value = toPromise(value); + if (isPromise(value)) + value = await value; + } + catch (err) { + next = 'throw'; + value = err; + } + } while (!done); + return value; +} +// convert an async iterator to a value in a synchronous manner +function toValueSync(val) { + if (!isIterator(val)) + return val; + let value; + let done = false; + let next = 'next'; + do { + const state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + if (isIterator(value)) { + try { + value = toValueSync(value); + } + catch (err) { + next = 'throw'; + value = err; + } + } + } while (!done); + return value; +} + +const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/; +// prototype extensions +function daysInMonth(d) { + const feb = isLeapYear(d) ? 29 : 28; + return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +} +function getDayOfYear(d) { + let num = 0; + for (let i = 0; i < d.getMonth(); ++i) { + num += daysInMonth(d)[i]; + } + return num + d.getDate(); +} +function getWeekOfYear(d, startDay) { + // Skip to startDay of this week + const now = getDayOfYear(d) + (startDay - d.getDay()); + // Find the first startDay of the year + const jan1 = new Date(d.getFullYear(), 0, 1); + const then = (7 - jan1.getDay() + startDay); + return String(Math.floor((now - then) / 7) + 1); +} +function isLeapYear(d) { + const year = d.getFullYear(); + return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year))); +} +function ordinal(d) { + const date = d.getDate(); + if ([11, 12, 13].includes(date)) + return 'th'; + switch (date % 10) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + default: return 'th'; + } +} +function century(d) { + return parseInt(d.getFullYear().toString().substring(0, 2), 10); +} +// default to 0 +const padWidths = { + d: 2, + e: 2, + H: 2, + I: 2, + j: 3, + k: 2, + l: 2, + L: 3, + m: 2, + M: 2, + S: 2, + U: 2, + W: 2 +}; +const padSpaceChars = new Set('aAbBceklpP'); +function getTimezoneOffset(d, opts) { + const nOffset = Math.abs(d.getTimezoneOffset()); + const h = Math.floor(nOffset / 60); + const m = nOffset % 60; + return (d.getTimezoneOffset() > 0 ? '-' : '+') + + padStart(h, 2, '0') + + (opts.flags[':'] ? ':' : '') + + padStart(m, 2, '0'); +} +const formatCodes = { + a: (d) => d.getShortWeekdayName(), + A: (d) => d.getLongWeekdayName(), + b: (d) => d.getShortMonthName(), + B: (d) => d.getLongMonthName(), + c: (d) => d.toLocaleString(), + C: (d) => century(d), + d: (d) => d.getDate(), + e: (d) => d.getDate(), + H: (d) => d.getHours(), + I: (d) => String(d.getHours() % 12 || 12), + j: (d) => getDayOfYear(d), + k: (d) => d.getHours(), + l: (d) => String(d.getHours() % 12 || 12), + L: (d) => d.getMilliseconds(), + m: (d) => d.getMonth() + 1, + M: (d) => d.getMinutes(), + N: (d, opts) => { + const width = Number(opts.width) || 9; + const str = String(d.getMilliseconds()).slice(0, width); + opts.memoryLimit?.use(width - str.length); + return padEnd(str, width, '0'); + }, + p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'), + P: (d) => (d.getHours() < 12 ? 'am' : 'pm'), + q: (d) => ordinal(d), + s: (d) => Math.round(d.getTime() / 1000), + S: (d) => d.getSeconds(), + u: (d) => d.getDay() || 7, + U: (d) => getWeekOfYear(d, 0), + w: (d) => d.getDay(), + W: (d) => getWeekOfYear(d, 1), + x: (d) => d.toLocaleDateString(), + X: (d) => d.toLocaleTimeString(), + y: (d) => d.getFullYear().toString().slice(2, 4), + Y: (d) => d.getFullYear(), + z: getTimezoneOffset, + Z: (d, opts) => d.getTimeZoneName() || getTimezoneOffset(d, opts), + 't': () => '\t', + 'n': () => '\n', + '%': () => '%' +}; +formatCodes.h = formatCodes.b; +function strftime(d, formatStr, memoryLimit) { + let output = ''; + let remaining = formatStr; + let match; + while ((match = rFormat.exec(remaining))) { + output += remaining.slice(0, match.index); + remaining = remaining.slice(match.index + match[0].length); + output += format(d, match, memoryLimit); + } + return output + remaining; +} +function format(d, match, memoryLimit) { + const [input, flagStr = '', width, modifier, conversion] = match; + const convert = formatCodes[conversion]; + if (!convert) + return input; + const flags = {}; + for (const flag of flagStr) + flags[flag] = true; + let ret = String(convert(d, { flags, width, modifier, memoryLimit })); + let padChar = padSpaceChars.has(conversion) ? ' ' : '0'; + let padWidth = width || padWidths[conversion] || 0; + if (flags['^']) + ret = ret.toUpperCase(); + else if (flags['#']) + ret = changeCase(ret); + if (flags['_']) + padChar = ' '; + else if (flags['0']) + padChar = '0'; + if (flags['-']) + padWidth = 0; + memoryLimit?.use(Number(padWidth) - ret.length); + return padStart(ret, padWidth, padChar); +} + +function getDateTimeFormat() { + return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined); +} + +// one minute in milliseconds +const OneMinute = 60000; +/** + * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS + * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3 + */ +const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/; +const monthNames = [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', + 'September', 'October', 'November', 'December' +]; +const monthNamesShort = monthNames.map(name => name.slice(0, 3)); +const dayNames = [ + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' +]; +const dayNamesShort = dayNames.map(name => name.slice(0, 3)); +/** + * A date implementation with timezone info, just like Ruby date + * + * Implementation: + * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods + * - rewrite getTimezoneOffset() to trick strftime + */ +class LiquidDate { + constructor(init, locale, timezone) { + this.locale = locale; + this.DateTimeFormat = getDateTimeFormat(); + this.date = new Date(init); + this.timezoneFixed = timezone !== undefined; + if (timezone === undefined) { + timezone = this.date.getTimezoneOffset(); + } + this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone; + this.timezoneName = isString(timezone) ? timezone : ''; + const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute; + const time = this.date.getTime() + diff; + this.displayDate = new Date(time); + } + getTime() { + return this.displayDate.getTime(); + } + getMilliseconds() { + return this.displayDate.getMilliseconds(); + } + getSeconds() { + return this.displayDate.getSeconds(); + } + getMinutes() { + return this.displayDate.getMinutes(); + } + getHours() { + return this.displayDate.getHours(); + } + getDay() { + return this.displayDate.getDay(); + } + getDate() { + return this.displayDate.getDate(); + } + getMonth() { + return this.displayDate.getMonth(); + } + getFullYear() { + return this.displayDate.getFullYear(); + } + toLocaleString(locale, init) { + if (init?.timeZone) { + return this.date.toLocaleString(locale, init); + } + return this.displayDate.toLocaleString(locale, init); + } + toLocaleTimeString(locale) { + return this.displayDate.toLocaleTimeString(locale); + } + toLocaleDateString(locale) { + return this.displayDate.toLocaleDateString(locale); + } + getTimezoneOffset() { + return this.timezoneOffset; + } + getTimeZoneName() { + if (this.timezoneFixed) + return this.timezoneName; + if (!this.DateTimeFormat) + return; + return this.DateTimeFormat().resolvedOptions().timeZone; + } + getLongMonthName() { + return this.format({ month: 'long' }) ?? monthNames[this.getMonth()]; + } + getShortMonthName() { + return this.format({ month: 'short' }) ?? monthNamesShort[this.getMonth()]; + } + getLongWeekdayName() { + return this.format({ weekday: 'long' }) ?? dayNames[this.displayDate.getDay()]; + } + getShortWeekdayName() { + return this.format({ weekday: 'short' }) ?? dayNamesShort[this.displayDate.getDay()]; + } + valid() { + return !isNaN(this.getTime()); + } + format(options) { + return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate); + } + /** + * Create a Date object fixed to it's declared Timezone. Both + * - 2021-08-06T02:29:00.000Z and + * - 2021-08-06T02:29:00.000+08:00 + * will always be displayed as + * - 2021-08-06 02:29:00 + * regardless timezoneOffset in JavaScript realm + * + * The implementation hack: + * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`, + * we create a different Date to trick strftime, it's both simpler and more performant. + * Given that a template is expected to be parsed fewer times than rendered. + */ + static createDateFixedToTimezone(dateString, locale) { + const m = dateString.match(TIMEZONE_PATTERN); + // representing a UTC timestamp + if (m && m[1] === 'Z') { + return new LiquidDate(+new Date(dateString), locale, 0); + } + // has a timezone specified + if (m && m[2] && m[3] && m[4]) { + const [, , sign, hours, minutes] = m; + const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10)); + return new LiquidDate(+new Date(dateString), locale, offset); + } + return new LiquidDate(dateString, locale); + } + static getTimezoneOffset(timezoneName, date) { + const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName }); + const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' }); + const localDate = new Date(localDateString); + const utcDate = new Date(utcDateString); + return (+utcDate - +localDate) / (60 * 1000); + } +} + +class Limiter { + constructor(resource, limit) { + this.base = 0; + this.message = `${resource} limit exceeded`; + this.limit = limit; + } + use(count) { + if (+count > 0) { + assert(this.base + +count <= this.limit, this.message); + this.base += +count; + } + } + check(count) { + if (+count > 0) { + assert(+count <= this.limit, this.message); + } + } +} + +class DelimitedToken extends Token { + constructor(kind, [contentBegin, contentEnd], input, begin, end, trimLeft, trimRight, file) { + super(kind, input, begin, end, file); + this.trimLeft = false; + this.trimRight = false; + const tl = input[contentBegin] === '-'; + const tr = input[contentEnd - 1] === '-'; + let l = tl ? contentBegin + 1 : contentBegin; + let r = tr ? contentEnd - 1 : contentEnd; + while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) + l++; + while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) + r--; + this.contentRange = [l, r]; + this.trimLeft = tl || trimLeft; + this.trimRight = tr || trimRight; + } + get content() { + return this.input.slice(this.contentRange[0], this.contentRange[1]); + } +} + +class TagToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options; + const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]; + super(exports.TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file); + this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange); + this.name = this.tokenizer.readTagName(); + this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`); + this.tokenizer.skipBlank(); + this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + } +} + +class OutputToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options; + const valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]; + super(exports.TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file); + } +} + +class HTMLToken extends Token { + constructor(input, begin, end, file) { + super(exports.TokenKind.HTML, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.trimLeft = 0; + this.trimRight = 0; + } + getContent() { + return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight); + } +} + +class NumberToken extends Token { + constructor(input, begin, end, file) { + super(exports.TokenKind.Number, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = Number(this.getText()); + } +} + +class IdentifierToken extends Token { + constructor(input, begin, end, file) { + super(exports.TokenKind.Word, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = this.getText(); + } +} + +class LiteralToken extends Token { + constructor(input, begin, end, file) { + super(exports.TokenKind.Literal, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.literal = this.getText(); + this.content = literalValues[this.literal]; + } +} + +const operatorPrecedences = { + '==': 2, + '!=': 2, + '>': 2, + '<': 2, + '>=': 2, + '<=': 2, + 'contains': 2, + 'not': 1, + 'and': 0, + 'or': 0 +}; +const operatorTypes = { + '==': 0 /* OperatorType.Binary */, + '!=': 0 /* OperatorType.Binary */, + '>': 0 /* OperatorType.Binary */, + '<': 0 /* OperatorType.Binary */, + '>=': 0 /* OperatorType.Binary */, + '<=': 0 /* OperatorType.Binary */, + 'contains': 0 /* OperatorType.Binary */, + 'not': 1 /* OperatorType.Unary */, + 'and': 0 /* OperatorType.Binary */, + 'or': 0 /* OperatorType.Binary */ +}; +class OperatorToken extends Token { + constructor(input, begin, end, file) { + super(exports.TokenKind.Operator, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.operator = this.getText(); + } + getPrecedence() { + const key = this.getText(); + return key in operatorPrecedences ? operatorPrecedences[key] : 1; + } +} + +class PropertyAccessToken extends Token { + constructor(variable, props, input, begin, end, file) { + super(exports.TokenKind.PropertyAccess, input, begin, end, file); + this.variable = variable; + this.props = props; + } +} + +class FilterToken extends Token { + constructor(name, args, input, begin, end, file) { + super(exports.TokenKind.Filter, input, begin, end, file); + this.name = name; + this.args = args; + } +} + +class HashToken extends Token { + constructor(input, begin, end, name, value, file) { + super(exports.TokenKind.Hash, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.name = name; + this.value = value; + this.file = file; + } +} + +const rHex = /[\da-fA-F]/; +const rOct = /[0-7]/; +const escapeChar = { + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + v: '\x0B' +}; +function hexVal(c) { + const code = c.charCodeAt(0); + if (code >= 97) + return code - 87; + if (code >= 65) + return code - 55; + return code - 48; +} +function parseStringLiteral(str) { + let ret = ''; + for (let i = 1; i < str.length - 1; i++) { + if (str[i] !== '\\') { + ret += str[i]; + continue; + } + if (escapeChar[str[i + 1]] !== undefined) { + ret += escapeChar[str[++i]]; + } + else if (str[i + 1] === 'u') { + let val = 0; + let j = i + 2; + while (j <= i + 5 && rHex.test(str[j])) { + val = val * 16 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + else if (!rOct.test(str[i + 1])) { + ret += str[++i]; + } + else { + let j = i + 1; + let val = 0; + while (j <= i + 3 && rOct.test(str[j])) { + val = val * 8 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + } + return ret; +} + +class QuotedToken extends Token { + constructor(input, begin, end, file) { + super(exports.TokenKind.Quoted, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = parseStringLiteral(this.getText()); + } +} + +class RangeToken extends Token { + constructor(input, begin, end, lhs, rhs, file) { + super(exports.TokenKind.Range, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.lhs = lhs; + this.rhs = rhs; + this.file = file; + } +} + +/** + * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}` + */ +class LiquidTagToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + super(exports.TokenKind.Tag, [begin, end], input, begin, end, false, false, file); + this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange); + this.name = this.tokenizer.readTagName(); + this.tokenizer.assert(this.name, 'illegal liquid tag syntax'); + this.tokenizer.skipBlank(); + } + get args() { + return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + } +} + +/** + * value expression with optional filters + * e.g. + * {% assign foo="bar" | append: "coo" %} + */ +class FilteredValueToken extends Token { + constructor(initial, filters, input, begin, end, file) { + super(exports.TokenKind.FilteredValue, input, begin, end, file); + this.initial = initial; + this.filters = filters; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } +} + +const polyfill = { + now: () => Date.now() +}; +function getPerformance() { + return (typeof global === 'object' && global.performance) || + (typeof window === 'object' && window.performance) || + polyfill; +} + +class Render { + renderTemplatesToNodeStream(templates, ctx) { + const emitter = new StreamedEmitter(); + Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter))) + .then(() => emitter.end(), err => emitter.error(err)); + return emitter.stream; + } + *renderTemplates(templates, ctx, emitter) { + if (!emitter) { + emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter(); + } + ctx.renderLimit.check(getPerformance().now()); + const errors = []; + for (const tpl of templates) { + ctx.renderLimit.check(getPerformance().now()); + try { + // if tpl.render supports emitter, it'll return empty `html` + const html = yield tpl.render(ctx, emitter); + // if not, it'll return an `html`, write to the emitter for it + html && emitter.write(html); + if (ctx.breakCalled || ctx.continueCalled) + break; + } + catch (e) { + const err = LiquidError.is(e) ? e : new RenderError(e, tpl); + if (ctx.opts.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) { + throw new LiquidErrors(errors); + } + return emitter.buffer; + } +} + +class Expression { + constructor(tokens) { + this.postfix = [...toPostfix(tokens)]; + } + *evaluate(ctx, lenient) { + assert(ctx, 'unable to evaluate: context not defined'); + const operands = []; + for (const token of this.postfix) { + if (isOperatorToken(token)) { + const r = operands.pop(); + let result; + if (operatorTypes[token.operator] === 1 /* OperatorType.Unary */) { + result = yield ctx.opts.operators[token.operator](r, ctx); + } + else { + const l = operands.pop(); + result = yield ctx.opts.operators[token.operator](l, r, ctx); + } + operands.push(result); + } + else { + operands.push(yield evalToken(token, ctx, lenient)); + } + } + return operands[0]; + } + valid() { + return !!this.postfix.length; + } +} +function* evalToken(token, ctx, lenient = false) { + if (!token) + return; + if ('content' in token) + return token.content; + if (isPropertyAccessToken(token)) + return yield evalPropertyAccessToken(token, ctx, lenient); + if (isRangeToken(token)) + return yield evalRangeToken(token, ctx); +} +function* evalPropertyAccessToken(token, ctx, lenient) { + const props = []; + for (const prop of token.props) { + props.push((yield evalToken(prop, ctx, false))); + } + try { + if (token.variable) { + const variable = yield evalToken(token.variable, ctx, lenient); + return yield ctx._getFromScope(variable, props); + } + else { + return yield ctx._get(props); + } + } + catch (e) { + if (lenient && e.name === 'InternalUndefinedVariableError') + return null; + throw (new UndefinedVariableError(e, token)); + } +} +function evalQuotedToken(token) { + return token.content; +} +function* evalRangeToken(token, ctx) { + const low = yield evalToken(token.lhs, ctx); + const high = yield evalToken(token.rhs, ctx); + ctx.memoryLimit.use(high - low + 1); + return range(+low, +high + 1); +} +function* toPostfix(tokens) { + const ops = []; + for (const token of tokens) { + if (isOperatorToken(token)) { + while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) { + yield ops.pop(); + } + ops.push(token); + } + else + yield token; + } + while (ops.length) { + yield ops.pop(); + } +} + +function isTruthy(val, ctx) { + return !isFalsy(val, ctx); +} +function isFalsy(val, ctx) { + val = toValue(val); + if (ctx.opts.jsTruthy) { + return !val; + } + else { + return val === false || undefined === val || val === null; + } +} + +const defaultOperators = { + '==': equals, + '!=': (l, r) => !equals(l, r), + '>': (l, r) => { + if (isComparable(l)) + return l.gt(r); + if (isComparable(r)) + return r.lt(l); + return toValue(l) > toValue(r); + }, + '<': (l, r) => { + if (isComparable(l)) + return l.lt(r); + if (isComparable(r)) + return r.gt(l); + return toValue(l) < toValue(r); + }, + '>=': (l, r) => { + if (isComparable(l)) + return l.geq(r); + if (isComparable(r)) + return r.leq(l); + return toValue(l) >= toValue(r); + }, + '<=': (l, r) => { + if (isComparable(l)) + return l.leq(r); + if (isComparable(r)) + return r.geq(l); + return toValue(l) <= toValue(r); + }, + 'contains': (l, r) => { + l = toValue(l); + if (isArray(l)) + return l.some((i) => equals(i, r)); + if (isFunction(l?.indexOf)) + return l.indexOf(toValue(r)) > -1; + return false; + }, + 'not': (v, ctx) => isFalsy(toValue(v), ctx), + 'and': (l, r, ctx) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx), + 'or': (l, r, ctx) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx) +}; +function equals(lhs, rhs) { + if (isComparable(lhs)) + return lhs.equals(rhs); + if (isComparable(rhs)) + return rhs.equals(lhs); + lhs = toValue(lhs); + rhs = toValue(rhs); + if (isArray(lhs)) { + return isArray(rhs) && arrayEquals(lhs, rhs); + } + return lhs === rhs; +} +function arrayEquals(lhs, rhs) { + if (lhs.length !== rhs.length) + return false; + return !lhs.some((value, i) => !equals(value, rhs[i])); +} +function arrayIncludes(arr, item) { + return arr.some(value => equals(value, item)); +} + +class Node { + constructor(key, value, next, prev) { + this.key = key; + this.value = value; + this.next = next; + this.prev = prev; + } +} +class LRU { + constructor(limit, size = 0) { + this.limit = limit; + this.size = size; + this.cache = {}; + this.head = new Node('HEAD', null, null, null); + this.tail = new Node('TAIL', null, null, null); + this.head.next = this.tail; + this.tail.prev = this.head; + } + write(key, value) { + if (this.cache[key]) { + this.cache[key].value = value; + } + else { + const node = new Node(key, value, this.head.next, this.head); + this.head.next.prev = node; + this.head.next = node; + this.cache[key] = node; + this.size++; + this.ensureLimit(); + } + } + read(key) { + if (!this.cache[key]) + return; + const { value } = this.cache[key]; + this.remove(key); + this.write(key, value); + return value; + } + remove(key) { + const node = this.cache[key]; + node.prev.next = node.next; + node.next.prev = node.prev; + delete this.cache[key]; + this.size--; + } + clear() { + this.head.next = this.tail; + this.tail.prev = this.head; + this.size = 0; + this.cache = {}; + } + ensureLimit() { + if (this.size > this.limit) + this.remove(this.tail.prev.key); + } +} + +const requireResolve = (partial) => require.resolve(partial, { paths: ['.'] }); + +const statAsync = promisify(fs$1.stat); +const readFileAsync = promisify(fs$1.readFile); +async function exists(filepath) { + try { + await statAsync(filepath); + return true; + } + catch (err) { + return false; + } +} +function readFile(filepath) { + return readFileAsync(filepath, 'utf8'); +} +function existsSync(filepath) { + try { + fs$1.statSync(filepath); + return true; + } + catch (err) { + return false; + } +} +function readFileSync(filepath) { + return fs$1.readFileSync(filepath, 'utf8'); +} +function resolve(root, file, ext) { + if (!path.extname(file)) + file += ext; + return path.resolve(root, file); +} +function fallback(file) { + try { + return requireResolve(file); + } + catch (e) { } +} +function dirname(filepath) { + return path.dirname(filepath); +} +const realpathAsync = promisify(fs$1.realpath); +async function contains(root, file) { + try { + const realRoot = await realpathAsync(root); + const realFile = await realpathAsync(file); + const prefix = realRoot.endsWith(path.sep) ? realRoot : realRoot + path.sep; + return realFile.startsWith(prefix); + } + catch { + return false; + } +} +function containsSync(root, file) { + try { + const realRoot = fs$1.realpathSync(root); + const realFile = fs$1.realpathSync(file); + const prefix = realRoot.endsWith(path.sep) ? realRoot : realRoot + path.sep; + return realFile.startsWith(prefix); + } + catch { + return false; + } +} + +var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + exists: exists, + readFile: readFile, + existsSync: existsSync, + readFileSync: readFileSync, + resolve: resolve, + fallback: fallback, + dirname: dirname, + contains: contains, + containsSync: containsSync, + sep: path.sep +}); + +function defaultFilter(value, defaultValue, ...args) { + value = toValue(value); + if (isArray(value) || isString(value)) + return value.length ? value : defaultValue; + if (value === false && (new Map(args)).get('allow_false')) + return false; + return isFalsy(value, this.context) ? defaultValue : value; +} +function json(value, space = 0) { + return JSON.stringify(value, null, space); +} +function inspect(value, space = 0) { + const ancestors = []; + return JSON.stringify(value, function (_key, value) { + if (typeof value !== 'object' || value === null) + return value; + // `this` is the object that value is contained in, i.e., its direct parent. + while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) + ancestors.pop(); + if (ancestors.includes(value)) + return '[Circular]'; + ancestors.push(value); + return value; + }, space); +} +function to_integer(value) { + return Number(value); +} +const raw = { + raw: true, + handler: identify +}; +var misc = { + default: defaultFilter, + raw, + jsonify: json, + to_integer, + json, + inspect +}; + +const escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +const unescapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" +}; +function escape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&|<|>|"|'/g, m => escapeMap[m]); +} +function xml_escape(str) { + return escape.call(this, str); +} +function unescape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]); +} +function escape_once(str) { + return escape.call(this, unescape.call(this, str)); +} +function newline_to_br(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, '
    \n'); +} +// Raw-text blocks (HTML5) plus '<...>' as the catch-all kind; a regex +// equivalent is O(n^2) in V8 on unclosed openers. +function strip_html(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + const blocks = new Map([[''], [''], [''], ['<', '>']]); + let out = ''; + let i = 0; + while (i < str.length) { + const lt = str.indexOf('<', i); + if (lt < 0) + return out + str.slice(i); + out += str.slice(i, lt); + for (const [opener, closer] of blocks) { + if (!str.startsWith(opener, lt)) + continue; + const e = str.indexOf(closer, lt + opener.length); + if (e >= 0) { + i = e + closer.length; + break; + } + blocks.delete(opener); + } + if (i === lt) + return out + str.slice(lt); + } + return out; +} + +var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html +}); + +class MapFS { + constructor(mapping) { + this.mapping = mapping; + this.sep = '/'; + } + async exists(filepath) { + return this.existsSync(filepath); + } + existsSync(filepath) { + return !isNil(this.mapping[filepath]); + } + async readFile(filepath) { + return this.readFileSync(filepath); + } + readFileSync(filepath) { + const content = this.mapping[filepath]; + if (isNil(content)) + throw new Error(`ENOENT: ${filepath}`); + return content; + } + dirname(filepath) { + const segments = filepath.split(this.sep); + segments.pop(); + return segments.join(this.sep); + } + resolve(dir, file, ext) { + file += ext; + if (dir === '.') + return file; + const segments = dir.split(/\/+/); + for (const segment of file.split(this.sep)) { + if (segment === '.' || segment === '') + continue; + else if (segment === '..') { + if (segments.length > 1 || segments[0] !== '') + segments.pop(); + } + else + segments.push(segment); + } + return segments.join(this.sep); + } +} + +const defaultOptions = { + root: ['.'], + layouts: ['.'], + partials: ['.'], + relativeReference: true, + jekyllInclude: false, + keyValueSeparator: ':', + cache: undefined, + extname: '', + fs: fs, + dynamicPartials: true, + jsTruthy: false, + dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z', + locale: '', + trimTagRight: false, + trimTagLeft: false, + trimOutputRight: false, + trimOutputLeft: false, + greedy: true, + tagDelimiterLeft: '{%', + tagDelimiterRight: '%}', + outputDelimiterLeft: '{{', + outputDelimiterRight: '}}', + preserveTimezones: false, + strictFilters: false, + strictVariables: false, + ownPropertyOnly: true, + lenientIf: false, + globals: {}, + keepOutputType: false, + operators: defaultOperators, + memoryLimit: Infinity, + parseLimit: Infinity, + renderLimit: Infinity +}; +function normalize(options) { + if (options.hasOwnProperty('root')) { + if (!options.hasOwnProperty('partials')) + options.partials = options.root; + if (!options.hasOwnProperty('layouts')) + options.layouts = options.root; + } + if (options.hasOwnProperty('cache')) { + let cache; + if (typeof options.cache === 'number') + cache = options.cache > 0 ? new LRU(options.cache) : undefined; + else if (typeof options.cache === 'object') + cache = options.cache; + else + cache = options.cache ? new LRU(1024) : undefined; + options.cache = cache; + } + options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options }; + if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) { + console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning'); + options.relativeReference = false; + } + options.root = normalizeDirectoryList(options.root); + options.partials = normalizeDirectoryList(options.partials); + options.layouts = normalizeDirectoryList(options.layouts); + options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape); + if (!options.locale) { + options.locale = getDateTimeFormat()?.().resolvedOptions().locale ?? 'en-US'; + } + if (options.templates) { + options.fs = new MapFS(options.templates); + options.relativeReference = true; + options.root = options.partials = options.layouts = '.'; + } + return options; +} +function getOutputEscapeFunction(nameOrFunction) { + if (nameOrFunction === 'escape') + return escape; + if (nameOrFunction === 'json') + return misc.json; + assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function'); + return nameOrFunction; +} +function normalizeDirectoryList(value) { + let list = []; + if (isArray(value)) + list = value; + if (isString(value)) + list = [value]; + return list; +} + +function whiteSpaceCtrl(tokens, options) { + let inRaw = false; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (!isDelimitedToken(token)) + continue; + if (!inRaw && token.trimLeft) { + trimLeft(tokens[i - 1], options.greedy); + } + if (isTagToken(token)) { + if (token.name === 'raw') + inRaw = true; + else if (token.name === 'endraw') + inRaw = false; + } + if (!inRaw && token.trimRight) { + trimRight(tokens[i + 1], options.greedy); + } + } +} +function trimLeft(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + const mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) + token.trimRight++; +} +function trimRight(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + const mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) + token.trimLeft++; + if (token.input.charAt(token.begin + token.trimLeft) === '\n') + token.trimLeft++; +} + +class Tokenizer { + constructor(input, operators = defaultOptions.operators, file, range) { + this.input = input; + this.file = file; + this.rawBeginAt = -1; + this.p = range ? range[0] : 0; + this.N = range ? range[1] : input.length; + this.opTrie = createTrie(operators); + this.literalTrie = createTrie(literalValues); + } + readExpression() { + return new Expression(this.readExpressionTokens()); + } + *readExpressionTokens() { + while (this.p < this.N) { + const operator = this.readOperator(); + if (operator) { + yield operator; + continue; + } + const operand = this.readValue(); + if (operand) { + yield operand; + continue; + } + return; + } + } + readOperator() { + this.skipBlank(); + const end = this.matchTrie(this.opTrie); + if (end === -1) + return; + return new OperatorToken(this.input, this.p, (this.p = end), this.file); + } + matchTrie(trie) { + let node = trie; + let i = this.p; + let info; + while (node[this.input[i]] && i < this.N) { + node = node[this.input[i++]]; + if (node['end']) + info = node; + } + if (!info) + return -1; + if (info['needBoundary'] && isWord(this.peek(i - this.p))) + return -1; + return i; + } + readFilteredValue() { + const begin = this.p; + const initial = this.readExpression(); + this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`); + const filters = this.readFilters(); + return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file); + } + readFilters() { + const filters = []; + while (true) { + const filter = this.readFilter(); + if (!filter) + return filters; + filters.push(filter); + } + } + readFilter() { + this.skipBlank(); + if (this.end()) + return null; + this.assert(this.read() === '|', `expected "|" before filter`); + const name = this.readIdentifier(); + if (!name.size()) { + this.assert(this.end(), `expected filter name`); + return null; + } + const args = []; + this.skipBlank(); + if (this.peek() === ':') { + do { + ++this.p; + const arg = this.readFilterArg(); + arg && args.push(arg); + this.skipBlank(); + this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`); + } while (this.peek() === ','); + } + else if (this.peek() === '|' || this.end()) ; + else { + throw this.error('expected ":" after filter name'); + } + return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file); + } + readFilterArg() { + const key = this.readValue(); + if (!key) + return; + this.skipBlank(); + if (this.peek() !== ':') + return key; + ++this.p; + const value = this.readValue(); + return [key.getText(), value]; + } + readTopLevelTokens(options = defaultOptions) { + const tokens = []; + while (this.p < this.N) { + const token = this.readTopLevelToken(options); + tokens.push(token); + } + whiteSpaceCtrl(tokens, options); + return tokens; + } + readTopLevelToken(options) { + const { tagDelimiterLeft, outputDelimiterLeft } = options; + if (this.rawBeginAt > -1) + return this.readEndrawOrRawContent(options); + if (this.match(tagDelimiterLeft)) + return this.readTagToken(options); + if (this.match(outputDelimiterLeft)) + return this.readOutputToken(options); + return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]); + } + readHTMLToken(stopStrings) { + const begin = this.p; + while (this.p < this.N) { + if (stopStrings.some(str => this.match(str))) + break; + ++this.p; + } + return new HTMLToken(this.input, begin, this.p, this.file); + } + readTagToken(options) { + const { file, input } = this; + const begin = this.p; + if (this.readToDelimiter(options.tagDelimiterRight) === -1) { + throw this.error(`tag ${this.snapshot(begin)} not closed`, begin); + } + const token = new TagToken(input, begin, this.p, options, file); + if (token.name === 'raw') + this.rawBeginAt = begin; + return token; + } + readToDelimiter(delimiter, respectQuoted = false) { + this.skipBlank(); + while (this.p < this.N) { + if (respectQuoted && (this.peekType() & QUOTE)) { + this.readQuoted(); + continue; + } + ++this.p; + if (this.rmatch(delimiter)) + return this.p; + } + return -1; + } + readOutputToken(options = defaultOptions) { + const { file, input } = this; + const { outputDelimiterRight } = options; + const begin = this.p; + if (this.readToDelimiter(outputDelimiterRight, true) === -1) { + throw this.error(`output ${this.snapshot(begin)} not closed`, begin); + } + return new OutputToken(input, begin, this.p, options, file); + } + readEndrawOrRawContent(options) { + const { tagDelimiterLeft, tagDelimiterRight } = options; + const begin = this.p; + let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + while (this.p < this.N) { + if (this.readIdentifier().getText() !== 'endraw') { + leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + continue; + } + while (this.p <= this.N) { + if (this.rmatch(tagDelimiterRight)) { + const end = this.p; + if (begin === leftPos) { + this.rawBeginAt = -1; + return new TagToken(this.input, begin, end, options, this.file); + } + else { + this.p = leftPos; + return new HTMLToken(this.input, begin, leftPos, this.file); + } + } + if (this.rmatch(tagDelimiterLeft)) + break; + this.p++; + } + } + throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin); + } + readLiquidTagTokens(options = defaultOptions) { + const tokens = []; + while (this.p < this.N) { + const token = this.readLiquidTagToken(options); + token && tokens.push(token); + } + return tokens; + } + readLiquidTagToken(options) { + this.skipBlank(); + if (this.end()) + return; + const begin = this.p; + this.readToDelimiter('\n'); + const end = this.p; + return new LiquidTagToken(this.input, begin, end, options, this.file); + } + error(msg, pos = this.p) { + return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file)); + } + assert(pred, msg, pos) { + if (!pred) + throw this.error(typeof msg === 'function' ? msg() : msg, pos); + } + snapshot(begin = this.p) { + return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32)); + } + /** + * @deprecated use #readIdentifier instead + */ + readWord() { + return this.readIdentifier(); + } + readIdentifier() { + this.skipBlank(); + const begin = this.p; + while (!this.end() && isWord(this.peek())) + ++this.p; + return new IdentifierToken(this.input, begin, this.p, this.file); + } + readNonEmptyIdentifier() { + const id = this.readIdentifier(); + return id.size() ? id : undefined; + } + readTagName() { + this.skipBlank(); + // Handle inline comment tags + if (this.input[this.p] === '#') + return this.input.slice(this.p, ++this.p); + return this.readIdentifier().getText(); + } + readHashes(jekyllStyle) { + const hashes = []; + while (true) { + const hash = this.readHash(jekyllStyle); + if (!hash) + return hashes; + hashes.push(hash); + } + } + readHash(jekyllStyle) { + this.skipBlank(); + if (this.peek() === ',') + ++this.p; + const begin = this.p; + const name = this.readNonEmptyIdentifier(); + if (!name) + return; + let value; + this.skipBlank(); + const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':'); + if (this.peek() === sep) { + ++this.p; + value = this.readValue(); + } + return new HashToken(this.input, begin, this.p, name, value, this.file); + } + remaining() { + return this.input.slice(this.p, this.N); + } + advance(step = 1) { + this.p += step; + } + end() { + return this.p >= this.N; + } + read() { + return this.input[this.p++]; + } + readTo(end) { + while (this.p < this.N) { + ++this.p; + if (this.rmatch(end)) + return this.p; + } + return -1; + } + readValue() { + this.skipBlank(); + const begin = this.p; + const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber(); + const props = this.readProperties(!variable); + if (!props.length) + return variable; + return new PropertyAccessToken(variable, props, this.input, begin, this.p); + } + readScopeValue() { + this.skipBlank(); + const begin = this.p; + const props = this.readProperties(); + if (!props.length) + return undefined; + return new PropertyAccessToken(undefined, props, this.input, begin, this.p); + } + readProperties(isBegin = true) { + const props = []; + while (true) { + if (this.peek() === '[') { + this.p++; + const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file); + this.assert(this.readTo(']') !== -1, '[ not closed'); + props.push(prop); + continue; + } + if (isBegin && !props.length) { + const prop = this.readNonEmptyIdentifier(); + if (prop) { + props.push(prop); + continue; + } + } + if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax + this.p++; + const prop = this.readNonEmptyIdentifier(); + if (!prop) + break; + props.push(prop); + continue; + } + break; + } + return props; + } + readNumber() { + this.skipBlank(); + let decimalFound = false; + let digitFound = false; + let n = 0; + if (this.peekType() & SIGN) + n++; + while (this.p + n <= this.N) { + if (this.peekType(n) & NUMBER) { + digitFound = true; + n++; + } + else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') { + if (decimalFound || !digitFound) + return; + decimalFound = true; + n++; + } + else + break; + } + if (digitFound && !isWord(this.peek(n))) { + const num = new NumberToken(this.input, this.p, this.p + n, this.file); + this.advance(n); + return num; + } + } + readLiteral() { + this.skipBlank(); + const end = this.matchTrie(this.literalTrie); + if (end === -1) + return; + const literal = new LiteralToken(this.input, this.p, end, this.file); + this.p = end; + return literal; + } + readRange() { + this.skipBlank(); + const begin = this.p; + if (this.peek() !== '(') + return; + ++this.p; + const lhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax'); + const rhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === ')', 'invalid range syntax'); + return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file); + } + readValueOrThrow() { + const value = this.readValue(); + this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`); + return value; + } + readQuoted() { + this.skipBlank(); + const begin = this.p; + if (!(this.peekType() & QUOTE)) + return; + ++this.p; + let escaped = false; + while (this.p < this.N) { + ++this.p; + if (this.input[this.p - 1] === this.input[begin] && !escaped) + break; + if (escaped) + escaped = false; + else if (this.input[this.p - 1] === '\\') + escaped = true; + } + return new QuotedToken(this.input, begin, this.p, this.file); + } + *readFileNameTemplate(options) { + const { outputDelimiterLeft } = options; + const htmlStopStrings = [',', ' ', '\r', '\n', '\t', outputDelimiterLeft]; + const htmlStopStringSet = new Set(htmlStopStrings); + // break on ',' and ' ', outputDelimiterLeft only stops HTML token + while (this.p < this.N && !htmlStopStringSet.has(this.peek())) { + yield this.match(outputDelimiterLeft) + ? this.readOutputToken(options) + : this.readHTMLToken(htmlStopStrings); + } + } + match(word) { + for (let i = 0; i < word.length; i++) { + if (word[i] !== this.input[this.p + i]) + return false; + } + return true; + } + rmatch(pattern) { + for (let i = 0; i < pattern.length; i++) { + if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) + return false; + } + return true; + } + peekType(n = 0) { + return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]; + } + peek(n = 0) { + return this.p + n >= this.N ? '' : this.input[this.p + n]; + } + skipBlank() { + while (this.peekType() & BLANK) + ++this.p; + } +} + +class ParseStream { + constructor(tokens, parseToken) { + this.handlers = {}; + this.stopRequested = false; + this.tokens = tokens; + this.parseToken = parseToken; + } + on(name, cb) { + this.handlers[name] = cb; + return this; + } + trigger(event, arg) { + const h = this.handlers[event]; + return h ? (h.call(this, arg), true) : false; + } + start() { + this.trigger('start'); + let token; + while (!this.stopRequested && (token = this.tokens.shift())) { + if (this.trigger('token', token)) + continue; + if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) { + continue; + } + const template = this.parseToken(token, this.tokens); + this.trigger('template', template); + } + if (!this.stopRequested) + this.trigger('end'); + return this; + } + stop() { + this.stopRequested = true; + return this; + } +} + +class TemplateImpl { + constructor(token) { + this.token = token; + } +} + +class Tag extends TemplateImpl { + constructor(token, remainTokens, liquid) { + super(token); + this.name = token.name; + this.liquid = liquid; + this.tokenizer = token.tokenizer; + } +} + +/** + * Key-Value Pairs Representing Tag Arguments + * Example: + * For the markup `, foo:'bar', coo:2 reversed %}`, + * hash['foo'] === 'bar' + * hash['coo'] === 2 + * hash['reversed'] === undefined + */ +class Hash { + constructor(input, jekyllStyle) { + this.hash = {}; + const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {}); + for (const hash of tokenizer.readHashes(jekyllStyle)) { + this.hash[hash.name.content] = hash.value; + } + } + *render(ctx) { + const hash = {}; + for (const key of Object.keys(this.hash)) { + hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx); + } + return hash; + } +} + +function createTagClass(options) { + return class extends Tag { + constructor(token, tokens, liquid) { + super(token, tokens, liquid); + if (isFunction(options.parse)) { + options.parse.call(this, token, tokens); + } + } + *render(ctx, emitter) { + const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)); + return yield options.render.call(this, ctx, emitter, hash); + } + }; +} + +function isKeyValuePair(arr) { + return isArray(arr); +} + +class Filter { + constructor(token, options, liquid) { + this.token = token; + this.name = token.name; + this.handler = isFunction(options) + ? options + : (isFunction(options?.handler) ? options.handler : identify); + this.raw = !isFunction(options) && !!options?.raw; + this.args = token.args; + this.liquid = liquid; + } + *render(value, context) { + const argv = []; + for (const arg of this.args) { + if (isKeyValuePair(arg)) + argv.push([arg[0], yield evalToken(arg[1], context)]); + else + argv.push(yield evalToken(arg, context)); + } + return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv]); + } +} + +class Value { + /** + * @param str the value to be valuated, eg.: "foobar" | truncate: 3 + */ + constructor(input, liquid) { + this.filters = []; + const token = typeof input === 'string' + ? new Tokenizer(input, liquid.options.operators).readFilteredValue() + : input; + this.initial = token.initial; + this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid)); + } + *value(ctx, lenient) { + lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default'); + let val = yield this.initial.evaluate(ctx, lenient); + for (const filter of this.filters) { + val = yield filter.render(val, ctx); + } + return val; + } + getFilter(liquid, name) { + const impl = liquid.filters[name]; + assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`); + return impl; + } +} + +class Output extends TemplateImpl { + constructor(token, liquid) { + super(token); + const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange); + this.value = new Value(tokenizer.readFilteredValue(), liquid); + const filters = this.value.filters; + const outputEscape = liquid.options.outputEscape; + if (!filters[filters.length - 1]?.raw && outputEscape) { + const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0); + filters.push(new Filter(token, outputEscape, liquid)); + } + } + *render(ctx, emitter) { + const val = yield this.value.value(ctx, false); + emitter.write(val); + } + *arguments() { + yield this.value; + } +} + +class HTML extends TemplateImpl { + constructor(token) { + super(token); + this.str = token.getContent(); + } + *render(ctx, emitter) { + emitter.write(this.str); + } +} + +/** + * A variable's segments and location, which can be coerced to a string. + */ +class Variable { + constructor(segments, location) { + this.segments = segments; + this.location = location; + } + toString() { + return segmentsString(this.segments, true); + } + /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */ + toArray() { + function* _visit(...segments) { + for (const segment of segments) { + if (segment instanceof Variable) { + yield Array.from(_visit(...segment.segments)); + } + else { + yield segment; + } + } + } + return Array.from(_visit(...this.segments)); + } +} +/** + * Group variables by the string representation of their root segment. + */ +class VariableMap { + constructor() { + this.map = new Map(); + } + get(key) { + const k = segmentsString([key.segments[0]]); + if (!this.map.has(k)) { + this.map.set(k, []); + } + return this.map.get(k); + } + has(key) { + return this.map.has(segmentsString([key.segments[0]])); + } + push(variable) { + this.get(variable).push(variable); + } + asObject() { + return Object.fromEntries(this.map); + } +} +const defaultStaticAnalysisOptions = { + partials: true +}; +function* _analyze(templates, partials, sync) { + const variables = new VariableMap(); + const globals = new VariableMap(); + const locals = new VariableMap(); + const rootScope = new DummyScope(new Set()); + // Names of partial templates that we've already analyzed. + const seen = new Set(); + function updateVariables(variable, scope) { + variables.push(variable); + const aliased = scope.alias(variable); + if (aliased !== undefined) { + const root = aliased.segments[0]; + // TODO: What if a a template renders a rendered template? Do we need scope.parent? + if (isString(root) && !rootScope.has(root)) { + globals.push(aliased); + } + } + else { + const root = variable.segments[0]; + if (isString(root) && !scope.has(root)) { + globals.push(variable); + } + } + // Recurse for nested Variables + for (const segment of variable.segments) { + if (segment instanceof Variable) { + updateVariables(segment, scope); + } + } + } + function* visit(template, scope) { + if (template.arguments) { + for (const arg of template.arguments()) { + for (const variable of extractVariables(arg)) { + updateVariables(variable, scope); + } + } + } + if (template.localScope) { + for (const ident of template.localScope()) { + scope.add(ident.content); + scope.deleteAlias(ident.content); + const [row, col] = ident.getPosition(); + locals.push(new Variable([ident.content], { row, col, file: ident.file })); + } + } + if (template.children) { + if (template.partialScope) { + const partial = template.partialScope(); + if (partial === undefined) { + // Layouts, for example, can have children that are not partials. + for (const child of (yield template.children(partials, sync))) { + yield visit(child, scope); + } + return; + } + if (seen.has(partial.name)) + return; + const partialScopeNames = new Set(); + const partialScope = partial.isolated + ? new DummyScope(partialScopeNames) + : scope.push(partialScopeNames); + for (const name of partial.scope) { + if (isString(name)) { + partialScopeNames.add(name); + } + else { + const [alias, argument] = name; + partialScopeNames.add(alias); + const variables = Array.from(extractVariables(argument)); + if (variables.length) { + partialScope.setAlias(alias, variables[0].segments); + } + } + } + for (const child of (yield template.children(partials, sync))) { + yield visit(child, partialScope); + seen.add(partial.name); + } + partialScope.pop(); + } + else { + if (template.blockScope) { + scope.push(new Set(template.blockScope())); + } + for (const child of (yield template.children(partials, sync))) { + yield visit(child, scope); + } + if (template.blockScope) { + scope.pop(); + } + } + } + } + for (const template of templates) { + yield visit(template, rootScope); + } + return { + variables: variables.asObject(), + globals: globals.asObject(), + locals: locals.asObject() + }; +} +/** + * Statically analyze a template and report variable usage. + */ +function analyze(template, options = {}) { + const opts = { ...defaultStaticAnalysisOptions, ...options }; + return toPromise(_analyze(template, opts.partials, false)); +} +/** + * Statically analyze a template and report variable usage. + */ +function analyzeSync(template, options = {}) { + const opts = { ...defaultStaticAnalysisOptions, ...options }; + return toValueSync(_analyze(template, opts.partials, true)); +} +/** + * A stack to manage scopes while traversing templates during static analysis. + */ +class DummyScope { + constructor(globals) { + this.stack = [{ names: globals, aliases: new Map() }]; + } + /** Return true if `name` is in scope. */ + has(name) { + for (const scope of this.stack) { + if (scope.names.has(name)) { + return true; + } + } + return false; + } + push(scope) { + this.stack.push({ names: scope, aliases: new Map() }); + return this; + } + pop() { + return this.stack.pop()?.names; + } + // Add a name to the template scope. + add(name) { + this.stack[0].names.add(name); + } + /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */ + alias(variable) { + const root = variable.segments[0]; + if (!isString(root)) + return undefined; + const alias = this.getAlias(root); + if (alias === undefined) + return undefined; + return new Variable([...alias, ...variable.segments.slice(1)], variable.location); + } + // TODO: `from` could be a path with multiple segments, like `include.x`. + setAlias(from, to) { + this.stack[this.stack.length - 1].aliases.set(from, to); + } + deleteAlias(name) { + this.stack[this.stack.length - 1].aliases.delete(name); + } + getAlias(name) { + for (const scope of this.stack) { + if (scope.aliases.has(name)) { + return scope.aliases.get(name); + } + // If a scope has defined `name`, then it masks aliases in parent scopes. + if (scope.names.has(name)) { + return undefined; + } + } + return undefined; + } +} +function* extractVariables(value) { + if (isValueToken(value)) { + yield* extractValueTokenVariables(value); + } + else if (value instanceof Value) { + yield* extractFilteredValueVariables(value); + } +} +function* extractFilteredValueVariables(value) { + for (const token of value.initial.postfix) { + if (isValueToken(token)) { + yield* extractValueTokenVariables(token); + } + } + for (const filter of value.filters) { + for (const arg of filter.args) { + if (isKeyValuePair(arg) && arg[1]) { + yield* extractValueTokenVariables(arg[1]); + } + else if (isValueToken(arg)) { + yield* extractValueTokenVariables(arg); + } + } + } +} +function* extractValueTokenVariables(token) { + if (isRangeToken(token)) { + yield* extractValueTokenVariables(token.lhs); + yield* extractValueTokenVariables(token.rhs); + } + else if (isPropertyAccessToken(token)) { + yield extractPropertyAccessVariable(token); + } +} +function extractPropertyAccessVariable(token) { + const segments = []; + // token is not guaranteed to have `file` set. We'll try to get it from a prop if not. + let file = token.file; + // Here we're flattening the first segment of a path if it is a nested path. + const root = token.props[0]; + file = file || root.file; + if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) { + segments.push(root.content); + } + else if (isPropertyAccessToken(root)) { + // Flatten paths that start with a nested path. + segments.push(...extractPropertyAccessVariable(root).segments); + } + for (const prop of token.props.slice(1)) { + file = file || prop.file; + if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) { + segments.push(prop.content); + } + else if (isPropertyAccessToken(prop)) { + segments.push(extractPropertyAccessVariable(prop)); + } + } + const [row, col] = token.getPosition(); + return new Variable(segments, { + row, + col, + file + }); +} +// This is used to detect segments that can be represented with dot notation +// when creating a string representation of VariableSegments. +const RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/; +/** + * Return a string representation of segments using dot notation where possible. + * @param segments - The property names and array indices that make up a path to a variable. + * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets. + */ +function segmentsString(segments, bracketedRoot = false) { + const buf = []; + const root = segments[0]; + if (isString(root)) { + if (!bracketedRoot || root.match(RE_PROPERTY)) { + buf.push(`${root}`); + } + else { + buf.push(`['${root}']`); + } + } + for (const segment of segments.slice(1)) { + if (segment instanceof Variable) { + buf.push(`[${segmentsString(segment.segments)}]`); + } + else if (isString(segment)) { + if (segment.match(RE_PROPERTY)) { + buf.push(`.${segment}`); + } + else { + buf.push(`['${segment}']`); + } + } + else { + buf.push(`[${segment}]`); + } + } + return buf.join(''); +} + +(function (LookupType) { + LookupType["Partials"] = "partials"; + LookupType["Layouts"] = "layouts"; + LookupType["Root"] = "root"; +})(exports.LookupType || (exports.LookupType = {})); +class Loader { + constructor(options) { + this.options = options; + if (options.relativeReference) { + const sep = options.fs.sep; + assert(sep, '`fs.sep` is required for relative reference'); + const prefixes = ['.' + sep, '..' + sep, './', '../']; + this.shouldLoadRelative = (referencedFile) => prefixes.some(prefix => referencedFile.startsWith(prefix)); + } + else { + this.shouldLoadRelative = (_referencedFile) => false; + } + const fs = options.fs; + this.contains = toLiquidAsync(fs.contains?.bind(fs) || (async () => true), fs.containsSync?.bind(fs) || (() => true)); + this.exists = toLiquidAsync(fs.exists?.bind(fs) || (async () => false), fs.existsSync?.bind(fs)); + } + *lookup(file, type, sync, currentFile) { + const dirs = this.options[type]; + for (const filepath of this.candidates(file, dirs, currentFile)) { + let allowed = false; + for (const dir of dirs) { + if (yield this.contains(!!sync, dir, filepath)) { + allowed = true; + break; + } + } + if (!allowed) + continue; + if (yield this.exists(!!sync, filepath)) + return filepath; + } + throw this.lookupError(file, dirs); + } + *candidates(file, dirs, currentFile) { + const { fs, extname } = this.options; + if (this.shouldLoadRelative(file) && currentFile) { + const referenced = fs.resolve(this.dirname(currentFile), file, extname); + yield referenced; + } + for (const dir of dirs) { + const referenced = fs.resolve(dir, file, extname); + yield referenced; + } + if (fs.fallback !== undefined) { + const filepath = fs.fallback(file); + if (filepath !== undefined) + yield filepath; + } + } + dirname(path) { + const fs = this.options.fs; + assert(fs.dirname, '`fs.dirname` is required for relative reference'); + return fs.dirname(path); + } + lookupError(file, roots) { + const err = new Error('ENOENT'); + err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`; + err.code = 'ENOENT'; + return err; + } +} + +class Parser { + constructor(liquid) { + this.liquid = liquid; + this.cache = this.liquid.options.cache; + this.fs = this.liquid.options.fs; + this.parseFile = this.cache ? this._parseFileCached : this._parseFile; + this.loader = new Loader(this.liquid.options); + this.parseLimit = new Limiter('parse length', liquid.options.parseLimit); + this.readFile = toLiquidAsync(this.fs.readFile?.bind(this.fs) || (async () => { throw new Error('readFile not implemented'); }), this.fs.readFileSync?.bind(this.fs)); + } + parse(html, filepath) { + html = String(html); + this.parseLimit.use(html.length); + const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath); + const tokens = tokenizer.readTopLevelTokens(this.liquid.options); + return this.parseTokens(tokens); + } + parseTokens(tokens) { + let token; + const templates = []; + const errors = []; + while ((token = tokens.shift())) { + try { + templates.push(this.parseToken(token, tokens)); + } + catch (err) { + if (this.liquid.options.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) + throw new LiquidErrors(errors); + return templates; + } + parseToken(token, remainTokens) { + try { + if (isTagToken(token)) { + const TagClass = this.liquid.tags[token.name]; + assert(TagClass, `tag "${token.name}" not found`); + return new TagClass(token, remainTokens, this.liquid, this); + } + if (isOutputToken(token)) { + return new Output(token, this.liquid); + } + return new HTML(token); + } + catch (e) { + if (LiquidError.is(e)) + throw e; + throw new ParseError(e, token); + } + } + parseStream(tokens) { + return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens)); + } + *_parseFileCached(file, sync, type = exports.LookupType.Root, currentFile) { + const cache = this.cache; + const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file; + const tpls = yield cache.read(key); + if (tpls) + return tpls; + const task = this._parseFile(file, sync, type, currentFile); + // sync mode: exec the task and cache the result + // async mode: cache the task before exec + const taskOrTpl = sync ? yield task : toPromise(task); + cache.write(key, taskOrTpl); + // note: concurrent tasks will be reused, cache for failed task is removed until its end + try { + return yield taskOrTpl; + } + catch (err) { + cache.remove(key); + throw err; + } + } + *_parseFile(file, sync, type = exports.LookupType.Root, currentFile) { + const filepath = yield this.loader.lookup(file, type, sync, currentFile); + return this.parse(yield this.readFile(!!sync, filepath), filepath); + } +} + +(function (TokenKind) { + TokenKind[TokenKind["Number"] = 1] = "Number"; + TokenKind[TokenKind["Literal"] = 2] = "Literal"; + TokenKind[TokenKind["Tag"] = 4] = "Tag"; + TokenKind[TokenKind["Output"] = 8] = "Output"; + TokenKind[TokenKind["HTML"] = 16] = "HTML"; + TokenKind[TokenKind["Filter"] = 32] = "Filter"; + TokenKind[TokenKind["Hash"] = 64] = "Hash"; + TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess"; + TokenKind[TokenKind["Word"] = 256] = "Word"; + TokenKind[TokenKind["Range"] = 512] = "Range"; + TokenKind[TokenKind["Quoted"] = 1024] = "Quoted"; + TokenKind[TokenKind["Operator"] = 2048] = "Operator"; + TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue"; + TokenKind[TokenKind["Delimited"] = 12] = "Delimited"; +})(exports.TokenKind || (exports.TokenKind = {})); + +function isDelimitedToken(val) { + return !!(getKind(val) & exports.TokenKind.Delimited); +} +function isOperatorToken(val) { + return getKind(val) === exports.TokenKind.Operator; +} +function isHTMLToken(val) { + return getKind(val) === exports.TokenKind.HTML; +} +function isOutputToken(val) { + return getKind(val) === exports.TokenKind.Output; +} +function isTagToken(val) { + return getKind(val) === exports.TokenKind.Tag; +} +function isQuotedToken(val) { + return getKind(val) === exports.TokenKind.Quoted; +} +function isLiteralToken(val) { + return getKind(val) === exports.TokenKind.Literal; +} +function isNumberToken(val) { + return getKind(val) === exports.TokenKind.Number; +} +function isPropertyAccessToken(val) { + return getKind(val) === exports.TokenKind.PropertyAccess; +} +function isWordToken(val) { + return getKind(val) === exports.TokenKind.Word; +} +function isRangeToken(val) { + return getKind(val) === exports.TokenKind.Range; +} +function isValueToken(val) { + // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range + return (getKind(val) & 1667) > 0; +} +function getKind(val) { + return val ? val.kind : -1; +} + +var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken +}); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +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. +***************************************************************************** */ + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function createScope(from) { + const scope = Object.create(null); + if (from) + Object.assign(scope, from); + return scope; +} + +class Context { + constructor(env = {}, opts = defaultOptions, renderOptions = {}, { memoryLimit, renderLimit } = {}) { + /** + * insert a Context-level empty scope, + * for tags like `{% capture %}` `{% assign %}` to operate + */ + this.scopes = [createScope()]; + this.registers = {}; + this.breakCalled = false; + this.continueCalled = false; + this.sync = !!renderOptions.sync; + this.opts = opts; + this.globals = renderOptions.globals ?? opts.globals; + this.environments = isObject(env) ? env : Object(env); + this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables; + this.ownPropertyOnly = renderOptions.ownPropertyOnly ?? opts.ownPropertyOnly; + this.memoryLimit = memoryLimit ?? new Limiter('memory alloc', renderOptions.memoryLimit ?? opts.memoryLimit); + this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit)); + } + getRegister(key, defaultValue = undefined) { + return (this.registers[key] = this.registers[key] || defaultValue); + } + setRegister(key, value) { + return (this.registers[key] = value); + } + saveRegister(...keys) { + return keys.map(key => [key, this.getRegister(key)]); + } + restoreRegister(keyValues) { + return keyValues.forEach(([key, value]) => this.setRegister(key, value)); + } + getAll() { + return [this.globals, this.environments, ...this.scopes] + .reduce((ctx, val) => __assign(ctx, val), {}); + } + /** + * @deprecated use `_get()` or `getSync()` instead + */ + get(paths) { + return this.getSync(paths); + } + getSync(paths) { + return toValueSync(this._get(paths)); + } + *_get(paths) { + const scope = this.findScope(paths[0]); // first prop should always be a string + return yield this._getFromScope(scope, paths); + } + /** + * @deprecated use `_get()` instead + */ + getFromScope(scope, paths) { + return toValueSync(this._getFromScope(scope, paths)); + } + *_getFromScope(scope, paths, strictVariables = this.strictVariables) { + if (isString(paths)) + paths = paths.split('.'); + for (let i = 0; i < paths.length; i++) { + scope = yield this.readProperty(scope, paths[i]); + if (strictVariables && isUndefined(scope)) { + throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.')); + } + } + return scope; + } + push(ctx) { + return this.scopes.push(ctx); + } + pop() { + return this.scopes.pop(); + } + bottom() { + return this.scopes[0]; + } + spawn(scope = {}) { + return new Context(scope, this.opts, { + sync: this.sync, + globals: this.globals, + strictVariables: this.strictVariables, + ownPropertyOnly: this.ownPropertyOnly + }, { + renderLimit: this.renderLimit, + memoryLimit: this.memoryLimit + }); + } + findScope(key) { + for (let i = this.scopes.length - 1; i >= 0; i--) { + const candidate = this.scopes[i]; + if (key in candidate) + return candidate; + } + if (key in this.environments) + return this.environments; + return this.globals; + } + readProperty(obj, key) { + obj = toLiquid(obj); + key = toValue(key); + if (isNil(obj)) + return obj; + if (isArray(obj) && key < 0) + return obj[obj.length + +key]; + const value = readJSProperty(obj, key, this.ownPropertyOnly); + if (value === undefined && obj instanceof Drop) + return obj.liquidMethodMissing(key, this); + if (isFunction(value)) + return value.call(obj); + if (key === 'size') + return readSize(obj); + else if (key === 'first') + return readFirst(obj); + else if (key === 'last') + return readLast(obj); + return value; + } +} +function readJSProperty(obj, key, ownPropertyOnly) { + if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) + return undefined; + return obj[key]; +} +function readFirst(obj) { + if (isArray(obj)) + return obj[0]; + return obj['first']; +} +function readLast(obj) { + if (isArray(obj)) + return obj[obj.length - 1]; + return obj['last']; +} +function readSize(obj) { + if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) + return obj['size']; + if (isArray(obj) || isString(obj)) + return obj.length; + if (typeof obj === 'object') + return Object.keys(obj).length; +} + +var BlockMode; +(function (BlockMode) { + /* store rendered html into blocks */ + BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT"; + /* output rendered html directly */ + BlockMode[BlockMode["STORE"] = 1] = "STORE"; +})(BlockMode || (BlockMode = {})); + +const abs = argumentsToNumber(Math.abs); +const at_least = argumentsToNumber(Math.max); +const at_most = argumentsToNumber(Math.min); +const ceil = argumentsToNumber(Math.ceil); +const divided_by = argumentsToNumber((dividend, divisor, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor); +const floor = argumentsToNumber(Math.floor); +const minus = argumentsToNumber((v, arg) => v - arg); +const plus = argumentsToNumber((lhs, rhs) => lhs + rhs); +const modulo = argumentsToNumber((v, arg) => v % arg); +const times = argumentsToNumber((v, arg) => v * arg); +function round(v, arg = 0) { + v = toNumber(v); + arg = toNumber(arg); + const amp = Math.pow(10, arg); + const scaled = v * amp; + // Round half away from zero + return Math.sign(v) * Math.round(Math.abs(scaled)) / amp; +} + +var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round +}); + +const url_decode = (x) => decodeURIComponent(stringify(x)).replace(/\+/g, ' '); +const url_encode = (x) => encodeURIComponent(stringify(x)).replace(/%20/g, '+'); +const cgi_escape = (x) => encodeURIComponent(stringify(x)) + .replace(/%20/g, '+') + .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase()); +const uri_escape = (x) => encodeURI(stringify(x)) + .replace(/%5B/g, '[') + .replace(/%5D/g, ']'); +const rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug; +const rSlugifyReplacers = { + 'raw': /\s+/g, + 'default': rSlugifyDefault, + 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug, + 'ascii': /[^A-Za-z0-9]+/g, + 'latin': rSlugifyDefault, + 'none': null +}; +function slugify(str, mode = 'default', cased = false) { + str = stringify(str); + const replacer = rSlugifyReplacers[mode]; + if (replacer) { + if (mode === 'latin') + str = removeAccents(str); + str = str.replace(replacer, '-').replace(/^-|-$/g, ''); + } + return cased ? str : str.toLowerCase(); +} +function removeAccents(str) { + return str.replace(/[àáâãäå]/g, 'a') + .replace(/[æ]/g, 'ae') + .replace(/[ç]/g, 'c') + .replace(/[èéêë]/g, 'e') + .replace(/[ìíîï]/g, 'i') + .replace(/[ð]/g, 'd') + .replace(/[ñ]/g, 'n') + .replace(/[òóôõöø]/g, 'o') + .replace(/[ùúûü]/g, 'u') + .replace(/[ýÿ]/g, 'y') + .replace(/[ß]/g, 'ss') + .replace(/[œ]/g, 'oe') + .replace(/[þ]/g, 'th') + .replace(/[ẞ]/g, 'SS') + .replace(/[Œ]/g, 'OE') + .replace(/[Þ]/g, 'TH'); +} + +var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify +}); + +const join = argumentsToValue(function (v, arg) { + const array = toArray(v); + const sep = isNil(arg) ? ' ' : stringify(arg); + const complexity = array.length * (1 + sep.length); + this.context.memoryLimit.use(complexity); + return array.join(sep); +}); +const last$1 = argumentsToValue((v) => isArrayLike(v) ? last(v) : ''); +const first = argumentsToValue((v) => isArrayLike(v) ? v[0] : ''); +const reverse = argumentsToValue(function (v) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + return [...array].reverse(); +}); +function* sortBy(arr, property, comparator) { + const values = []; + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + values.push([ + item, + property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item + ]); + } + return values.sort((lhs, rhs) => comparator(lhs[1], rhs[1])).map(tuple => tuple[0]); +} +function* sort(arr, property) { + return yield* sortBy.call(this, arr, property, orderedCompare); +} +function* sort_natural(arr, property) { + return yield* sortBy.call(this, arr, property, caseInsensitiveCompare); +} +const size = (v) => (v && v.length) || 0; +function* map(arr, property) { + const results = []; + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + results.push(yield this.context._getFromScope(item, stringify(property), false)); + } + return results; +} +function* sum(arr, property) { + let sum = 0; + const array = toArray(arr); + for (const item of array) { + const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item); + sum += Number.isNaN(data) ? 0 : data; + } + return sum; +} +function compact(arr) { + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + return array.filter(x => !isNil(toValue(x))); +} +function concat(v, arg = []) { + const lhs = toArray(v); + const rhs = toArray(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs.concat(rhs); +} +function push(v, arg) { + return concat.call(this, v, [arg]); +} +function unshift(v, arg) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + const clone = [...array]; + clone.unshift(arg); + return clone; +} +function pop(v) { + const clone = [...toArray(v)]; + clone.pop(); + return clone; +} +function shift(v) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + const clone = [...array]; + clone.shift(); + return clone; +} +function slice(v, begin, length = 1) { + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + begin = begin < 0 ? v.length + begin : begin; + this.context.memoryLimit.use(length); + return v.slice(begin, begin + length); +} +function expectedMatcher(expected) { + if (this.context.opts.jekyllWhere) { + return (v) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected)); + } + else if (expected === undefined) { + return (v) => isTruthy(v, this.context); + } + else { + return (v) => equals(v, expected); + } +} +function* filter(include, arr, property, expected) { + const values = []; + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + const token = new Tokenizer(stringify(property)).readScopeValue(); + for (const item of arr) { + values.push(yield evalToken(token, this.context.spawn(item))); + } + const matcher = expectedMatcher.call(this, expected); + return arr.filter((_, i) => matcher(values[i]) === include); +} +function* filter_exp(include, arr, itemName, exp) { + const filtered = []; + const keyTemplate = new Value(stringify(exp), this.liquid); + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + this.context.push({ [itemName]: item }); + const value = yield keyTemplate.value(this.context); + this.context.pop(); + if (value === include) + filtered.push(item); + } + return filtered; +} +function* where(arr, property, expected) { + return yield* filter.call(this, true, arr, property, expected); +} +function* reject(arr, property, expected) { + return yield* filter.call(this, false, arr, property, expected); +} +function* where_exp(arr, itemName, exp) { + return yield* filter_exp.call(this, true, arr, itemName, exp); +} +function* reject_exp(arr, itemName, exp) { + return yield* filter_exp.call(this, false, arr, itemName, exp); +} +function* group_by(arr, property) { + const map = new Map(); + arr = toEnumerable(arr); + const token = new Tokenizer(stringify(property)).readScopeValue(); + this.context.memoryLimit.use(arr.length); + for (const item of arr) { + const key = yield evalToken(token, this.context.spawn(item)); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + } + return [...map.entries()].map(([name, items]) => ({ name, items })); +} +function* group_by_exp(arr, itemName, exp) { + const map = new Map(); + const keyTemplate = new Value(stringify(exp), this.liquid); + arr = toEnumerable(arr); + this.context.memoryLimit.use(arr.length); + for (const item of arr) { + this.context.push({ [itemName]: item }); + const key = yield keyTemplate.value(this.context); + this.context.pop(); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + } + return [...map.entries()].map(([name, items]) => ({ name, items })); +} +function* search(arr, property, expected) { + const token = new Tokenizer(stringify(property)).readScopeValue(); + const array = toArray(arr); + const matcher = expectedMatcher.call(this, expected); + for (let index = 0; index < array.length; index++) { + const value = yield evalToken(token, this.context.spawn(array[index])); + if (matcher(value)) + return [index, array[index]]; + } +} +function* search_exp(arr, itemName, exp) { + const predicate = new Value(stringify(exp), this.liquid); + const array = toArray(arr); + for (let index = 0; index < array.length; index++) { + this.context.push({ [itemName]: array[index] }); + const value = yield predicate.value(this.context); + this.context.pop(); + if (value) + return [index, array[index]]; + } +} +function* has(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return !!result; +} +function* has_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return !!result; +} +function* find_index(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return result ? result[0] : undefined; +} +function* find_index_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return result ? result[0] : undefined; +} +function* find(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return result ? result[1] : undefined; +} +function* find_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return result ? result[1] : undefined; +} +function uniq(arr) { + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + return [...new Set(arr)]; +} +function sample(v, count = 1) { + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + this.context.memoryLimit.use(count); + const shuffled = [...v].sort(() => Math.random() - 0.5); + if (count === 1) + return shuffled[0]; + return shuffled.slice(0, count); +} + +var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample +}); + +function date(v, format, timezoneOffset) { + const size = (v?.length ?? 0) + (timezoneOffset?.length ?? 0); + this.context.memoryLimit.use(size); + const date = parseDate(v, this.context.opts, timezoneOffset); + if (!date) + return v; + format = toValue(format); + format = isNil(format) ? this.context.opts.dateFormat : stringify(format); + this.context.memoryLimit.use(format.length); + return strftime(date, format, this.context.memoryLimit); +} +function date_to_xmlschema(v) { + return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z'); +} +function date_to_rfc822(v) { + return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z'); +} +function date_to_string(v, type, style) { + return stringify_date.call(this, v, '%b', type, style); +} +function date_to_long_string(v, type, style) { + return stringify_date.call(this, v, '%B', type, style); +} +function stringify_date(v, month_type, type, style) { + const date = parseDate(v, this.context.opts); + if (!date) + return v; + const ml = this.context.memoryLimit; + if (type === 'ordinal') { + const d = date.getDate(); + return style === 'US' + ? strftime(date, `${month_type} ${d}%q, %Y`, ml) + : strftime(date, `${d}%q ${month_type} %Y`, ml); + } + return strftime(date, `%d ${month_type} %Y`, ml); +} +function parseDate(v, opts, timezoneOffset) { + let date; + const defaultTimezoneOffset = timezoneOffset ?? opts.timezoneOffset; + const locale = opts.locale; + v = toValue(v); + if (isNil(v)) { + return undefined; + } + else if (v === 'now' || v === 'today') { + date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset); + } + else if (isNumber(v)) { + date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset); + } + else if (isString(v)) { + if (/^\d+$/.test(v)) { + date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset); + } + else if (opts.preserveTimezones && timezoneOffset === undefined) { + date = LiquidDate.createDateFixedToTimezone(v, locale); + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + return date.valid() ? date : undefined; +} + +var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string +}); + +/** + * String related filters + * + * * prefer stringify() to String() since `undefined`, `null` should eval '' + */ +const rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu; +// Word boundary followed by word characters (for detecting words) +const rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu; +function append(v, arg) { + assert(arguments.length === 2, 'append expect 2 arguments'); + const lhs = stringify(v); + const rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs + rhs; +} +function prepend(v, arg) { + assert(arguments.length === 2, 'prepend expect 2 arguments'); + const lhs = stringify(v); + const rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return rhs + lhs; +} +function lstrip(v, chars) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (let i = 0, set = new Set(chars); i < str.length; i++) { + if (!set.has(str[i])) + return str.slice(i); + } + return ''; + } + return str.trimStart(); +} +function downcase(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.toLowerCase(); +} +function upcase(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return stringify(str).toUpperCase(); +} +function remove(v, arg) { + const str = stringify(v); + arg = stringify(arg); + this.context.memoryLimit.use(str.length + arg.length); + return str.split(arg).join(''); +} +function remove_first(v, l) { + const str = stringify(v); + l = stringify(l); + this.context.memoryLimit.use(str.length + l.length); + return str.replace(l, ''); +} +function remove_last(v, l) { + const str = stringify(v); + const pattern = stringify(l); + this.context.memoryLimit.use(str.length + pattern.length); + const index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + str.substring(index + pattern.length); +} +function rstrip(str, chars) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (let i = str.length - 1, set = new Set(chars); i >= 0; i--) { + if (!set.has(str[i])) + return str.slice(0, i + 1); + } + return ''; + } + return str.trimEnd(); +} +function split(v, arg) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + const arr = str.split(stringify(arg)); + // align to ruby split, which is the behavior of shopify/liquid + // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split + while (arr.length && arr[arr.length - 1] === '') + arr.pop(); + return arr; +} +function strip(v, chars) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + const set = new Set(stringify(chars)); + this.context.memoryLimit.use(set.size); + let i = 0; + let j = str.length - 1; + while (set.has(str[i])) + i++; + while (j >= i && set.has(str[j])) + j--; + return str.slice(i, j + 1); + } + return str.trim(); +} +function strip_newlines(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, ''); +} +function capitalize(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); +} +function replace(v, pattern, replacement) { + const str = stringify(v); + pattern = stringify(pattern); + replacement = stringify(replacement); + const parts = str.split(pattern); + const outputSize = str.length + (parts.length - 1) * (replacement.length - pattern.length); + this.context.memoryLimit.use(outputSize); + return parts.join(replacement); +} +function replace_first(v, arg1, arg2) { + const str = stringify(v); + arg1 = stringify(arg1); + arg2 = stringify(arg2); + this.context.memoryLimit.use(str.length + arg1.length + arg2.length); + return str.replace(arg1, () => arg2); +} +function replace_last(v, arg1, arg2) { + const str = stringify(v); + const pattern = stringify(arg1); + const replacement = stringify(arg2); + this.context.memoryLimit.use(str.length + pattern.length + replacement.length); + const index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + replacement + str.substring(index + pattern.length); +} +function truncate(v, l = 50, o = '...') { + const str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + if (str.length <= l) + return v; + return str.substring(0, l - o.length) + o; +} +function truncatewords(v, words = 15, o = '...') { + const str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + const arr = str.split(/\s+/); + if (words <= 0) + words = 1; + let ret = arr.slice(0, words).join(' '); + if (arr.length >= words) + ret += o; + return ret; +} +function normalize_whitespace(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\s+/g, ' '); +} +function number_of_words(input, mode) { + const str = stringify(input); + this.context.memoryLimit.use(str.length); + input = str.trim(); + if (!input) + return 0; + switch (mode) { + case 'cjk': + // Count CJK characters and words + return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length; + case 'auto': + // Count CJK characters, if none, count words + return rCJKWord.test(input) + ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length + : input.split(/\s+/).length; + default: + // Count words only + return input.split(/\s+/).length; + } +} +function array_to_sentence_string(array, connector = 'and') { + connector = stringify(connector); + this.context.memoryLimit.use(array.length + connector.length); + switch (array.length) { + case 0: + return ''; + case 1: + return array[0]; + case 2: + return `${array[0]} ${connector} ${array[1]}`; + default: + return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`; + } +} + +var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string +}); + +function base64Encode(str) { + return Buffer.from(str, 'utf8').toString('base64'); +} +function base64Decode(str) { + return Buffer.from(str, 'base64').toString('utf8'); +} + +/** + * Base64 related filters + * + * Implements base64_encode and base64_decode filters for Shopify compatibility + */ +function base64_encode(value) { + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + this.context.memoryLimit.use(value.byteLength); + return value.toString('base64'); + } + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Encode(str); +} +function base64_decode(value) { + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Decode(str); +} + +var base64Filters = /*#__PURE__*/Object.freeze({ + __proto__: null, + base64_encode: base64_encode, + base64_decode: base64_decode +}); + +function sha256(str) { + return crypto.createHash('sha256').update(str, 'utf8').digest('hex'); +} +function hmacSha256(str, key) { + return crypto.createHmac('sha256', key).update(str, 'utf8').digest('hex'); +} + +/** + * Crypto related filters + * + * Implements sha256 and hmac_sha256 filters for Shopify compatibility + */ +function sha256$1(value) { + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return sha256(str); +} +function hmac_sha256(value, key) { + const str = stringify(value); + const keyStr = stringify(key); + this.context.memoryLimit.use(str.length + keyStr.length); + return hmacSha256(str, keyStr); +} + +var cryptoFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + sha256: sha256$1, + hmac_sha256: hmac_sha256 +}); + +const filters = { + ...htmlFilters, + ...mathFilters, + ...urlFilters, + ...arrayFilters, + ...dateFilters, + ...stringFilters, + ...base64Filters, + ...cryptoFilters, + ...misc +}; + +class AssignTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.key = this.identifier.content; + this.tokenizer.assert(this.key, 'expected variable name'); + this.tokenizer.skipBlank(); + this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected "="'); + this.tokenizer.advance(); + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + } + *render(ctx) { + ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf); + } + *arguments() { + yield this.value; + } + *localScope() { + yield this.identifier; + } +} + +const MODIFIERS = ['offset', 'limit', 'reversed']; +class ForTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const variable = this.tokenizer.readIdentifier(); + const inStr = this.tokenizer.readIdentifier(); + const collection = this.tokenizer.readValue(); + if (!variable.size() || inStr.content !== 'in' || !collection) { + throw new Error(`illegal tag: ${token.getText()}`); + } + this.variable = variable.content; + this.collection = collection; + this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = []; + this.elseTemplates = []; + let p; + const stream = parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates; }) + .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop(); }) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { throw new Error(`tag ${token.getText()} not closed`); }); + stream.start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + let collection = toEnumerable(yield evalToken(this.collection, ctx)); + if (!collection.length) { + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + return; + } + const continueKey = 'continue-' + this.variable + '-' + this.collection.getText(); + ctx.push(createScope({ continue: ctx.getRegister(continueKey, {}) })); + const hash = yield this.hash.render(ctx); + ctx.pop(); + const modifiers = this.liquid.options.orderedFilterParameters + ? Object.keys(hash).filter(x => MODIFIERS.includes(x)) + : MODIFIERS.filter(x => hash[x] !== undefined); + collection = modifiers.reduce((collection, modifier) => { + if (modifier === 'offset') + return offset(collection, hash['offset']); + if (modifier === 'limit') + return limit(collection, hash['limit']); + return reversed(collection); + }, collection); + ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length); + const scope = createScope({ forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }); + ctx.push(scope); + for (const item of collection) { + scope[this.variable] = item; + ctx.continueCalled = ctx.breakCalled = false; + yield r.renderTemplates(this.templates, ctx, emitter); + if (ctx.breakCalled) + break; + scope.forloop.next(); + } + ctx.continueCalled = ctx.breakCalled = false; + ctx.pop(); + } + *children() { + const templates = this.templates.slice(); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } + *arguments() { + yield this.collection; + for (const v of Object.values(this.hash.hash)) { + if (isValueToken(v)) { + yield v; + } + } + } + blockScope() { + return [this.variable, 'forloop']; + } +} +function reversed(arr) { + return [...arr].reverse(); +} +function offset(arr, count) { + return arr.slice(count); +} +function limit(arr, count) { + return arr.slice(0, count); +} + +class CaptureTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.templates = []; + this.identifier = this.readVariable(); + this.variable = this.identifier.content; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcapture') + return; + this.templates.push(parser.parseToken(token, remainTokens)); + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + readVariable() { + let ident = this.tokenizer.readIdentifier(); + if (ident.content) + return ident; + ident = this.tokenizer.readQuoted(); + if (ident) + return ident; + throw this.tokenizer.error('invalid capture name'); + } + *render(ctx) { + const r = this.liquid.renderer; + const html = yield r.renderTemplates(this.templates, ctx); + ctx.bottom()[this.variable] = html; + } + *children() { + return this.templates; + } + *localScope() { + yield this.identifier; + } +} + +class CaseTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + this.elseTemplates = []; + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + this.elseTemplates = []; + let p = []; + let elseCount = 0; + const stream = parser.parseStream(remainTokens) + .on('tag:when', (token) => { + if (elseCount > 0) { + return; + } + p = []; + const values = []; + while (!token.tokenizer.end()) { + values.push(token.tokenizer.readValueOrThrow()); + token.tokenizer.skipBlank(); + if (token.tokenizer.peek() === ',') { + token.tokenizer.readTo(','); + } + else { + token.tokenizer.readTo('or'); + } + } + this.branches.push({ + values, + templates: p + }); + }) + .on('tag:else', () => { + elseCount++; + p = this.elseTemplates; + }) + .on('tag:endcase', () => stream.stop()) + .on('template', (tpl) => { + if (p !== this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + stream.start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf)); + let branchHit = false; + for (const branch of this.branches) { + for (const valueToken of branch.values) { + const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf); + if (equals(target, value)) { + yield r.renderTemplates(branch.templates, ctx, emitter); + branchHit = true; + break; + } + } + } + if (!branchHit) { + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + } + } + *arguments() { + yield this.value; + yield* this.branches.flatMap(b => b.values); + } + *children() { + const templates = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } +} + +class CommentTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcomment') + return; + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + render() { } +} + +class RenderTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const tokenizer = this.tokenizer; + this.file = parseFilePath(tokenizer, this.liquid, parser); + this.currentFile = token.file; + while (!tokenizer.end()) { + tokenizer.skipBlank(); + const begin = tokenizer.p; + const keyword = tokenizer.readIdentifier(); + if (keyword.content === 'with' || keyword.content === 'for') { + tokenizer.skipBlank(); + // can be normal key/value pair, like "with: true" + if (tokenizer.peek() !== ':') { + const value = tokenizer.readValue(); + // can be normal key, like "with," + if (value) { + const beforeAs = tokenizer.p; + const asStr = tokenizer.readIdentifier(); + let alias; + if (asStr.content === 'as') + alias = tokenizer.readIdentifier(); + else + tokenizer.p = beforeAs; + this[keyword.content] = { value, alias: alias && alias.content }; + tokenizer.skipBlank(); + if (tokenizer.peek() === ',') + tokenizer.advance(); + continue; // matched! + } + } + } + /** + * restore cursor if with/for not matched + */ + tokenizer.p = begin; + break; + } + this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator); + } + *render(ctx, emitter) { + const { liquid, hash } = this; + const filepath = (yield renderFilePath(this['file'], ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const childCtx = ctx.spawn(); + const scope = childCtx.bottom(); + __assign(scope, yield hash.render(ctx)); + if (this['with']) { + const { value, alias } = this['with']; + scope[alias || filepath] = yield evalToken(value, ctx); + } + if (this['for']) { + const { value, alias } = this['for']; + const collection = toEnumerable(yield evalToken(value, ctx)); + scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias); + for (const item of collection) { + scope[alias] = item; + const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])); + yield liquid.renderer.renderTemplates(templates, childCtx, emitter); + scope['forloop'].next(); + } + } + else { + const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])); + yield liquid.renderer.renderTemplates(templates, childCtx, emitter); + } + } + *children(partials, sync) { + if (partials && isString(this['file'])) { + return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])); + } + return []; + } + partialScope() { + if (isString(this['file'])) { + const names = Object.keys(this.hash.hash); + if (this['with']) { + const { value, alias } = this['with']; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + if (this['for']) { + const { value, alias } = this['for']; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + return { name: this['file'], isolated: true, scope: names }; + } + } + *arguments() { + for (const v of Object.values(this.hash.hash)) { + if (isValueToken(v)) { + yield v; + } + } + if (this['with']) { + const { value } = this['with']; + if (isValueToken(value)) { + yield value; + } + } + if (this['for']) { + const { value } = this['for']; + if (isValueToken(value)) { + yield value; + } + } + } +} +/** + * @return null for "none", + * @return Template[] for quoted with tags and/or filters + * @return Token for expression (not quoted) + * @throws TypeError if cannot read next token + */ +function parseFilePath(tokenizer, liquid, parser) { + if (liquid.options.dynamicPartials) { + const file = tokenizer.readValue(); + tokenizer.assert(file, 'illegal file path'); + if (file.getText() === 'none') + return; + if (isQuotedToken(file)) { + // for filenames like "files/{{file}}", eval as liquid template + const templates = parser.parse(evalQuotedToken(file)); + return optimize(templates); + } + return file; + } + const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]; + const templates = optimize(parser.parseTokens(tokens)); + return templates === 'none' ? undefined : templates; +} +function optimize(templates) { + // for filenames like "files/file.liquid", extract the string directly + if (templates.length === 1 && isHTMLToken(templates[0].token)) + return templates[0].token.getContent(); + return templates; +} +function* renderFilePath(file, ctx, liquid) { + if (typeof file === 'string') + return file; + if (Array.isArray(file)) + return liquid.renderer.renderTemplates(file, ctx); + return yield evalToken(file, ctx); +} + +class IncludeTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const { tokenizer } = token; + this['file'] = parseFilePath(tokenizer, this.liquid, parser); + this['currentFile'] = token.file; + const begin = tokenizer.p; + const withStr = tokenizer.readIdentifier(); + if (withStr.content === 'with') { + tokenizer.skipBlank(); + if (tokenizer.peek() !== ':') { + this.withVar = tokenizer.readValue(); + } + else + tokenizer.p = begin; + } + else + tokenizer.p = begin; + this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator); + } + *render(ctx, emitter) { + const { liquid, hash, withVar } = this; + const { renderer } = liquid; + const filepath = (yield renderFilePath(this['file'], ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const saved = ctx.saveRegister('blocks', 'blockMode'); + ctx.setRegister('blocks', {}); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + const scope = createScope((yield hash.render(ctx))); + if (withVar) + scope[filepath] = yield evalToken(withVar, ctx); + const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])); + ctx.push(ctx.opts.jekyllInclude ? createScope({ include: scope }) : scope); + yield renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + ctx.restoreRegister(saved); + } + *children(partials, sync) { + if (partials && isString(this['file'])) { + return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])); + } + return []; + } + partialScope() { + if (isString(this['file'])) { + let names; + if (this.liquid.options.jekyllInclude) { + names = ['include']; + } + else { + names = Object.keys(this.hash.hash); + if (this.withVar) { + names.push([this['file'], this.withVar]); + } + } + return { name: this['file'], isolated: false, scope: names }; + } + } + *arguments() { + yield* Object.values(this.hash.hash).filter(isValueToken); + if (isValueToken(this['file'])) { + yield this['file']; + } + if (isValueToken(this.withVar)) { + yield this.withVar; + } + } +} + +class DecrementTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.variable = this.identifier.content; + } + render(context, emitter) { + const scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + emitter.write(stringify(--scope[this.variable])); + } + *localScope() { + yield this.identifier; + } +} + +class CycleTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.candidates = []; + const group = this.tokenizer.readValue(); + this.tokenizer.skipBlank(); + if (group) { + if (this.tokenizer.peek() === ':') { + this.group = group; + this.tokenizer.advance(); + } + else + this.candidates.push(group); + } + while (!this.tokenizer.end()) { + const value = this.tokenizer.readValue(); + if (value) + this.candidates.push(value); + this.tokenizer.readTo(','); + } + this.tokenizer.assert(this.candidates.length, () => `empty candidates: "${token.getText()}"`); + } + *render(ctx, emitter) { + const group = (yield evalToken(this.group, ctx)); + const fingerprint = `cycle:${group}:` + this.candidates.join(','); + const groups = ctx.getRegister('cycle', {}); + let idx = groups[fingerprint]; + if (idx === undefined) { + idx = groups[fingerprint] = 0; + } + const candidate = this.candidates[idx]; + idx = (idx + 1) % this.candidates.length; + groups[fingerprint] = idx; + return yield evalToken(candidate, ctx); + } + *arguments() { + yield* this.candidates; + if (this.group) { + yield this.group; + } + } +} + +class IfTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + let p = []; + parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid), + templates: (p = []) + })) + .on('tag:elsif', (token) => { + assert(!this.elseTemplates, 'unexpected elsif after else'); + this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), this.liquid), + templates: (p = []) + }); + }) + .on('tag:else', tag => { + assertEmpty(tag.args); + assert(!this.elseTemplates, 'duplicated else'); + p = this.elseTemplates = []; + }) + .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); }) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); }) + .start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + for (const { value, templates } of this.branches) { + const v = yield value.value(ctx, ctx.opts.lenientIf); + if (isTruthy(v, ctx)) { + yield r.renderTemplates(templates, ctx, emitter); + return; + } + } + yield r.renderTemplates(this.elseTemplates || [], ctx, emitter); + } + *children() { + const templates = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } + arguments() { + return this.branches.map(b => b.value); + } +} + +class IncrementTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.variable = this.identifier.content; + } + render(context, emitter) { + const scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + const val = scope[this.variable]; + scope[this.variable]++; + emitter.write(stringify(val)); + } + *localScope() { + yield this.identifier; + } +} + +class LayoutTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + this.file = parseFilePath(this.tokenizer, this.liquid, parser); + this['currentFile'] = token.file; + this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = parser.parseTokens(remainTokens); + } + *render(ctx, emitter) { + const { liquid, args, file } = this; + const { renderer } = liquid; + if (file === undefined) { + ctx.setRegister('blockMode', BlockMode.OUTPUT); + yield renderer.renderTemplates(this.templates, ctx, emitter); + return; + } + const filepath = (yield renderFilePath(this.file, ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])); + // render remaining contents and store rendered results + ctx.setRegister('blockMode', BlockMode.STORE); + const html = yield renderer.renderTemplates(this.templates, ctx); + const blocks = ctx.getRegister('blocks', {}); + // set whole content to anonymous block if anonymous doesn't specified + if (blocks[''] === undefined) + blocks[''] = (parent, emitter) => emitter.write(html); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + // render the layout file use stored blocks + ctx.push(createScope((yield args.render(ctx)))); + yield renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + } + *children(partials) { + const templates = this.templates.slice(); + if (partials && isString(this.file)) { + templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile']))); + } + return templates; + } + *arguments() { + for (const v of Object.values(this.args.hash)) { + if (isValueToken(v)) { + yield v; + } + } + if (isValueToken(this.file)) { + yield this.file; + } + } + partialScope() { + if (isString(this.file)) { + return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }; + } + } +} + +class BlockTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + this.templates = []; + const match = /\w+/.exec(token.args); + this.block = match ? match[0] : ''; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endblock') + return; + const template = parser.parseToken(token, remainTokens); + this.templates.push(template); + } + throw new Error(`tag ${token.getText()} not closed`); + } + *render(ctx, emitter) { + const blockRender = this.getBlockRender(ctx); + if (ctx.getRegister('blockMode') === BlockMode.STORE) { + ctx.getRegister('blocks', {})[this.block] = blockRender; + } + else { + yield blockRender(new BlockDrop(), emitter); + } + } + getBlockRender(ctx) { + const self = this; + const { liquid, templates } = this; + const renderChild = ctx.getRegister('blocks', {})[this.block]; + const renderCurrent = function* (superBlock, emitter) { + const stack = ctx.getRegister('blockStack', []); + if (stack.includes(self)) + throw new Error('block tag cannot be nested'); + stack.push(self); + ctx.push(createScope({ block: superBlock })); + yield liquid.renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + stack.pop(); + }; + return renderChild + ? (superBlock, emitter) => renderChild(new BlockDrop((emitter) => renderCurrent(superBlock, emitter)), emitter) + : renderCurrent; + } + *children() { + return this.templates; + } + blockScope() { + return ['block']; + } +} + +class RawTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + this.tokens = []; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endraw') + return; + this.tokens.push(token); + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + render() { + return this.tokens.map((token) => token.getText()).join(''); + } +} + +class TablerowloopDrop extends ForloopDrop { + constructor(length, cols, collection, variable) { + super(length, collection, variable); + this.length = length; + this.cols = cols; + } + row() { + return Math.floor(this.i / this.cols) + 1; + } + col0() { + return (this.i % this.cols); + } + col() { + return this.col0() + 1; + } + col_first() { + return this.col0() === 0; + } + col_last() { + return this.col() === this.cols; + } +} + +class TablerowTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + const variable = this.tokenizer.readIdentifier(); + this.tokenizer.skipBlank(); + const predicate = this.tokenizer.readIdentifier(); + const collectionToken = this.tokenizer.readValue(); + if (predicate.content !== 'in' || !collectionToken) { + throw new Error(`illegal tag: ${tagToken.getText()}`); + } + this.variable = variable.content; + this.collection = collectionToken; + this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = []; + let p; + const stream = parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:endtablerow', () => stream.stop()) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + stream.start(); + } + *render(ctx, emitter) { + let collection = toEnumerable(yield evalToken(this.collection, ctx)); + const args = (yield this.args.render(ctx)); + const offset = args.offset || 0; + const limit = (args.limit === undefined) ? collection.length : args.limit; + collection = collection.slice(offset, offset + limit); + const cols = args.cols || collection.length; + const r = this.liquid.renderer; + const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable); + const scope = createScope({ tablerowloop }); + ctx.push(scope); + for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) { + scope[this.variable] = collection[idx]; + if (tablerowloop.col0() === 0) { + if (tablerowloop.row() !== 1) + emitter.write(''); + emitter.write(``); + } + emitter.write(``); + yield r.renderTemplates(this.templates, ctx, emitter); + emitter.write(''); + } + if (collection.length) + emitter.write(''); + ctx.pop(); + } + *children() { + return this.templates; + } + *arguments() { + yield this.collection; + for (const v of Object.values(this.args.hash)) { + if (isValueToken(v)) { + yield v; + } + } + } + blockScope() { + return [this.variable, 'tablerowloop']; + } +} + +class UnlessTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + this.elseTemplates = []; + let p = []; + let elseCount = 0; + parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid), + test: isFalsy, + templates: (p = []) + })) + .on('tag:elsif', (token) => { + if (elseCount > 0) { + p = []; + return; + } + this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), this.liquid), + test: isTruthy, + templates: (p = []) + }); + }) + .on('tag:else', () => { + elseCount++; + p = this.elseTemplates; + }) + .on('tag:endunless', function () { this.stop(); }) + .on('template', (tpl) => { + if (p !== this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); }) + .start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + for (const { value, test, templates } of this.branches) { + const v = yield value.value(ctx, ctx.opts.lenientIf); + if (test(v, ctx)) { + yield r.renderTemplates(templates, ctx, emitter); + return; + } + } + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + } + *children() { + const children = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + children.push(...this.elseTemplates); + } + return children; + } + arguments() { + return this.branches.map(b => b.value); + } +} + +class BreakTag extends Tag { + render(ctx, _emitter) { + ctx.breakCalled = true; + } +} + +class ContinueTag extends Tag { + render(ctx, _emitter) { + ctx.continueCalled = true; + } +} + +class EchoTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.tokenizer.skipBlank(); + if (!this.tokenizer.end()) { + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + } + } + *render(ctx, emitter) { + if (!this.value) + return; + const val = yield this.value.value(ctx, false); + emitter.write(val); + } + *arguments() { + if (this.value) { + yield this.value; + } + } +} + +class LiquidTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options); + this.templates = parser.parseTokens(tokens); + } + *render(ctx, emitter) { + yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter); + } + *children() { + return this.templates; + } +} + +class InlineCommentTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) { + throw new Error('every line of an inline comment must start with a \'#\' character'); + } + } + render() { } +} + +const tags = { + assign: AssignTag, + 'for': ForTag, + capture: CaptureTag, + 'case': CaseTag, + comment: CommentTag, + include: IncludeTag, + render: RenderTag, + decrement: DecrementTag, + increment: IncrementTag, + cycle: CycleTag, + 'if': IfTag, + layout: LayoutTag, + block: BlockTag, + raw: RawTag, + tablerow: TablerowTag, + unless: UnlessTag, + 'break': BreakTag, + 'continue': ContinueTag, + echo: EchoTag, + liquid: LiquidTag, + '#': InlineCommentTag +}; + +class Liquid { + constructor(opts = {}) { + this.renderer = new Render(); + this.filters = Object.create(null); + this.tags = Object.create(null); + this.options = normalize(opts); + // eslint-disable-next-line deprecation/deprecation + this.parser = new Parser(this); + forOwn(tags, (conf, name) => this.registerTag(name, conf)); + forOwn(filters, (handler, name) => this.registerFilter(name, handler)); + } + parse(html, filepath) { + const parser = new Parser(this); + return parser.parse(html, filepath); + } + _render(tpl, scope, renderOptions) { + const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplates(tpl, ctx); + } + async render(tpl, scope, renderOptions) { + return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false })); + } + renderSync(tpl, scope, renderOptions) { + return toValueSync(this._render(tpl, scope, { ...renderOptions, sync: true })); + } + renderToNodeStream(tpl, scope, renderOptions = {}) { + const ctx = new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplatesToNodeStream(tpl, ctx); + } + _parseAndRender(html, scope, renderOptions) { + const tpl = this.parse(html); + return this._render(tpl, scope, renderOptions); + } + async parseAndRender(html, scope, renderOptions) { + return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false })); + } + parseAndRenderSync(html, scope, renderOptions) { + return toValueSync(this._parseAndRender(html, scope, { ...renderOptions, sync: true })); + } + _parsePartialFile(file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, exports.LookupType.Partials, currentFile); + } + _parseLayoutFile(file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, exports.LookupType.Layouts, currentFile); + } + _parseFile(file, sync, lookupType, currentFile) { + return new Parser(this).parseFile(file, sync, lookupType, currentFile); + } + async parseFile(file, lookupType) { + return toPromise(new Parser(this).parseFile(file, false, lookupType)); + } + parseFileSync(file, lookupType) { + return toValueSync(new Parser(this).parseFile(file, true, lookupType)); + } + *_renderFile(file, ctx, renderFileOptions) { + const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)); + return yield this._render(templates, ctx, renderFileOptions); + } + async renderFile(file, ctx, renderFileOptions) { + return toPromise(this._renderFile(file, ctx, { ...renderFileOptions, sync: false })); + } + renderFileSync(file, ctx, renderFileOptions) { + return toValueSync(this._renderFile(file, ctx, { ...renderFileOptions, sync: true })); + } + async renderFileToNodeStream(file, scope, renderOptions) { + const templates = await this.parseFile(file); + return this.renderToNodeStream(templates, scope, renderOptions); + } + _evalValue(str, scope) { + const value = new Value(str, this); + const ctx = scope instanceof Context ? scope : new Context(scope, this.options); + return value.value(ctx); + } + async evalValue(str, scope) { + return toPromise(this._evalValue(str, scope)); + } + evalValueSync(str, scope) { + return toValueSync(this._evalValue(str, scope)); + } + registerFilter(name, filter) { + this.filters[name] = filter; + } + registerTag(name, tag) { + this.tags[name] = isFunction(tag) ? tag : createTagClass(tag); + } + plugin(plugin) { + return plugin.call(this, Liquid); + } + express() { + const self = this; // eslint-disable-line + let firstCall = true; + return function (filePath, ctx, callback) { + if (firstCall) { + firstCall = false; + const dirs = normalizeDirectoryList(this.root); + self.options.root.unshift(...dirs); + self.options.layouts.unshift(...dirs); + self.options.partials.unshift(...dirs); + } + self.renderFile(filePath, ctx).then(html => callback(null, html), callback); + }; + } + async analyze(template, options = {}) { + return analyze(template, options); + } + analyzeSync(template, options = {}) { + return analyzeSync(template, options); + } + async parseAndAnalyze(html, filename, options = {}) { + return analyze(this.parse(html, filename), options); + } + parseAndAnalyzeSync(html, filename, options = {}) { + return analyzeSync(this.parse(html, filename), options); + } + /** Return an array of all variables without their properties. */ + async variables(template, options = {}) { + const analysis = await analyze(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + } + /** Return an array of all variables without their properties. */ + variablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + } + /** Return an array of all variables including their properties/paths. */ + async fullVariables(template, options = {}) { + const analysis = await analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all variables including their properties/paths. */ + fullVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all variables, each as an array of properties/segments. */ + async variableSegments(template, options = {}) { + const analysis = await analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray())))); + } + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegmentsSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray())))); + } + /** Return an array of all expected context variables without their properties. */ + async globalVariables(template, options = {}) { + const analysis = await analyze(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + } + /** Return an array of all expected context variables without their properties. */ + globalVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + } + /** Return an array of all expected context variables including their properties/paths. */ + async globalFullVariables(template, options = {}) { + const analysis = await analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all expected context variables, each as an array of properties/segments. */ + async globalVariableSegments(template, options = {}) { + const analysis = await analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray())))); + } + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegmentsSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray())))); + } +} + +/* istanbul ignore file */ +const version = '10.27.0'; + +exports.AssertionError = AssertionError; +exports.AssignTag = AssignTag; +exports.BlockTag = BlockTag; +exports.BreakTag = BreakTag; +exports.CaptureTag = CaptureTag; +exports.CaseTag = CaseTag; +exports.CommentTag = CommentTag; +exports.Context = Context; +exports.ContinueTag = ContinueTag; +exports.CycleTag = CycleTag; +exports.DecrementTag = DecrementTag; +exports.Drop = Drop; +exports.EchoTag = EchoTag; +exports.Expression = Expression; +exports.Filter = Filter; +exports.ForTag = ForTag; +exports.Hash = Hash; +exports.IfTag = IfTag; +exports.IncludeTag = IncludeTag; +exports.IncrementTag = IncrementTag; +exports.InlineCommentTag = InlineCommentTag; +exports.LayoutTag = LayoutTag; +exports.Liquid = Liquid; +exports.LiquidError = LiquidError; +exports.LiquidTag = LiquidTag; +exports.Output = Output; +exports.ParseError = ParseError; +exports.ParseStream = ParseStream; +exports.Parser = Parser; +exports.RawTag = RawTag; +exports.RenderError = RenderError; +exports.RenderTag = RenderTag; +exports.TablerowTag = TablerowTag; +exports.Tag = Tag; +exports.TagToken = TagToken; +exports.Token = Token; +exports.TokenizationError = TokenizationError; +exports.Tokenizer = Tokenizer; +exports.TypeGuards = typeGuards; +exports.UndefinedVariableError = UndefinedVariableError; +exports.UnlessTag = UnlessTag; +exports.Value = Value; +exports.Variable = Variable; +exports.analyze = analyze; +exports.analyzeSync = analyzeSync; +exports.assert = assert; +exports.createTrie = createTrie; +exports.defaultOperators = defaultOperators; +exports.defaultOptions = defaultOptions; +exports.evalQuotedToken = evalQuotedToken; +exports.evalToken = evalToken; +exports.filters = filters; +exports.isFalsy = isFalsy; +exports.isTruthy = isTruthy; +exports.tags = tags; +exports.toPromise = toPromise; +exports.toValue = toValue; +exports.toValueSync = toValueSync; +exports.version = version; diff --git a/node_modules/liquidjs/dist/liquid.node.mjs b/node_modules/liquidjs/dist/liquid.node.mjs new file mode 100644 index 0000000..8a4337e --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.node.mjs @@ -0,0 +1,5121 @@ +/* + * liquidjs@10.27.0, https://github.com/harttle/liquidjs + * (c) 2016-2026 harttle + * Released under the MIT License. + */ +import { PassThrough } from 'stream'; +import { sep, extname, resolve as resolve$1, dirname as dirname$1 } from 'path'; +import { statSync, readFileSync as readFileSync$1, realpathSync, stat, readFile as readFile$1, realpath } from 'fs'; +import { createRequire } from 'module'; +import { createHash, createHmac } from 'crypto'; + +class Token { + constructor(kind, input, begin, end, file) { + this.kind = kind; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } + getText() { + return this.input.slice(this.begin, this.end); + } + getPosition() { + let [row, col] = [1, 1]; + for (let i = 0; i < this.begin; i++) { + if (this.input[i] === '\n') { + row++; + col = 1; + } + else + col++; + } + return [row, col]; + } + size() { + return this.end - this.begin; + } +} + +class Drop { + liquidMethodMissing(key, context) { + return undefined; + } +} + +const toString$1 = Object.prototype.toString; +const toLowerCase = String.prototype.toLowerCase; +const hasOwnProperty = Object.hasOwnProperty; +function isString(value) { + return typeof value === 'string'; +} +// eslint-disable-next-line @typescript-eslint/ban-types +function isFunction(value) { + return typeof value === 'function'; +} +function isPromise(val) { + return val && isFunction(val.then); +} +function isIterator(val) { + return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return); +} +function promisify(fn) { + return function (...args) { + return new Promise((resolve, reject) => { + fn(...args, (err, result) => { + err ? reject(err) : resolve(result); + }); + }); + }; +} +function stringify(value) { + value = toValue(value); + if (isString(value)) + return value; + if (isNil(value)) + return ''; + if (isArray(value)) + return value.map(x => stringify(x)).join(''); + return String(value); +} +function toEnumerable(val) { + val = toValue(val); + if (isArray(val)) + return val; + if (isString(val) && val.length > 0) + return [val]; + if (isIterable(val)) + return Array.from(val); + if (isObject(val)) + return Object.keys(val).map((key) => [key, val[key]]); + return []; +} +function toArray(val) { + val = toValue(val); + if (isNil(val)) + return []; + if (isArray(val)) + return val; + return [val]; +} +function toValue(value) { + return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value; +} +function toNumber(value) { + return +toValue(value) || 0; +} +function isNumber(value) { + return typeof value === 'number'; +} +function toLiquid(value) { + if (value && isFunction(value.toLiquid)) + return toLiquid(value.toLiquid()); + return value; +} +function isNil(value) { + return value == null; +} +function isUndefined(value) { + return value === undefined; +} +function isArray(value) { + // be compatible with IE 8 + return toString$1.call(value) === '[object Array]'; +} +function isArrayLike(value) { + return value && isNumber(value.length); +} +function isIterable(value) { + return isObject(value) && Symbol.iterator in value; +} +/* + * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property. + * The iteratee is invoked with three arguments: (value, key, object). + * Iteratee functions may exit iteration early by explicitly returning false. + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @return {Object} Returns object. + */ +function forOwn(obj, iteratee) { + obj = obj || {}; + for (const k in obj) { + if (hasOwnProperty.call(obj, k)) { + if (iteratee(obj[k], k, obj) === false) + break; + } + } + return obj; +} +function last(arr) { + return arr[arr.length - 1]; +} +/* + * Checks if value is the language type of Object. + * (e.g. arrays, functions, objects, regexes, new Number(0), and new String('')) + * @param {any} value The value to check. + * @return {Boolean} Returns true if value is an object, else false. + */ +function isObject(value) { + const type = typeof value; + return value !== null && (type === 'object' || type === 'function'); +} +function range(start, stop, step = 1) { + const arr = []; + for (let i = start; i < stop; i += step) { + arr.push(i); + } + return arr; +} +function padStart(str, length, ch = ' ') { + return pad(str, length, ch, (str, ch) => ch + str); +} +function padEnd(str, length, ch = ' ') { + return pad(str, length, ch, (str, ch) => str + ch); +} +function pad(str, length, ch, add) { + str = String(str); + const n = length - str.length; + if (n <= 0) + return str; + return add(str, ch.repeat(n)); +} +function identify(val) { + return val; +} +function changeCase(str) { + const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z'); + return hasLowerCase ? str.toUpperCase() : str.toLowerCase(); +} +function ellipsis(str, N) { + return str.length > N ? str.slice(0, N - 3) + '...' : str; +} +function orderedCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} +// compare string in case-insensitive way, undefined values to the tail +function caseInsensitiveCompare(a, b) { + if (isNil(a) && isNil(b)) + return 0; + if (isNil(a)) + return 1; + if (isNil(b)) + return -1; + a = toLowerCase.call(a); + b = toLowerCase.call(b); + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} +function argumentsToValue(fn) { + return function (...args) { return fn.call(this, ...args.map(toValue)); }; +} +function argumentsToNumber(fn) { + return function (...args) { return fn.call(this, ...args.map(toNumber)); }; +} +/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */ +function* strictUniq(array) { + const seen = new Set(); + for (const element of array) { + const key = JSON.stringify(element); + if (!seen.has(key)) { + seen.add(key); + yield element; + } + } +} + +/** + * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes + */ +const TRAIT = '__liquidClass__'; +class LiquidError extends Error { + constructor(err, token) { + /** + * note: for ES5 targeting, `this` will be replaced by return value of Error(), + * thus everything on `this` will be lost, avoid calling `LiquidError` methods here + */ + super(typeof err === 'string' ? err : err.message); + this.context = ''; + if (typeof err !== 'string') + Object.defineProperty(this, 'originalError', { value: err, enumerable: false }); + Object.defineProperty(this, 'token', { value: token, enumerable: false }); + Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false }); + } + update() { + Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false }); + this.message = mkMessage(this.message, this.token); + this.stack = this.message + '\n' + this.context + + '\n' + this.stack; + if (this.originalError) + this.stack += '\nFrom ' + this.originalError.stack; + } + static is(obj) { + return (obj === null || obj === void 0 ? void 0 : obj[TRAIT]) === 'LiquidError'; + } +} +class TokenizationError extends LiquidError { + constructor(message, token) { + super(message, token); + this.name = 'TokenizationError'; + super.update(); + } +} +class ParseError extends LiquidError { + constructor(err, token) { + super(err, token); + this.name = 'ParseError'; + this.message = err.message; + super.update(); + } +} +class RenderError extends LiquidError { + constructor(err, tpl) { + super(err, tpl.token); + this.name = 'RenderError'; + this.message = err.message; + super.update(); + } + static is(obj) { + return obj.name === 'RenderError'; + } +} +class LiquidErrors extends LiquidError { + constructor(errors) { + super(errors[0], errors[0].token); + this.errors = errors; + this.name = 'LiquidErrors'; + const s = errors.length > 1 ? 's' : ''; + this.message = `${errors.length} error${s} found`; + super.update(); + } + static is(obj) { + return obj.name === 'LiquidErrors'; + } +} +class UndefinedVariableError extends LiquidError { + constructor(err, token) { + super(err, token); + this.name = 'UndefinedVariableError'; + this.message = err.message; + super.update(); + } +} +// only used internally; raised where we don't have token information, +// so it can't be an UndefinedVariableError. +class InternalUndefinedVariableError extends Error { + constructor(variableName) { + super(`undefined variable: ${variableName}`); + this.name = 'InternalUndefinedVariableError'; + this.variableName = variableName; + } +} +class AssertionError extends Error { + constructor(message) { + super(message); + this.name = 'AssertionError'; + this.message = message + ''; + } +} +function mkContext(token) { + const [line, col] = token.getPosition(); + const lines = token.input.split('\n'); + const begin = Math.max(line - 2, 1); + const end = Math.min(line + 3, lines.length); + const context = range(begin, end + 1) + .map(lineNumber => { + const rowIndicator = (lineNumber === line) ? '>> ' : ' '; + const num = padStart(String(lineNumber), String(end).length); + let text = `${rowIndicator}${num}| `; + const colIndicator = lineNumber === line + ? '\n' + padStart('^', col + text.length) + : ''; + text += lines[lineNumber - 1]; + text += colIndicator; + return text; + }) + .join('\n'); + return context; +} +function mkMessage(msg, token) { + if (token.file) + msg += `, file:${token.file}`; + const [line, col] = token.getPosition(); + msg += `, line:${line}, col:${col}`; + return msg; +} + +// **DO NOT CHANGE THIS FILE** +// +// This file is generated by bin/character-gen.js +// bitmask character types to boost performance +const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; +const WORD = 1; +const BLANK = 4; +const QUOTE = 8; +const INLINE_BLANK = 16; +const NUMBER = 32; +const SIGN = 64; +const PUNCTUATION = 128; +function isWord(char) { + const code = char.charCodeAt(0); + return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD); +} +TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK; +TYPES[8220] = TYPES[8221] = PUNCTUATION; + +function assert(predicate, message) { + if (!predicate) { + const msg = typeof message === 'function' + ? message() + : (message || `expect ${predicate} to be true`); + throw new AssertionError(msg); + } +} +function assertEmpty(predicate, message = `unexpected ${JSON.stringify(predicate)}`) { + assert(!predicate, message); +} + +class NullDrop extends Drop { + equals(value) { + return isNil(toValue(value)); + } + gt() { + return false; + } + geq() { + return false; + } + lt() { + return false; + } + leq() { + return false; + } + valueOf() { + return null; + } +} + +class EmptyDrop extends Drop { + equals(value) { + if (value instanceof EmptyDrop) + return false; + value = toValue(value); + if (isString(value) || isArray(value)) + return value.length === 0; + if (isObject(value)) + return Object.keys(value).length === 0; + return false; + } + gt() { + return false; + } + geq() { + return false; + } + lt() { + return false; + } + leq() { + return false; + } + valueOf() { + return ''; + } + static is(value) { + return value instanceof EmptyDrop; + } +} + +class BlankDrop extends EmptyDrop { + equals(value) { + if (value === false) + return true; + if (isNil(toValue(value))) + return true; + if (isString(value)) + return /^\s*$/.test(value); + return super.equals(value); + } + static is(value) { + return value instanceof BlankDrop; + } +} + +class ForloopDrop extends Drop { + constructor(length, collection, variable) { + super(); + this.i = 0; + this.length = length; + this.name = `${variable}-${collection}`; + } + next() { + this.i++; + } + index0() { + return this.i; + } + index() { + return this.i + 1; + } + first() { + return this.i === 0; + } + last() { + return this.i === this.length - 1; + } + rindex() { + return this.length - this.i; + } + rindex0() { + return this.length - this.i - 1; + } + valueOf() { + return JSON.stringify(this); + } +} + +class SimpleEmitter { + constructor() { + this.buffer = ''; + } + write(html) { + this.buffer += stringify(html); + } +} + +class StreamedEmitter { + constructor() { + this.buffer = ''; + this.stream = new PassThrough(); + } + write(html) { + this.stream.write(stringify(html)); + } + error(err) { + this.stream.emit('error', err); + } + end() { + this.stream.end(); + } +} + +class KeepingTypeEmitter { + constructor() { + this.buffer = ''; + } + write(html) { + html = toValue(html); + // This will only preserve the type if the value is isolated. + // I.E: + // {{ my-port }} -> 42 + // {{ my-host }}:{{ my-port }} -> 'host:42' + if (typeof html !== 'string' && this.buffer === '') { + this.buffer = html; + } + else { + this.buffer = stringify(this.buffer) + stringify(html); + } + } +} + +class BlockDrop extends Drop { + constructor( + // the block render from layout template + superBlockRender = () => '') { + super(); + this.superBlockRender = superBlockRender; + } + /** + * Provide parent access in child block by + * {{ block.super }} + */ + *super() { + const emitter = new SimpleEmitter(); + yield this.superBlockRender(emitter); + return emitter.buffer; + } +} + +function isComparable(arg) { + return (arg && + isFunction(arg.equals) && + isFunction(arg.gt) && + isFunction(arg.geq) && + isFunction(arg.lt) && + isFunction(arg.leq)); +} + +const nil = new NullDrop(); +const literalValues = { + 'true': true, + 'false': false, + 'nil': nil, + 'null': nil, + 'empty': new EmptyDrop(), + 'blank': new BlankDrop() +}; + +function createTrie(input) { + const trie = {}; + for (const [name, data] of Object.entries(input)) { + let node = trie; + for (let i = 0; i < name.length; i++) { + const c = name[i]; + node[c] = node[c] || {}; + if (i === name.length - 1 && isWord(name[i])) { + node[c].needBoundary = true; + } + node = node[c]; + } + node.data = data; + node.end = true; + } + return trie; +} + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +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. +***************************************************************************** */ + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function toLiquidAsync(asyncFn, syncFn) { + const syncImpl = syncFn || asyncFn; + return (sync, ...args) => { + return sync ? syncImpl(...args) : asyncFn(...args); + }; +} +// convert an async iterator to a Promise +function toPromise(val) { + return __awaiter(this, void 0, void 0, function* () { + if (!isIterator(val)) + return val; + let value; + let done = false; + let next = 'next'; + do { + const state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + try { + if (isIterator(value)) + value = toPromise(value); + if (isPromise(value)) + value = yield value; + } + catch (err) { + next = 'throw'; + value = err; + } + } while (!done); + return value; + }); +} +// convert an async iterator to a value in a synchronous manner +function toValueSync(val) { + if (!isIterator(val)) + return val; + let value; + let done = false; + let next = 'next'; + do { + const state = val[next](value); + done = state.done; + value = state.value; + next = 'next'; + if (isIterator(value)) { + try { + value = toValueSync(value); + } + catch (err) { + next = 'throw'; + value = err; + } + } + } while (!done); + return value; +} + +const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/; +// prototype extensions +function daysInMonth(d) { + const feb = isLeapYear(d) ? 29 : 28; + return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +} +function getDayOfYear(d) { + let num = 0; + for (let i = 0; i < d.getMonth(); ++i) { + num += daysInMonth(d)[i]; + } + return num + d.getDate(); +} +function getWeekOfYear(d, startDay) { + // Skip to startDay of this week + const now = getDayOfYear(d) + (startDay - d.getDay()); + // Find the first startDay of the year + const jan1 = new Date(d.getFullYear(), 0, 1); + const then = (7 - jan1.getDay() + startDay); + return String(Math.floor((now - then) / 7) + 1); +} +function isLeapYear(d) { + const year = d.getFullYear(); + return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year))); +} +function ordinal(d) { + const date = d.getDate(); + if ([11, 12, 13].includes(date)) + return 'th'; + switch (date % 10) { + case 1: return 'st'; + case 2: return 'nd'; + case 3: return 'rd'; + default: return 'th'; + } +} +function century(d) { + return parseInt(d.getFullYear().toString().substring(0, 2), 10); +} +// default to 0 +const padWidths = { + d: 2, + e: 2, + H: 2, + I: 2, + j: 3, + k: 2, + l: 2, + L: 3, + m: 2, + M: 2, + S: 2, + U: 2, + W: 2 +}; +const padSpaceChars = new Set('aAbBceklpP'); +function getTimezoneOffset(d, opts) { + const nOffset = Math.abs(d.getTimezoneOffset()); + const h = Math.floor(nOffset / 60); + const m = nOffset % 60; + return (d.getTimezoneOffset() > 0 ? '-' : '+') + + padStart(h, 2, '0') + + (opts.flags[':'] ? ':' : '') + + padStart(m, 2, '0'); +} +const formatCodes = { + a: (d) => d.getShortWeekdayName(), + A: (d) => d.getLongWeekdayName(), + b: (d) => d.getShortMonthName(), + B: (d) => d.getLongMonthName(), + c: (d) => d.toLocaleString(), + C: (d) => century(d), + d: (d) => d.getDate(), + e: (d) => d.getDate(), + H: (d) => d.getHours(), + I: (d) => String(d.getHours() % 12 || 12), + j: (d) => getDayOfYear(d), + k: (d) => d.getHours(), + l: (d) => String(d.getHours() % 12 || 12), + L: (d) => d.getMilliseconds(), + m: (d) => d.getMonth() + 1, + M: (d) => d.getMinutes(), + N: (d, opts) => { + var _a; + const width = Number(opts.width) || 9; + const str = String(d.getMilliseconds()).slice(0, width); + (_a = opts.memoryLimit) === null || _a === void 0 ? void 0 : _a.use(width - str.length); + return padEnd(str, width, '0'); + }, + p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'), + P: (d) => (d.getHours() < 12 ? 'am' : 'pm'), + q: (d) => ordinal(d), + s: (d) => Math.round(d.getTime() / 1000), + S: (d) => d.getSeconds(), + u: (d) => d.getDay() || 7, + U: (d) => getWeekOfYear(d, 0), + w: (d) => d.getDay(), + W: (d) => getWeekOfYear(d, 1), + x: (d) => d.toLocaleDateString(), + X: (d) => d.toLocaleTimeString(), + y: (d) => d.getFullYear().toString().slice(2, 4), + Y: (d) => d.getFullYear(), + z: getTimezoneOffset, + Z: (d, opts) => d.getTimeZoneName() || getTimezoneOffset(d, opts), + 't': () => '\t', + 'n': () => '\n', + '%': () => '%' +}; +formatCodes.h = formatCodes.b; +function strftime(d, formatStr, memoryLimit) { + let output = ''; + let remaining = formatStr; + let match; + while ((match = rFormat.exec(remaining))) { + output += remaining.slice(0, match.index); + remaining = remaining.slice(match.index + match[0].length); + output += format(d, match, memoryLimit); + } + return output + remaining; +} +function format(d, match, memoryLimit) { + const [input, flagStr = '', width, modifier, conversion] = match; + const convert = formatCodes[conversion]; + if (!convert) + return input; + const flags = {}; + for (const flag of flagStr) + flags[flag] = true; + let ret = String(convert(d, { flags, width, modifier, memoryLimit })); + let padChar = padSpaceChars.has(conversion) ? ' ' : '0'; + let padWidth = width || padWidths[conversion] || 0; + if (flags['^']) + ret = ret.toUpperCase(); + else if (flags['#']) + ret = changeCase(ret); + if (flags['_']) + padChar = ' '; + else if (flags['0']) + padChar = '0'; + if (flags['-']) + padWidth = 0; + memoryLimit === null || memoryLimit === void 0 ? void 0 : memoryLimit.use(Number(padWidth) - ret.length); + return padStart(ret, padWidth, padChar); +} + +function getDateTimeFormat() { + return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined); +} + +// one minute in milliseconds +const OneMinute = 60000; +/** + * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS + * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3 + */ +const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/; +const monthNames = [ + 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', + 'September', 'October', 'November', 'December' +]; +const monthNamesShort = monthNames.map(name => name.slice(0, 3)); +const dayNames = [ + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' +]; +const dayNamesShort = dayNames.map(name => name.slice(0, 3)); +/** + * A date implementation with timezone info, just like Ruby date + * + * Implementation: + * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods + * - rewrite getTimezoneOffset() to trick strftime + */ +class LiquidDate { + constructor(init, locale, timezone) { + this.locale = locale; + this.DateTimeFormat = getDateTimeFormat(); + this.date = new Date(init); + this.timezoneFixed = timezone !== undefined; + if (timezone === undefined) { + timezone = this.date.getTimezoneOffset(); + } + this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone; + this.timezoneName = isString(timezone) ? timezone : ''; + const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute; + const time = this.date.getTime() + diff; + this.displayDate = new Date(time); + } + getTime() { + return this.displayDate.getTime(); + } + getMilliseconds() { + return this.displayDate.getMilliseconds(); + } + getSeconds() { + return this.displayDate.getSeconds(); + } + getMinutes() { + return this.displayDate.getMinutes(); + } + getHours() { + return this.displayDate.getHours(); + } + getDay() { + return this.displayDate.getDay(); + } + getDate() { + return this.displayDate.getDate(); + } + getMonth() { + return this.displayDate.getMonth(); + } + getFullYear() { + return this.displayDate.getFullYear(); + } + toLocaleString(locale, init) { + if (init === null || init === void 0 ? void 0 : init.timeZone) { + return this.date.toLocaleString(locale, init); + } + return this.displayDate.toLocaleString(locale, init); + } + toLocaleTimeString(locale) { + return this.displayDate.toLocaleTimeString(locale); + } + toLocaleDateString(locale) { + return this.displayDate.toLocaleDateString(locale); + } + getTimezoneOffset() { + return this.timezoneOffset; + } + getTimeZoneName() { + if (this.timezoneFixed) + return this.timezoneName; + if (!this.DateTimeFormat) + return; + return this.DateTimeFormat().resolvedOptions().timeZone; + } + getLongMonthName() { + var _a; + return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()]; + } + getShortMonthName() { + var _a; + return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()]; + } + getLongWeekdayName() { + var _a; + return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()]; + } + getShortWeekdayName() { + var _a; + return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()]; + } + valid() { + return !isNaN(this.getTime()); + } + format(options) { + return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate); + } + /** + * Create a Date object fixed to it's declared Timezone. Both + * - 2021-08-06T02:29:00.000Z and + * - 2021-08-06T02:29:00.000+08:00 + * will always be displayed as + * - 2021-08-06 02:29:00 + * regardless timezoneOffset in JavaScript realm + * + * The implementation hack: + * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`, + * we create a different Date to trick strftime, it's both simpler and more performant. + * Given that a template is expected to be parsed fewer times than rendered. + */ + static createDateFixedToTimezone(dateString, locale) { + const m = dateString.match(TIMEZONE_PATTERN); + // representing a UTC timestamp + if (m && m[1] === 'Z') { + return new LiquidDate(+new Date(dateString), locale, 0); + } + // has a timezone specified + if (m && m[2] && m[3] && m[4]) { + const [, , sign, hours, minutes] = m; + const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10)); + return new LiquidDate(+new Date(dateString), locale, offset); + } + return new LiquidDate(dateString, locale); + } + static getTimezoneOffset(timezoneName, date) { + const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName }); + const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' }); + const localDate = new Date(localDateString); + const utcDate = new Date(utcDateString); + return (+utcDate - +localDate) / (60 * 1000); + } +} + +class Limiter { + constructor(resource, limit) { + this.base = 0; + this.message = `${resource} limit exceeded`; + this.limit = limit; + } + use(count) { + if (+count > 0) { + assert(this.base + +count <= this.limit, this.message); + this.base += +count; + } + } + check(count) { + if (+count > 0) { + assert(+count <= this.limit, this.message); + } + } +} + +class DelimitedToken extends Token { + constructor(kind, [contentBegin, contentEnd], input, begin, end, trimLeft, trimRight, file) { + super(kind, input, begin, end, file); + this.trimLeft = false; + this.trimRight = false; + const tl = input[contentBegin] === '-'; + const tr = input[contentEnd - 1] === '-'; + let l = tl ? contentBegin + 1 : contentBegin; + let r = tr ? contentEnd - 1 : contentEnd; + while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) + l++; + while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) + r--; + this.contentRange = [l, r]; + this.trimLeft = tl || trimLeft; + this.trimRight = tr || trimRight; + } + get content() { + return this.input.slice(this.contentRange[0], this.contentRange[1]); + } +} + +class TagToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options; + const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]; + super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file); + this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange); + this.name = this.tokenizer.readTagName(); + this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`); + this.tokenizer.skipBlank(); + this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + } +} + +class OutputToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options; + const valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]; + super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file); + } +} + +class HTMLToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.HTML, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.trimLeft = 0; + this.trimRight = 0; + } + getContent() { + return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight); + } +} + +class NumberToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Number, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = Number(this.getText()); + } +} + +class IdentifierToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Word, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = this.getText(); + } +} + +class LiteralToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Literal, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.literal = this.getText(); + this.content = literalValues[this.literal]; + } +} + +const operatorPrecedences = { + '==': 2, + '!=': 2, + '>': 2, + '<': 2, + '>=': 2, + '<=': 2, + 'contains': 2, + 'not': 1, + 'and': 0, + 'or': 0 +}; +const operatorTypes = { + '==': 0 /* OperatorType.Binary */, + '!=': 0 /* OperatorType.Binary */, + '>': 0 /* OperatorType.Binary */, + '<': 0 /* OperatorType.Binary */, + '>=': 0 /* OperatorType.Binary */, + '<=': 0 /* OperatorType.Binary */, + 'contains': 0 /* OperatorType.Binary */, + 'not': 1 /* OperatorType.Unary */, + 'and': 0 /* OperatorType.Binary */, + 'or': 0 /* OperatorType.Binary */ +}; +class OperatorToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Operator, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.operator = this.getText(); + } + getPrecedence() { + const key = this.getText(); + return key in operatorPrecedences ? operatorPrecedences[key] : 1; + } +} + +class PropertyAccessToken extends Token { + constructor(variable, props, input, begin, end, file) { + super(TokenKind.PropertyAccess, input, begin, end, file); + this.variable = variable; + this.props = props; + } +} + +class FilterToken extends Token { + constructor(name, args, input, begin, end, file) { + super(TokenKind.Filter, input, begin, end, file); + this.name = name; + this.args = args; + } +} + +class HashToken extends Token { + constructor(input, begin, end, name, value, file) { + super(TokenKind.Hash, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.name = name; + this.value = value; + this.file = file; + } +} + +const rHex = /[\da-fA-F]/; +const rOct = /[0-7]/; +const escapeChar = { + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + v: '\x0B' +}; +function hexVal(c) { + const code = c.charCodeAt(0); + if (code >= 97) + return code - 87; + if (code >= 65) + return code - 55; + return code - 48; +} +function parseStringLiteral(str) { + let ret = ''; + for (let i = 1; i < str.length - 1; i++) { + if (str[i] !== '\\') { + ret += str[i]; + continue; + } + if (escapeChar[str[i + 1]] !== undefined) { + ret += escapeChar[str[++i]]; + } + else if (str[i + 1] === 'u') { + let val = 0; + let j = i + 2; + while (j <= i + 5 && rHex.test(str[j])) { + val = val * 16 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + else if (!rOct.test(str[i + 1])) { + ret += str[++i]; + } + else { + let j = i + 1; + let val = 0; + while (j <= i + 3 && rOct.test(str[j])) { + val = val * 8 + hexVal(str[j++]); + } + i = j - 1; + ret += String.fromCharCode(val); + } + } + return ret; +} + +class QuotedToken extends Token { + constructor(input, begin, end, file) { + super(TokenKind.Quoted, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + this.content = parseStringLiteral(this.getText()); + } +} + +class RangeToken extends Token { + constructor(input, begin, end, lhs, rhs, file) { + super(TokenKind.Range, input, begin, end, file); + this.input = input; + this.begin = begin; + this.end = end; + this.lhs = lhs; + this.rhs = rhs; + this.file = file; + } +} + +/** + * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}` + */ +class LiquidTagToken extends DelimitedToken { + constructor(input, begin, end, options, file) { + super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file); + this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange); + this.name = this.tokenizer.readTagName(); + this.tokenizer.assert(this.name, 'illegal liquid tag syntax'); + this.tokenizer.skipBlank(); + } + get args() { + return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]); + } +} + +/** + * value expression with optional filters + * e.g. + * {% assign foo="bar" | append: "coo" %} + */ +class FilteredValueToken extends Token { + constructor(initial, filters, input, begin, end, file) { + super(TokenKind.FilteredValue, input, begin, end, file); + this.initial = initial; + this.filters = filters; + this.input = input; + this.begin = begin; + this.end = end; + this.file = file; + } +} + +const polyfill = { + now: () => Date.now() +}; +function getPerformance() { + return (typeof global === 'object' && global.performance) || + (typeof window === 'object' && window.performance) || + polyfill; +} + +class Render { + renderTemplatesToNodeStream(templates, ctx) { + const emitter = new StreamedEmitter(); + Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter))) + .then(() => emitter.end(), err => emitter.error(err)); + return emitter.stream; + } + *renderTemplates(templates, ctx, emitter) { + if (!emitter) { + emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter(); + } + ctx.renderLimit.check(getPerformance().now()); + const errors = []; + for (const tpl of templates) { + ctx.renderLimit.check(getPerformance().now()); + try { + // if tpl.render supports emitter, it'll return empty `html` + const html = yield tpl.render(ctx, emitter); + // if not, it'll return an `html`, write to the emitter for it + html && emitter.write(html); + if (ctx.breakCalled || ctx.continueCalled) + break; + } + catch (e) { + const err = LiquidError.is(e) ? e : new RenderError(e, tpl); + if (ctx.opts.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) { + throw new LiquidErrors(errors); + } + return emitter.buffer; + } +} + +class Expression { + constructor(tokens) { + this.postfix = [...toPostfix(tokens)]; + } + *evaluate(ctx, lenient) { + assert(ctx, 'unable to evaluate: context not defined'); + const operands = []; + for (const token of this.postfix) { + if (isOperatorToken(token)) { + const r = operands.pop(); + let result; + if (operatorTypes[token.operator] === 1 /* OperatorType.Unary */) { + result = yield ctx.opts.operators[token.operator](r, ctx); + } + else { + const l = operands.pop(); + result = yield ctx.opts.operators[token.operator](l, r, ctx); + } + operands.push(result); + } + else { + operands.push(yield evalToken(token, ctx, lenient)); + } + } + return operands[0]; + } + valid() { + return !!this.postfix.length; + } +} +function* evalToken(token, ctx, lenient = false) { + if (!token) + return; + if ('content' in token) + return token.content; + if (isPropertyAccessToken(token)) + return yield evalPropertyAccessToken(token, ctx, lenient); + if (isRangeToken(token)) + return yield evalRangeToken(token, ctx); +} +function* evalPropertyAccessToken(token, ctx, lenient) { + const props = []; + for (const prop of token.props) { + props.push((yield evalToken(prop, ctx, false))); + } + try { + if (token.variable) { + const variable = yield evalToken(token.variable, ctx, lenient); + return yield ctx._getFromScope(variable, props); + } + else { + return yield ctx._get(props); + } + } + catch (e) { + if (lenient && e.name === 'InternalUndefinedVariableError') + return null; + throw (new UndefinedVariableError(e, token)); + } +} +function evalQuotedToken(token) { + return token.content; +} +function* evalRangeToken(token, ctx) { + const low = yield evalToken(token.lhs, ctx); + const high = yield evalToken(token.rhs, ctx); + ctx.memoryLimit.use(high - low + 1); + return range(+low, +high + 1); +} +function* toPostfix(tokens) { + const ops = []; + for (const token of tokens) { + if (isOperatorToken(token)) { + while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) { + yield ops.pop(); + } + ops.push(token); + } + else + yield token; + } + while (ops.length) { + yield ops.pop(); + } +} + +function isTruthy(val, ctx) { + return !isFalsy(val, ctx); +} +function isFalsy(val, ctx) { + val = toValue(val); + if (ctx.opts.jsTruthy) { + return !val; + } + else { + return val === false || undefined === val || val === null; + } +} + +const defaultOperators = { + '==': equals, + '!=': (l, r) => !equals(l, r), + '>': (l, r) => { + if (isComparable(l)) + return l.gt(r); + if (isComparable(r)) + return r.lt(l); + return toValue(l) > toValue(r); + }, + '<': (l, r) => { + if (isComparable(l)) + return l.lt(r); + if (isComparable(r)) + return r.gt(l); + return toValue(l) < toValue(r); + }, + '>=': (l, r) => { + if (isComparable(l)) + return l.geq(r); + if (isComparable(r)) + return r.leq(l); + return toValue(l) >= toValue(r); + }, + '<=': (l, r) => { + if (isComparable(l)) + return l.leq(r); + if (isComparable(r)) + return r.geq(l); + return toValue(l) <= toValue(r); + }, + 'contains': (l, r) => { + l = toValue(l); + if (isArray(l)) + return l.some((i) => equals(i, r)); + if (isFunction(l === null || l === void 0 ? void 0 : l.indexOf)) + return l.indexOf(toValue(r)) > -1; + return false; + }, + 'not': (v, ctx) => isFalsy(toValue(v), ctx), + 'and': (l, r, ctx) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx), + 'or': (l, r, ctx) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx) +}; +function equals(lhs, rhs) { + if (isComparable(lhs)) + return lhs.equals(rhs); + if (isComparable(rhs)) + return rhs.equals(lhs); + lhs = toValue(lhs); + rhs = toValue(rhs); + if (isArray(lhs)) { + return isArray(rhs) && arrayEquals(lhs, rhs); + } + return lhs === rhs; +} +function arrayEquals(lhs, rhs) { + if (lhs.length !== rhs.length) + return false; + return !lhs.some((value, i) => !equals(value, rhs[i])); +} +function arrayIncludes(arr, item) { + return arr.some(value => equals(value, item)); +} + +class Node { + constructor(key, value, next, prev) { + this.key = key; + this.value = value; + this.next = next; + this.prev = prev; + } +} +class LRU { + constructor(limit, size = 0) { + this.limit = limit; + this.size = size; + this.cache = {}; + this.head = new Node('HEAD', null, null, null); + this.tail = new Node('TAIL', null, null, null); + this.head.next = this.tail; + this.tail.prev = this.head; + } + write(key, value) { + if (this.cache[key]) { + this.cache[key].value = value; + } + else { + const node = new Node(key, value, this.head.next, this.head); + this.head.next.prev = node; + this.head.next = node; + this.cache[key] = node; + this.size++; + this.ensureLimit(); + } + } + read(key) { + if (!this.cache[key]) + return; + const { value } = this.cache[key]; + this.remove(key); + this.write(key, value); + return value; + } + remove(key) { + const node = this.cache[key]; + node.prev.next = node.next; + node.next.prev = node.prev; + delete this.cache[key]; + this.size--; + } + clear() { + this.head.next = this.tail; + this.tail.prev = this.head; + this.size = 0; + this.cache = {}; + } + ensureLimit() { + if (this.size > this.limit) + this.remove(this.tail.prev.key); + } +} + +function requireResolve (file) { + const require = createRequire(process.cwd() + '/'); + return require.resolve(file) +} + +const statAsync = promisify(stat); +const readFileAsync = promisify(readFile$1); +function exists(filepath) { + return __awaiter(this, void 0, void 0, function* () { + try { + yield statAsync(filepath); + return true; + } + catch (err) { + return false; + } + }); +} +function readFile(filepath) { + return readFileAsync(filepath, 'utf8'); +} +function existsSync(filepath) { + try { + statSync(filepath); + return true; + } + catch (err) { + return false; + } +} +function readFileSync(filepath) { + return readFileSync$1(filepath, 'utf8'); +} +function resolve(root, file, ext) { + if (!extname(file)) + file += ext; + return resolve$1(root, file); +} +function fallback(file) { + try { + return requireResolve(file); + } + catch (e) { } +} +function dirname(filepath) { + return dirname$1(filepath); +} +const realpathAsync = promisify(realpath); +function contains(root, file) { + return __awaiter(this, void 0, void 0, function* () { + try { + const realRoot = yield realpathAsync(root); + const realFile = yield realpathAsync(file); + const prefix = realRoot.endsWith(sep) ? realRoot : realRoot + sep; + return realFile.startsWith(prefix); + } + catch (_a) { + return false; + } + }); +} +function containsSync(root, file) { + try { + const realRoot = realpathSync(root); + const realFile = realpathSync(file); + const prefix = realRoot.endsWith(sep) ? realRoot : realRoot + sep; + return realFile.startsWith(prefix); + } + catch (_a) { + return false; + } +} + +var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + exists: exists, + readFile: readFile, + existsSync: existsSync, + readFileSync: readFileSync, + resolve: resolve, + fallback: fallback, + dirname: dirname, + contains: contains, + containsSync: containsSync, + sep: sep +}); + +function defaultFilter(value, defaultValue, ...args) { + value = toValue(value); + if (isArray(value) || isString(value)) + return value.length ? value : defaultValue; + if (value === false && (new Map(args)).get('allow_false')) + return false; + return isFalsy(value, this.context) ? defaultValue : value; +} +function json(value, space = 0) { + return JSON.stringify(value, null, space); +} +function inspect(value, space = 0) { + const ancestors = []; + return JSON.stringify(value, function (_key, value) { + if (typeof value !== 'object' || value === null) + return value; + // `this` is the object that value is contained in, i.e., its direct parent. + while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) + ancestors.pop(); + if (ancestors.includes(value)) + return '[Circular]'; + ancestors.push(value); + return value; + }, space); +} +function to_integer(value) { + return Number(value); +} +const raw = { + raw: true, + handler: identify +}; +var misc = { + default: defaultFilter, + raw, + jsonify: json, + to_integer, + json, + inspect +}; + +const escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +const unescapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" +}; +function escape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&|<|>|"|'/g, m => escapeMap[m]); +} +function xml_escape(str) { + return escape.call(this, str); +} +function unescape(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]); +} +function escape_once(str) { + return escape.call(this, unescape.call(this, str)); +} +function newline_to_br(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, '
    \n'); +} +// Raw-text blocks (HTML5) plus '<...>' as the catch-all kind; a regex +// equivalent is O(n^2) in V8 on unclosed openers. +function strip_html(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + const blocks = new Map([[''], [''], [''], ['<', '>']]); + let out = ''; + let i = 0; + while (i < str.length) { + const lt = str.indexOf('<', i); + if (lt < 0) + return out + str.slice(i); + out += str.slice(i, lt); + for (const [opener, closer] of blocks) { + if (!str.startsWith(opener, lt)) + continue; + const e = str.indexOf(closer, lt + opener.length); + if (e >= 0) { + i = e + closer.length; + break; + } + blocks.delete(opener); + } + if (i === lt) + return out + str.slice(lt); + } + return out; +} + +var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html +}); + +class MapFS { + constructor(mapping) { + this.mapping = mapping; + this.sep = '/'; + } + exists(filepath) { + return __awaiter(this, void 0, void 0, function* () { + return this.existsSync(filepath); + }); + } + existsSync(filepath) { + return !isNil(this.mapping[filepath]); + } + readFile(filepath) { + return __awaiter(this, void 0, void 0, function* () { + return this.readFileSync(filepath); + }); + } + readFileSync(filepath) { + const content = this.mapping[filepath]; + if (isNil(content)) + throw new Error(`ENOENT: ${filepath}`); + return content; + } + dirname(filepath) { + const segments = filepath.split(this.sep); + segments.pop(); + return segments.join(this.sep); + } + resolve(dir, file, ext) { + file += ext; + if (dir === '.') + return file; + const segments = dir.split(/\/+/); + for (const segment of file.split(this.sep)) { + if (segment === '.' || segment === '') + continue; + else if (segment === '..') { + if (segments.length > 1 || segments[0] !== '') + segments.pop(); + } + else + segments.push(segment); + } + return segments.join(this.sep); + } +} + +const defaultOptions = { + root: ['.'], + layouts: ['.'], + partials: ['.'], + relativeReference: true, + jekyllInclude: false, + keyValueSeparator: ':', + cache: undefined, + extname: '', + fs: fs, + dynamicPartials: true, + jsTruthy: false, + dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z', + locale: '', + trimTagRight: false, + trimTagLeft: false, + trimOutputRight: false, + trimOutputLeft: false, + greedy: true, + tagDelimiterLeft: '{%', + tagDelimiterRight: '%}', + outputDelimiterLeft: '{{', + outputDelimiterRight: '}}', + preserveTimezones: false, + strictFilters: false, + strictVariables: false, + ownPropertyOnly: true, + lenientIf: false, + globals: {}, + keepOutputType: false, + operators: defaultOperators, + memoryLimit: Infinity, + parseLimit: Infinity, + renderLimit: Infinity +}; +function normalize(options) { + var _a, _b; + if (options.hasOwnProperty('root')) { + if (!options.hasOwnProperty('partials')) + options.partials = options.root; + if (!options.hasOwnProperty('layouts')) + options.layouts = options.root; + } + if (options.hasOwnProperty('cache')) { + let cache; + if (typeof options.cache === 'number') + cache = options.cache > 0 ? new LRU(options.cache) : undefined; + else if (typeof options.cache === 'object') + cache = options.cache; + else + cache = options.cache ? new LRU(1024) : undefined; + options.cache = cache; + } + options = Object.assign(Object.assign(Object.assign({}, defaultOptions), (options.jekyllInclude ? { dynamicPartials: false } : {})), options); + if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) { + console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning'); + options.relativeReference = false; + } + options.root = normalizeDirectoryList(options.root); + options.partials = normalizeDirectoryList(options.partials); + options.layouts = normalizeDirectoryList(options.layouts); + options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape); + if (!options.locale) { + options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US'; + } + if (options.templates) { + options.fs = new MapFS(options.templates); + options.relativeReference = true; + options.root = options.partials = options.layouts = '.'; + } + return options; +} +function getOutputEscapeFunction(nameOrFunction) { + if (nameOrFunction === 'escape') + return escape; + if (nameOrFunction === 'json') + return misc.json; + assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function'); + return nameOrFunction; +} +function normalizeDirectoryList(value) { + let list = []; + if (isArray(value)) + list = value; + if (isString(value)) + list = [value]; + return list; +} + +function whiteSpaceCtrl(tokens, options) { + let inRaw = false; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (!isDelimitedToken(token)) + continue; + if (!inRaw && token.trimLeft) { + trimLeft(tokens[i - 1], options.greedy); + } + if (isTagToken(token)) { + if (token.name === 'raw') + inRaw = true; + else if (token.name === 'endraw') + inRaw = false; + } + if (!inRaw && token.trimRight) { + trimRight(tokens[i + 1], options.greedy); + } + } +} +function trimLeft(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + const mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) + token.trimRight++; +} +function trimRight(token, greedy) { + if (!token || !isHTMLToken(token)) + return; + const mask = greedy ? BLANK : INLINE_BLANK; + while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) + token.trimLeft++; + if (token.input.charAt(token.begin + token.trimLeft) === '\n') + token.trimLeft++; +} + +class Tokenizer { + constructor(input, operators = defaultOptions.operators, file, range) { + this.input = input; + this.file = file; + this.rawBeginAt = -1; + this.p = range ? range[0] : 0; + this.N = range ? range[1] : input.length; + this.opTrie = createTrie(operators); + this.literalTrie = createTrie(literalValues); + } + readExpression() { + return new Expression(this.readExpressionTokens()); + } + *readExpressionTokens() { + while (this.p < this.N) { + const operator = this.readOperator(); + if (operator) { + yield operator; + continue; + } + const operand = this.readValue(); + if (operand) { + yield operand; + continue; + } + return; + } + } + readOperator() { + this.skipBlank(); + const end = this.matchTrie(this.opTrie); + if (end === -1) + return; + return new OperatorToken(this.input, this.p, (this.p = end), this.file); + } + matchTrie(trie) { + let node = trie; + let i = this.p; + let info; + while (node[this.input[i]] && i < this.N) { + node = node[this.input[i++]]; + if (node['end']) + info = node; + } + if (!info) + return -1; + if (info['needBoundary'] && isWord(this.peek(i - this.p))) + return -1; + return i; + } + readFilteredValue() { + const begin = this.p; + const initial = this.readExpression(); + this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`); + const filters = this.readFilters(); + return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file); + } + readFilters() { + const filters = []; + while (true) { + const filter = this.readFilter(); + if (!filter) + return filters; + filters.push(filter); + } + } + readFilter() { + this.skipBlank(); + if (this.end()) + return null; + this.assert(this.read() === '|', `expected "|" before filter`); + const name = this.readIdentifier(); + if (!name.size()) { + this.assert(this.end(), `expected filter name`); + return null; + } + const args = []; + this.skipBlank(); + if (this.peek() === ':') { + do { + ++this.p; + const arg = this.readFilterArg(); + arg && args.push(arg); + this.skipBlank(); + this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`); + } while (this.peek() === ','); + } + else if (this.peek() === '|' || this.end()) ; + else { + throw this.error('expected ":" after filter name'); + } + return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file); + } + readFilterArg() { + const key = this.readValue(); + if (!key) + return; + this.skipBlank(); + if (this.peek() !== ':') + return key; + ++this.p; + const value = this.readValue(); + return [key.getText(), value]; + } + readTopLevelTokens(options = defaultOptions) { + const tokens = []; + while (this.p < this.N) { + const token = this.readTopLevelToken(options); + tokens.push(token); + } + whiteSpaceCtrl(tokens, options); + return tokens; + } + readTopLevelToken(options) { + const { tagDelimiterLeft, outputDelimiterLeft } = options; + if (this.rawBeginAt > -1) + return this.readEndrawOrRawContent(options); + if (this.match(tagDelimiterLeft)) + return this.readTagToken(options); + if (this.match(outputDelimiterLeft)) + return this.readOutputToken(options); + return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]); + } + readHTMLToken(stopStrings) { + const begin = this.p; + while (this.p < this.N) { + if (stopStrings.some(str => this.match(str))) + break; + ++this.p; + } + return new HTMLToken(this.input, begin, this.p, this.file); + } + readTagToken(options) { + const { file, input } = this; + const begin = this.p; + if (this.readToDelimiter(options.tagDelimiterRight) === -1) { + throw this.error(`tag ${this.snapshot(begin)} not closed`, begin); + } + const token = new TagToken(input, begin, this.p, options, file); + if (token.name === 'raw') + this.rawBeginAt = begin; + return token; + } + readToDelimiter(delimiter, respectQuoted = false) { + this.skipBlank(); + while (this.p < this.N) { + if (respectQuoted && (this.peekType() & QUOTE)) { + this.readQuoted(); + continue; + } + ++this.p; + if (this.rmatch(delimiter)) + return this.p; + } + return -1; + } + readOutputToken(options = defaultOptions) { + const { file, input } = this; + const { outputDelimiterRight } = options; + const begin = this.p; + if (this.readToDelimiter(outputDelimiterRight, true) === -1) { + throw this.error(`output ${this.snapshot(begin)} not closed`, begin); + } + return new OutputToken(input, begin, this.p, options, file); + } + readEndrawOrRawContent(options) { + const { tagDelimiterLeft, tagDelimiterRight } = options; + const begin = this.p; + let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + while (this.p < this.N) { + if (this.readIdentifier().getText() !== 'endraw') { + leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length; + continue; + } + while (this.p <= this.N) { + if (this.rmatch(tagDelimiterRight)) { + const end = this.p; + if (begin === leftPos) { + this.rawBeginAt = -1; + return new TagToken(this.input, begin, end, options, this.file); + } + else { + this.p = leftPos; + return new HTMLToken(this.input, begin, leftPos, this.file); + } + } + if (this.rmatch(tagDelimiterLeft)) + break; + this.p++; + } + } + throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin); + } + readLiquidTagTokens(options = defaultOptions) { + const tokens = []; + while (this.p < this.N) { + const token = this.readLiquidTagToken(options); + token && tokens.push(token); + } + return tokens; + } + readLiquidTagToken(options) { + this.skipBlank(); + if (this.end()) + return; + const begin = this.p; + this.readToDelimiter('\n'); + const end = this.p; + return new LiquidTagToken(this.input, begin, end, options, this.file); + } + error(msg, pos = this.p) { + return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file)); + } + assert(pred, msg, pos) { + if (!pred) + throw this.error(typeof msg === 'function' ? msg() : msg, pos); + } + snapshot(begin = this.p) { + return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32)); + } + /** + * @deprecated use #readIdentifier instead + */ + readWord() { + return this.readIdentifier(); + } + readIdentifier() { + this.skipBlank(); + const begin = this.p; + while (!this.end() && isWord(this.peek())) + ++this.p; + return new IdentifierToken(this.input, begin, this.p, this.file); + } + readNonEmptyIdentifier() { + const id = this.readIdentifier(); + return id.size() ? id : undefined; + } + readTagName() { + this.skipBlank(); + // Handle inline comment tags + if (this.input[this.p] === '#') + return this.input.slice(this.p, ++this.p); + return this.readIdentifier().getText(); + } + readHashes(jekyllStyle) { + const hashes = []; + while (true) { + const hash = this.readHash(jekyllStyle); + if (!hash) + return hashes; + hashes.push(hash); + } + } + readHash(jekyllStyle) { + this.skipBlank(); + if (this.peek() === ',') + ++this.p; + const begin = this.p; + const name = this.readNonEmptyIdentifier(); + if (!name) + return; + let value; + this.skipBlank(); + const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':'); + if (this.peek() === sep) { + ++this.p; + value = this.readValue(); + } + return new HashToken(this.input, begin, this.p, name, value, this.file); + } + remaining() { + return this.input.slice(this.p, this.N); + } + advance(step = 1) { + this.p += step; + } + end() { + return this.p >= this.N; + } + read() { + return this.input[this.p++]; + } + readTo(end) { + while (this.p < this.N) { + ++this.p; + if (this.rmatch(end)) + return this.p; + } + return -1; + } + readValue() { + this.skipBlank(); + const begin = this.p; + const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber(); + const props = this.readProperties(!variable); + if (!props.length) + return variable; + return new PropertyAccessToken(variable, props, this.input, begin, this.p); + } + readScopeValue() { + this.skipBlank(); + const begin = this.p; + const props = this.readProperties(); + if (!props.length) + return undefined; + return new PropertyAccessToken(undefined, props, this.input, begin, this.p); + } + readProperties(isBegin = true) { + const props = []; + while (true) { + if (this.peek() === '[') { + this.p++; + const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file); + this.assert(this.readTo(']') !== -1, '[ not closed'); + props.push(prop); + continue; + } + if (isBegin && !props.length) { + const prop = this.readNonEmptyIdentifier(); + if (prop) { + props.push(prop); + continue; + } + } + if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax + this.p++; + const prop = this.readNonEmptyIdentifier(); + if (!prop) + break; + props.push(prop); + continue; + } + break; + } + return props; + } + readNumber() { + this.skipBlank(); + let decimalFound = false; + let digitFound = false; + let n = 0; + if (this.peekType() & SIGN) + n++; + while (this.p + n <= this.N) { + if (this.peekType(n) & NUMBER) { + digitFound = true; + n++; + } + else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') { + if (decimalFound || !digitFound) + return; + decimalFound = true; + n++; + } + else + break; + } + if (digitFound && !isWord(this.peek(n))) { + const num = new NumberToken(this.input, this.p, this.p + n, this.file); + this.advance(n); + return num; + } + } + readLiteral() { + this.skipBlank(); + const end = this.matchTrie(this.literalTrie); + if (end === -1) + return; + const literal = new LiteralToken(this.input, this.p, end, this.file); + this.p = end; + return literal; + } + readRange() { + this.skipBlank(); + const begin = this.p; + if (this.peek() !== '(') + return; + ++this.p; + const lhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax'); + const rhs = this.readValueOrThrow(); + this.skipBlank(); + this.assert(this.read() === ')', 'invalid range syntax'); + return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file); + } + readValueOrThrow() { + const value = this.readValue(); + this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`); + return value; + } + readQuoted() { + this.skipBlank(); + const begin = this.p; + if (!(this.peekType() & QUOTE)) + return; + ++this.p; + let escaped = false; + while (this.p < this.N) { + ++this.p; + if (this.input[this.p - 1] === this.input[begin] && !escaped) + break; + if (escaped) + escaped = false; + else if (this.input[this.p - 1] === '\\') + escaped = true; + } + return new QuotedToken(this.input, begin, this.p, this.file); + } + *readFileNameTemplate(options) { + const { outputDelimiterLeft } = options; + const htmlStopStrings = [',', ' ', '\r', '\n', '\t', outputDelimiterLeft]; + const htmlStopStringSet = new Set(htmlStopStrings); + // break on ',' and ' ', outputDelimiterLeft only stops HTML token + while (this.p < this.N && !htmlStopStringSet.has(this.peek())) { + yield this.match(outputDelimiterLeft) + ? this.readOutputToken(options) + : this.readHTMLToken(htmlStopStrings); + } + } + match(word) { + for (let i = 0; i < word.length; i++) { + if (word[i] !== this.input[this.p + i]) + return false; + } + return true; + } + rmatch(pattern) { + for (let i = 0; i < pattern.length; i++) { + if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) + return false; + } + return true; + } + peekType(n = 0) { + return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]; + } + peek(n = 0) { + return this.p + n >= this.N ? '' : this.input[this.p + n]; + } + skipBlank() { + while (this.peekType() & BLANK) + ++this.p; + } +} + +class ParseStream { + constructor(tokens, parseToken) { + this.handlers = {}; + this.stopRequested = false; + this.tokens = tokens; + this.parseToken = parseToken; + } + on(name, cb) { + this.handlers[name] = cb; + return this; + } + trigger(event, arg) { + const h = this.handlers[event]; + return h ? (h.call(this, arg), true) : false; + } + start() { + this.trigger('start'); + let token; + while (!this.stopRequested && (token = this.tokens.shift())) { + if (this.trigger('token', token)) + continue; + if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) { + continue; + } + const template = this.parseToken(token, this.tokens); + this.trigger('template', template); + } + if (!this.stopRequested) + this.trigger('end'); + return this; + } + stop() { + this.stopRequested = true; + return this; + } +} + +class TemplateImpl { + constructor(token) { + this.token = token; + } +} + +class Tag extends TemplateImpl { + constructor(token, remainTokens, liquid) { + super(token); + this.name = token.name; + this.liquid = liquid; + this.tokenizer = token.tokenizer; + } +} + +/** + * Key-Value Pairs Representing Tag Arguments + * Example: + * For the markup `, foo:'bar', coo:2 reversed %}`, + * hash['foo'] === 'bar' + * hash['coo'] === 2 + * hash['reversed'] === undefined + */ +class Hash { + constructor(input, jekyllStyle) { + this.hash = {}; + const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {}); + for (const hash of tokenizer.readHashes(jekyllStyle)) { + this.hash[hash.name.content] = hash.value; + } + } + *render(ctx) { + const hash = {}; + for (const key of Object.keys(this.hash)) { + hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx); + } + return hash; + } +} + +function createTagClass(options) { + return class extends Tag { + constructor(token, tokens, liquid) { + super(token, tokens, liquid); + if (isFunction(options.parse)) { + options.parse.call(this, token, tokens); + } + } + *render(ctx, emitter) { + const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)); + return yield options.render.call(this, ctx, emitter, hash); + } + }; +} + +function isKeyValuePair(arr) { + return isArray(arr); +} + +class Filter { + constructor(token, options, liquid) { + this.token = token; + this.name = token.name; + this.handler = isFunction(options) + ? options + : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify); + this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw); + this.args = token.args; + this.liquid = liquid; + } + *render(value, context) { + const argv = []; + for (const arg of this.args) { + if (isKeyValuePair(arg)) + argv.push([arg[0], yield evalToken(arg[1], context)]); + else + argv.push(yield evalToken(arg, context)); + } + return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv]); + } +} + +class Value { + /** + * @param str the value to be valuated, eg.: "foobar" | truncate: 3 + */ + constructor(input, liquid) { + this.filters = []; + const token = typeof input === 'string' + ? new Tokenizer(input, liquid.options.operators).readFilteredValue() + : input; + this.initial = token.initial; + this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid)); + } + *value(ctx, lenient) { + lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default'); + let val = yield this.initial.evaluate(ctx, lenient); + for (const filter of this.filters) { + val = yield filter.render(val, ctx); + } + return val; + } + getFilter(liquid, name) { + const impl = liquid.filters[name]; + assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`); + return impl; + } +} + +class Output extends TemplateImpl { + constructor(token, liquid) { + var _a; + super(token); + const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange); + this.value = new Value(tokenizer.readFilteredValue(), liquid); + const filters = this.value.filters; + const outputEscape = liquid.options.outputEscape; + if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) { + const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0); + filters.push(new Filter(token, outputEscape, liquid)); + } + } + *render(ctx, emitter) { + const val = yield this.value.value(ctx, false); + emitter.write(val); + } + *arguments() { + yield this.value; + } +} + +class HTML extends TemplateImpl { + constructor(token) { + super(token); + this.str = token.getContent(); + } + *render(ctx, emitter) { + emitter.write(this.str); + } +} + +/** + * A variable's segments and location, which can be coerced to a string. + */ +class Variable { + constructor(segments, location) { + this.segments = segments; + this.location = location; + } + toString() { + return segmentsString(this.segments, true); + } + /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */ + toArray() { + function* _visit(...segments) { + for (const segment of segments) { + if (segment instanceof Variable) { + yield Array.from(_visit(...segment.segments)); + } + else { + yield segment; + } + } + } + return Array.from(_visit(...this.segments)); + } +} +/** + * Group variables by the string representation of their root segment. + */ +class VariableMap { + constructor() { + this.map = new Map(); + } + get(key) { + const k = segmentsString([key.segments[0]]); + if (!this.map.has(k)) { + this.map.set(k, []); + } + return this.map.get(k); + } + has(key) { + return this.map.has(segmentsString([key.segments[0]])); + } + push(variable) { + this.get(variable).push(variable); + } + asObject() { + return Object.fromEntries(this.map); + } +} +const defaultStaticAnalysisOptions = { + partials: true +}; +function* _analyze(templates, partials, sync) { + const variables = new VariableMap(); + const globals = new VariableMap(); + const locals = new VariableMap(); + const rootScope = new DummyScope(new Set()); + // Names of partial templates that we've already analyzed. + const seen = new Set(); + function updateVariables(variable, scope) { + variables.push(variable); + const aliased = scope.alias(variable); + if (aliased !== undefined) { + const root = aliased.segments[0]; + // TODO: What if a a template renders a rendered template? Do we need scope.parent? + if (isString(root) && !rootScope.has(root)) { + globals.push(aliased); + } + } + else { + const root = variable.segments[0]; + if (isString(root) && !scope.has(root)) { + globals.push(variable); + } + } + // Recurse for nested Variables + for (const segment of variable.segments) { + if (segment instanceof Variable) { + updateVariables(segment, scope); + } + } + } + function* visit(template, scope) { + if (template.arguments) { + for (const arg of template.arguments()) { + for (const variable of extractVariables(arg)) { + updateVariables(variable, scope); + } + } + } + if (template.localScope) { + for (const ident of template.localScope()) { + scope.add(ident.content); + scope.deleteAlias(ident.content); + const [row, col] = ident.getPosition(); + locals.push(new Variable([ident.content], { row, col, file: ident.file })); + } + } + if (template.children) { + if (template.partialScope) { + const partial = template.partialScope(); + if (partial === undefined) { + // Layouts, for example, can have children that are not partials. + for (const child of (yield template.children(partials, sync))) { + yield visit(child, scope); + } + return; + } + if (seen.has(partial.name)) + return; + const partialScopeNames = new Set(); + const partialScope = partial.isolated + ? new DummyScope(partialScopeNames) + : scope.push(partialScopeNames); + for (const name of partial.scope) { + if (isString(name)) { + partialScopeNames.add(name); + } + else { + const [alias, argument] = name; + partialScopeNames.add(alias); + const variables = Array.from(extractVariables(argument)); + if (variables.length) { + partialScope.setAlias(alias, variables[0].segments); + } + } + } + for (const child of (yield template.children(partials, sync))) { + yield visit(child, partialScope); + seen.add(partial.name); + } + partialScope.pop(); + } + else { + if (template.blockScope) { + scope.push(new Set(template.blockScope())); + } + for (const child of (yield template.children(partials, sync))) { + yield visit(child, scope); + } + if (template.blockScope) { + scope.pop(); + } + } + } + } + for (const template of templates) { + yield visit(template, rootScope); + } + return { + variables: variables.asObject(), + globals: globals.asObject(), + locals: locals.asObject() + }; +} +/** + * Statically analyze a template and report variable usage. + */ +function analyze(template, options = {}) { + const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options); + return toPromise(_analyze(template, opts.partials, false)); +} +/** + * Statically analyze a template and report variable usage. + */ +function analyzeSync(template, options = {}) { + const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options); + return toValueSync(_analyze(template, opts.partials, true)); +} +/** + * A stack to manage scopes while traversing templates during static analysis. + */ +class DummyScope { + constructor(globals) { + this.stack = [{ names: globals, aliases: new Map() }]; + } + /** Return true if `name` is in scope. */ + has(name) { + for (const scope of this.stack) { + if (scope.names.has(name)) { + return true; + } + } + return false; + } + push(scope) { + this.stack.push({ names: scope, aliases: new Map() }); + return this; + } + pop() { + var _a; + return (_a = this.stack.pop()) === null || _a === void 0 ? void 0 : _a.names; + } + // Add a name to the template scope. + add(name) { + this.stack[0].names.add(name); + } + /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */ + alias(variable) { + const root = variable.segments[0]; + if (!isString(root)) + return undefined; + const alias = this.getAlias(root); + if (alias === undefined) + return undefined; + return new Variable([...alias, ...variable.segments.slice(1)], variable.location); + } + // TODO: `from` could be a path with multiple segments, like `include.x`. + setAlias(from, to) { + this.stack[this.stack.length - 1].aliases.set(from, to); + } + deleteAlias(name) { + this.stack[this.stack.length - 1].aliases.delete(name); + } + getAlias(name) { + for (const scope of this.stack) { + if (scope.aliases.has(name)) { + return scope.aliases.get(name); + } + // If a scope has defined `name`, then it masks aliases in parent scopes. + if (scope.names.has(name)) { + return undefined; + } + } + return undefined; + } +} +function* extractVariables(value) { + if (isValueToken(value)) { + yield* extractValueTokenVariables(value); + } + else if (value instanceof Value) { + yield* extractFilteredValueVariables(value); + } +} +function* extractFilteredValueVariables(value) { + for (const token of value.initial.postfix) { + if (isValueToken(token)) { + yield* extractValueTokenVariables(token); + } + } + for (const filter of value.filters) { + for (const arg of filter.args) { + if (isKeyValuePair(arg) && arg[1]) { + yield* extractValueTokenVariables(arg[1]); + } + else if (isValueToken(arg)) { + yield* extractValueTokenVariables(arg); + } + } + } +} +function* extractValueTokenVariables(token) { + if (isRangeToken(token)) { + yield* extractValueTokenVariables(token.lhs); + yield* extractValueTokenVariables(token.rhs); + } + else if (isPropertyAccessToken(token)) { + yield extractPropertyAccessVariable(token); + } +} +function extractPropertyAccessVariable(token) { + const segments = []; + // token is not guaranteed to have `file` set. We'll try to get it from a prop if not. + let file = token.file; + // Here we're flattening the first segment of a path if it is a nested path. + const root = token.props[0]; + file = file || root.file; + if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) { + segments.push(root.content); + } + else if (isPropertyAccessToken(root)) { + // Flatten paths that start with a nested path. + segments.push(...extractPropertyAccessVariable(root).segments); + } + for (const prop of token.props.slice(1)) { + file = file || prop.file; + if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) { + segments.push(prop.content); + } + else if (isPropertyAccessToken(prop)) { + segments.push(extractPropertyAccessVariable(prop)); + } + } + const [row, col] = token.getPosition(); + return new Variable(segments, { + row, + col, + file + }); +} +// This is used to detect segments that can be represented with dot notation +// when creating a string representation of VariableSegments. +const RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/; +/** + * Return a string representation of segments using dot notation where possible. + * @param segments - The property names and array indices that make up a path to a variable. + * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets. + */ +function segmentsString(segments, bracketedRoot = false) { + const buf = []; + const root = segments[0]; + if (isString(root)) { + if (!bracketedRoot || root.match(RE_PROPERTY)) { + buf.push(`${root}`); + } + else { + buf.push(`['${root}']`); + } + } + for (const segment of segments.slice(1)) { + if (segment instanceof Variable) { + buf.push(`[${segmentsString(segment.segments)}]`); + } + else if (isString(segment)) { + if (segment.match(RE_PROPERTY)) { + buf.push(`.${segment}`); + } + else { + buf.push(`['${segment}']`); + } + } + else { + buf.push(`[${segment}]`); + } + } + return buf.join(''); +} + +var LookupType; +(function (LookupType) { + LookupType["Partials"] = "partials"; + LookupType["Layouts"] = "layouts"; + LookupType["Root"] = "root"; +})(LookupType || (LookupType = {})); +class Loader { + constructor(options) { + var _a, _b, _c, _d; + this.options = options; + if (options.relativeReference) { + const sep = options.fs.sep; + assert(sep, '`fs.sep` is required for relative reference'); + const prefixes = ['.' + sep, '..' + sep, './', '../']; + this.shouldLoadRelative = (referencedFile) => prefixes.some(prefix => referencedFile.startsWith(prefix)); + } + else { + this.shouldLoadRelative = (_referencedFile) => false; + } + const fs = options.fs; + this.contains = toLiquidAsync(((_a = fs.contains) === null || _a === void 0 ? void 0 : _a.bind(fs)) || (() => __awaiter(this, void 0, void 0, function* () { return true; })), ((_b = fs.containsSync) === null || _b === void 0 ? void 0 : _b.bind(fs)) || (() => true)); + this.exists = toLiquidAsync(((_c = fs.exists) === null || _c === void 0 ? void 0 : _c.bind(fs)) || (() => __awaiter(this, void 0, void 0, function* () { return false; })), (_d = fs.existsSync) === null || _d === void 0 ? void 0 : _d.bind(fs)); + } + *lookup(file, type, sync, currentFile) { + const dirs = this.options[type]; + for (const filepath of this.candidates(file, dirs, currentFile)) { + let allowed = false; + for (const dir of dirs) { + if (yield this.contains(!!sync, dir, filepath)) { + allowed = true; + break; + } + } + if (!allowed) + continue; + if (yield this.exists(!!sync, filepath)) + return filepath; + } + throw this.lookupError(file, dirs); + } + *candidates(file, dirs, currentFile) { + const { fs, extname } = this.options; + if (this.shouldLoadRelative(file) && currentFile) { + const referenced = fs.resolve(this.dirname(currentFile), file, extname); + yield referenced; + } + for (const dir of dirs) { + const referenced = fs.resolve(dir, file, extname); + yield referenced; + } + if (fs.fallback !== undefined) { + const filepath = fs.fallback(file); + if (filepath !== undefined) + yield filepath; + } + } + dirname(path) { + const fs = this.options.fs; + assert(fs.dirname, '`fs.dirname` is required for relative reference'); + return fs.dirname(path); + } + lookupError(file, roots) { + const err = new Error('ENOENT'); + err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`; + err.code = 'ENOENT'; + return err; + } +} + +class Parser { + constructor(liquid) { + var _a, _b; + this.liquid = liquid; + this.cache = this.liquid.options.cache; + this.fs = this.liquid.options.fs; + this.parseFile = this.cache ? this._parseFileCached : this._parseFile; + this.loader = new Loader(this.liquid.options); + this.parseLimit = new Limiter('parse length', liquid.options.parseLimit); + this.readFile = toLiquidAsync(((_a = this.fs.readFile) === null || _a === void 0 ? void 0 : _a.bind(this.fs)) || (() => __awaiter(this, void 0, void 0, function* () { throw new Error('readFile not implemented'); })), (_b = this.fs.readFileSync) === null || _b === void 0 ? void 0 : _b.bind(this.fs)); + } + parse(html, filepath) { + html = String(html); + this.parseLimit.use(html.length); + const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath); + const tokens = tokenizer.readTopLevelTokens(this.liquid.options); + return this.parseTokens(tokens); + } + parseTokens(tokens) { + let token; + const templates = []; + const errors = []; + while ((token = tokens.shift())) { + try { + templates.push(this.parseToken(token, tokens)); + } + catch (err) { + if (this.liquid.options.catchAllErrors) + errors.push(err); + else + throw err; + } + } + if (errors.length) + throw new LiquidErrors(errors); + return templates; + } + parseToken(token, remainTokens) { + try { + if (isTagToken(token)) { + const TagClass = this.liquid.tags[token.name]; + assert(TagClass, `tag "${token.name}" not found`); + return new TagClass(token, remainTokens, this.liquid, this); + } + if (isOutputToken(token)) { + return new Output(token, this.liquid); + } + return new HTML(token); + } + catch (e) { + if (LiquidError.is(e)) + throw e; + throw new ParseError(e, token); + } + } + parseStream(tokens) { + return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens)); + } + *_parseFileCached(file, sync, type = LookupType.Root, currentFile) { + const cache = this.cache; + const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file; + const tpls = yield cache.read(key); + if (tpls) + return tpls; + const task = this._parseFile(file, sync, type, currentFile); + // sync mode: exec the task and cache the result + // async mode: cache the task before exec + const taskOrTpl = sync ? yield task : toPromise(task); + cache.write(key, taskOrTpl); + // note: concurrent tasks will be reused, cache for failed task is removed until its end + try { + return yield taskOrTpl; + } + catch (err) { + cache.remove(key); + throw err; + } + } + *_parseFile(file, sync, type = LookupType.Root, currentFile) { + const filepath = yield this.loader.lookup(file, type, sync, currentFile); + return this.parse(yield this.readFile(!!sync, filepath), filepath); + } +} + +var TokenKind; +(function (TokenKind) { + TokenKind[TokenKind["Number"] = 1] = "Number"; + TokenKind[TokenKind["Literal"] = 2] = "Literal"; + TokenKind[TokenKind["Tag"] = 4] = "Tag"; + TokenKind[TokenKind["Output"] = 8] = "Output"; + TokenKind[TokenKind["HTML"] = 16] = "HTML"; + TokenKind[TokenKind["Filter"] = 32] = "Filter"; + TokenKind[TokenKind["Hash"] = 64] = "Hash"; + TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess"; + TokenKind[TokenKind["Word"] = 256] = "Word"; + TokenKind[TokenKind["Range"] = 512] = "Range"; + TokenKind[TokenKind["Quoted"] = 1024] = "Quoted"; + TokenKind[TokenKind["Operator"] = 2048] = "Operator"; + TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue"; + TokenKind[TokenKind["Delimited"] = 12] = "Delimited"; +})(TokenKind || (TokenKind = {})); + +function isDelimitedToken(val) { + return !!(getKind(val) & TokenKind.Delimited); +} +function isOperatorToken(val) { + return getKind(val) === TokenKind.Operator; +} +function isHTMLToken(val) { + return getKind(val) === TokenKind.HTML; +} +function isOutputToken(val) { + return getKind(val) === TokenKind.Output; +} +function isTagToken(val) { + return getKind(val) === TokenKind.Tag; +} +function isQuotedToken(val) { + return getKind(val) === TokenKind.Quoted; +} +function isLiteralToken(val) { + return getKind(val) === TokenKind.Literal; +} +function isNumberToken(val) { + return getKind(val) === TokenKind.Number; +} +function isPropertyAccessToken(val) { + return getKind(val) === TokenKind.PropertyAccess; +} +function isWordToken(val) { + return getKind(val) === TokenKind.Word; +} +function isRangeToken(val) { + return getKind(val) === TokenKind.Range; +} +function isValueToken(val) { + // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range + return (getKind(val) & 1667) > 0; +} +function getKind(val) { + return val ? val.kind : -1; +} + +var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken +}); + +function createScope(from) { + const scope = Object.create(null); + if (from) + Object.assign(scope, from); + return scope; +} + +class Context { + constructor(env = {}, opts = defaultOptions, renderOptions = {}, { memoryLimit, renderLimit } = {}) { + var _a, _b, _c, _d, _e; + /** + * insert a Context-level empty scope, + * for tags like `{% capture %}` `{% assign %}` to operate + */ + this.scopes = [createScope()]; + this.registers = {}; + this.breakCalled = false; + this.continueCalled = false; + this.sync = !!renderOptions.sync; + this.opts = opts; + this.globals = (_a = renderOptions.globals) !== null && _a !== void 0 ? _a : opts.globals; + this.environments = isObject(env) ? env : Object(env); + this.strictVariables = (_b = renderOptions.strictVariables) !== null && _b !== void 0 ? _b : this.opts.strictVariables; + this.ownPropertyOnly = (_c = renderOptions.ownPropertyOnly) !== null && _c !== void 0 ? _c : opts.ownPropertyOnly; + this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_d = renderOptions.memoryLimit) !== null && _d !== void 0 ? _d : opts.memoryLimit); + this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_e = renderOptions.renderLimit) !== null && _e !== void 0 ? _e : opts.renderLimit)); + } + getRegister(key, defaultValue = undefined) { + return (this.registers[key] = this.registers[key] || defaultValue); + } + setRegister(key, value) { + return (this.registers[key] = value); + } + saveRegister(...keys) { + return keys.map(key => [key, this.getRegister(key)]); + } + restoreRegister(keyValues) { + return keyValues.forEach(([key, value]) => this.setRegister(key, value)); + } + getAll() { + return [this.globals, this.environments, ...this.scopes] + .reduce((ctx, val) => __assign(ctx, val), {}); + } + /** + * @deprecated use `_get()` or `getSync()` instead + */ + get(paths) { + return this.getSync(paths); + } + getSync(paths) { + return toValueSync(this._get(paths)); + } + *_get(paths) { + const scope = this.findScope(paths[0]); // first prop should always be a string + return yield this._getFromScope(scope, paths); + } + /** + * @deprecated use `_get()` instead + */ + getFromScope(scope, paths) { + return toValueSync(this._getFromScope(scope, paths)); + } + *_getFromScope(scope, paths, strictVariables = this.strictVariables) { + if (isString(paths)) + paths = paths.split('.'); + for (let i = 0; i < paths.length; i++) { + scope = yield this.readProperty(scope, paths[i]); + if (strictVariables && isUndefined(scope)) { + throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.')); + } + } + return scope; + } + push(ctx) { + return this.scopes.push(ctx); + } + pop() { + return this.scopes.pop(); + } + bottom() { + return this.scopes[0]; + } + spawn(scope = {}) { + return new Context(scope, this.opts, { + sync: this.sync, + globals: this.globals, + strictVariables: this.strictVariables, + ownPropertyOnly: this.ownPropertyOnly + }, { + renderLimit: this.renderLimit, + memoryLimit: this.memoryLimit + }); + } + findScope(key) { + for (let i = this.scopes.length - 1; i >= 0; i--) { + const candidate = this.scopes[i]; + if (key in candidate) + return candidate; + } + if (key in this.environments) + return this.environments; + return this.globals; + } + readProperty(obj, key) { + obj = toLiquid(obj); + key = toValue(key); + if (isNil(obj)) + return obj; + if (isArray(obj) && key < 0) + return obj[obj.length + +key]; + const value = readJSProperty(obj, key, this.ownPropertyOnly); + if (value === undefined && obj instanceof Drop) + return obj.liquidMethodMissing(key, this); + if (isFunction(value)) + return value.call(obj); + if (key === 'size') + return readSize(obj); + else if (key === 'first') + return readFirst(obj); + else if (key === 'last') + return readLast(obj); + return value; + } +} +function readJSProperty(obj, key, ownPropertyOnly) { + if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) + return undefined; + return obj[key]; +} +function readFirst(obj) { + if (isArray(obj)) + return obj[0]; + return obj['first']; +} +function readLast(obj) { + if (isArray(obj)) + return obj[obj.length - 1]; + return obj['last']; +} +function readSize(obj) { + if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) + return obj['size']; + if (isArray(obj) || isString(obj)) + return obj.length; + if (typeof obj === 'object') + return Object.keys(obj).length; +} + +var BlockMode; +(function (BlockMode) { + /* store rendered html into blocks */ + BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT"; + /* output rendered html directly */ + BlockMode[BlockMode["STORE"] = 1] = "STORE"; +})(BlockMode || (BlockMode = {})); + +const abs = argumentsToNumber(Math.abs); +const at_least = argumentsToNumber(Math.max); +const at_most = argumentsToNumber(Math.min); +const ceil = argumentsToNumber(Math.ceil); +const divided_by = argumentsToNumber((dividend, divisor, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor); +const floor = argumentsToNumber(Math.floor); +const minus = argumentsToNumber((v, arg) => v - arg); +const plus = argumentsToNumber((lhs, rhs) => lhs + rhs); +const modulo = argumentsToNumber((v, arg) => v % arg); +const times = argumentsToNumber((v, arg) => v * arg); +function round(v, arg = 0) { + v = toNumber(v); + arg = toNumber(arg); + const amp = Math.pow(10, arg); + const scaled = v * amp; + // Round half away from zero + return Math.sign(v) * Math.round(Math.abs(scaled)) / amp; +} + +var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round +}); + +const url_decode = (x) => decodeURIComponent(stringify(x)).replace(/\+/g, ' '); +const url_encode = (x) => encodeURIComponent(stringify(x)).replace(/%20/g, '+'); +const cgi_escape = (x) => encodeURIComponent(stringify(x)) + .replace(/%20/g, '+') + .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase()); +const uri_escape = (x) => encodeURI(stringify(x)) + .replace(/%5B/g, '[') + .replace(/%5D/g, ']'); +const rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug; +const rSlugifyReplacers = { + 'raw': /\s+/g, + 'default': rSlugifyDefault, + 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug, + 'ascii': /[^A-Za-z0-9]+/g, + 'latin': rSlugifyDefault, + 'none': null +}; +function slugify(str, mode = 'default', cased = false) { + str = stringify(str); + const replacer = rSlugifyReplacers[mode]; + if (replacer) { + if (mode === 'latin') + str = removeAccents(str); + str = str.replace(replacer, '-').replace(/^-|-$/g, ''); + } + return cased ? str : str.toLowerCase(); +} +function removeAccents(str) { + return str.replace(/[àáâãäå]/g, 'a') + .replace(/[æ]/g, 'ae') + .replace(/[ç]/g, 'c') + .replace(/[èéêë]/g, 'e') + .replace(/[ìíîï]/g, 'i') + .replace(/[ð]/g, 'd') + .replace(/[ñ]/g, 'n') + .replace(/[òóôõöø]/g, 'o') + .replace(/[ùúûü]/g, 'u') + .replace(/[ýÿ]/g, 'y') + .replace(/[ß]/g, 'ss') + .replace(/[œ]/g, 'oe') + .replace(/[þ]/g, 'th') + .replace(/[ẞ]/g, 'SS') + .replace(/[Œ]/g, 'OE') + .replace(/[Þ]/g, 'TH'); +} + +var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify +}); + +const join = argumentsToValue(function (v, arg) { + const array = toArray(v); + const sep = isNil(arg) ? ' ' : stringify(arg); + const complexity = array.length * (1 + sep.length); + this.context.memoryLimit.use(complexity); + return array.join(sep); +}); +const last$1 = argumentsToValue((v) => isArrayLike(v) ? last(v) : ''); +const first = argumentsToValue((v) => isArrayLike(v) ? v[0] : ''); +const reverse = argumentsToValue(function (v) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + return [...array].reverse(); +}); +function* sortBy(arr, property, comparator) { + const values = []; + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + values.push([ + item, + property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item + ]); + } + return values.sort((lhs, rhs) => comparator(lhs[1], rhs[1])).map(tuple => tuple[0]); +} +function* sort(arr, property) { + return yield* sortBy.call(this, arr, property, orderedCompare); +} +function* sort_natural(arr, property) { + return yield* sortBy.call(this, arr, property, caseInsensitiveCompare); +} +const size = (v) => (v && v.length) || 0; +function* map(arr, property) { + const results = []; + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + results.push(yield this.context._getFromScope(item, stringify(property), false)); + } + return results; +} +function* sum(arr, property) { + let sum = 0; + const array = toArray(arr); + for (const item of array) { + const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item); + sum += Number.isNaN(data) ? 0 : data; + } + return sum; +} +function compact(arr) { + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + return array.filter(x => !isNil(toValue(x))); +} +function concat(v, arg = []) { + const lhs = toArray(v); + const rhs = toArray(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs.concat(rhs); +} +function push(v, arg) { + return concat.call(this, v, [arg]); +} +function unshift(v, arg) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + const clone = [...array]; + clone.unshift(arg); + return clone; +} +function pop(v) { + const clone = [...toArray(v)]; + clone.pop(); + return clone; +} +function shift(v) { + const array = toArray(v); + this.context.memoryLimit.use(array.length); + const clone = [...array]; + clone.shift(); + return clone; +} +function slice(v, begin, length = 1) { + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + begin = begin < 0 ? v.length + begin : begin; + this.context.memoryLimit.use(length); + return v.slice(begin, begin + length); +} +function expectedMatcher(expected) { + if (this.context.opts.jekyllWhere) { + return (v) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected)); + } + else if (expected === undefined) { + return (v) => isTruthy(v, this.context); + } + else { + return (v) => equals(v, expected); + } +} +function* filter(include, arr, property, expected) { + const values = []; + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + const token = new Tokenizer(stringify(property)).readScopeValue(); + for (const item of arr) { + values.push(yield evalToken(token, this.context.spawn(item))); + } + const matcher = expectedMatcher.call(this, expected); + return arr.filter((_, i) => matcher(values[i]) === include); +} +function* filter_exp(include, arr, itemName, exp) { + const filtered = []; + const keyTemplate = new Value(stringify(exp), this.liquid); + const array = toArray(arr); + this.context.memoryLimit.use(array.length); + for (const item of array) { + this.context.push({ [itemName]: item }); + const value = yield keyTemplate.value(this.context); + this.context.pop(); + if (value === include) + filtered.push(item); + } + return filtered; +} +function* where(arr, property, expected) { + return yield* filter.call(this, true, arr, property, expected); +} +function* reject(arr, property, expected) { + return yield* filter.call(this, false, arr, property, expected); +} +function* where_exp(arr, itemName, exp) { + return yield* filter_exp.call(this, true, arr, itemName, exp); +} +function* reject_exp(arr, itemName, exp) { + return yield* filter_exp.call(this, false, arr, itemName, exp); +} +function* group_by(arr, property) { + const map = new Map(); + arr = toEnumerable(arr); + const token = new Tokenizer(stringify(property)).readScopeValue(); + this.context.memoryLimit.use(arr.length); + for (const item of arr) { + const key = yield evalToken(token, this.context.spawn(item)); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + } + return [...map.entries()].map(([name, items]) => ({ name, items })); +} +function* group_by_exp(arr, itemName, exp) { + const map = new Map(); + const keyTemplate = new Value(stringify(exp), this.liquid); + arr = toEnumerable(arr); + this.context.memoryLimit.use(arr.length); + for (const item of arr) { + this.context.push({ [itemName]: item }); + const key = yield keyTemplate.value(this.context); + this.context.pop(); + if (!map.has(key)) + map.set(key, []); + map.get(key).push(item); + } + return [...map.entries()].map(([name, items]) => ({ name, items })); +} +function* search(arr, property, expected) { + const token = new Tokenizer(stringify(property)).readScopeValue(); + const array = toArray(arr); + const matcher = expectedMatcher.call(this, expected); + for (let index = 0; index < array.length; index++) { + const value = yield evalToken(token, this.context.spawn(array[index])); + if (matcher(value)) + return [index, array[index]]; + } +} +function* search_exp(arr, itemName, exp) { + const predicate = new Value(stringify(exp), this.liquid); + const array = toArray(arr); + for (let index = 0; index < array.length; index++) { + this.context.push({ [itemName]: array[index] }); + const value = yield predicate.value(this.context); + this.context.pop(); + if (value) + return [index, array[index]]; + } +} +function* has(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return !!result; +} +function* has_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return !!result; +} +function* find_index(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return result ? result[0] : undefined; +} +function* find_index_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return result ? result[0] : undefined; +} +function* find(arr, property, expected) { + const result = yield* search.call(this, arr, property, expected); + return result ? result[1] : undefined; +} +function* find_exp(arr, itemName, exp) { + const result = yield* search_exp.call(this, arr, itemName, exp); + return result ? result[1] : undefined; +} +function uniq(arr) { + arr = toArray(arr); + this.context.memoryLimit.use(arr.length); + return [...new Set(arr)]; +} +function sample(v, count = 1) { + v = toValue(v); + if (isNil(v)) + return []; + if (!isArray(v)) + v = stringify(v); + this.context.memoryLimit.use(count); + const shuffled = [...v].sort(() => Math.random() - 0.5); + if (count === 1) + return shuffled[0]; + return shuffled.slice(0, count); +} + +var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample +}); + +function date(v, format, timezoneOffset) { + var _a, _b; + const size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _b !== void 0 ? _b : 0); + this.context.memoryLimit.use(size); + const date = parseDate(v, this.context.opts, timezoneOffset); + if (!date) + return v; + format = toValue(format); + format = isNil(format) ? this.context.opts.dateFormat : stringify(format); + this.context.memoryLimit.use(format.length); + return strftime(date, format, this.context.memoryLimit); +} +function date_to_xmlschema(v) { + return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z'); +} +function date_to_rfc822(v) { + return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z'); +} +function date_to_string(v, type, style) { + return stringify_date.call(this, v, '%b', type, style); +} +function date_to_long_string(v, type, style) { + return stringify_date.call(this, v, '%B', type, style); +} +function stringify_date(v, month_type, type, style) { + const date = parseDate(v, this.context.opts); + if (!date) + return v; + const ml = this.context.memoryLimit; + if (type === 'ordinal') { + const d = date.getDate(); + return style === 'US' + ? strftime(date, `${month_type} ${d}%q, %Y`, ml) + : strftime(date, `${d}%q ${month_type} %Y`, ml); + } + return strftime(date, `%d ${month_type} %Y`, ml); +} +function parseDate(v, opts, timezoneOffset) { + let date; + const defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset; + const locale = opts.locale; + v = toValue(v); + if (isNil(v)) { + return undefined; + } + else if (v === 'now' || v === 'today') { + date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset); + } + else if (isNumber(v)) { + date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset); + } + else if (isString(v)) { + if (/^\d+$/.test(v)) { + date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset); + } + else if (opts.preserveTimezones && timezoneOffset === undefined) { + date = LiquidDate.createDateFixedToTimezone(v, locale); + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + } + else { + date = new LiquidDate(v, locale, defaultTimezoneOffset); + } + return date.valid() ? date : undefined; +} + +var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string +}); + +/** + * String related filters + * + * * prefer stringify() to String() since `undefined`, `null` should eval '' + */ +const rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu; +// Word boundary followed by word characters (for detecting words) +const rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu; +function append(v, arg) { + assert(arguments.length === 2, 'append expect 2 arguments'); + const lhs = stringify(v); + const rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return lhs + rhs; +} +function prepend(v, arg) { + assert(arguments.length === 2, 'prepend expect 2 arguments'); + const lhs = stringify(v); + const rhs = stringify(arg); + this.context.memoryLimit.use(lhs.length + rhs.length); + return rhs + lhs; +} +function lstrip(v, chars) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (let i = 0, set = new Set(chars); i < str.length; i++) { + if (!set.has(str[i])) + return str.slice(i); + } + return ''; + } + return str.trimStart(); +} +function downcase(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.toLowerCase(); +} +function upcase(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return stringify(str).toUpperCase(); +} +function remove(v, arg) { + const str = stringify(v); + arg = stringify(arg); + this.context.memoryLimit.use(str.length + arg.length); + return str.split(arg).join(''); +} +function remove_first(v, l) { + const str = stringify(v); + l = stringify(l); + this.context.memoryLimit.use(str.length + l.length); + return str.replace(l, ''); +} +function remove_last(v, l) { + const str = stringify(v); + const pattern = stringify(l); + this.context.memoryLimit.use(str.length + pattern.length); + const index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + str.substring(index + pattern.length); +} +function rstrip(str, chars) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + if (chars) { + chars = stringify(chars); + this.context.memoryLimit.use(chars.length); + for (let i = str.length - 1, set = new Set(chars); i >= 0; i--) { + if (!set.has(str[i])) + return str.slice(0, i + 1); + } + return ''; + } + return str.trimEnd(); +} +function split(v, arg) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + const arr = str.split(stringify(arg)); + // align to ruby split, which is the behavior of shopify/liquid + // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split + while (arr.length && arr[arr.length - 1] === '') + arr.pop(); + return arr; +} +function strip(v, chars) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + if (chars) { + const set = new Set(stringify(chars)); + this.context.memoryLimit.use(set.size); + let i = 0; + let j = str.length - 1; + while (set.has(str[i])) + i++; + while (j >= i && set.has(str[j])) + j--; + return str.slice(i, j + 1); + } + return str.trim(); +} +function strip_newlines(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\r?\n/gm, ''); +} +function capitalize(str) { + str = stringify(str); + this.context.memoryLimit.use(str.length); + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); +} +function replace(v, pattern, replacement) { + const str = stringify(v); + pattern = stringify(pattern); + replacement = stringify(replacement); + const parts = str.split(pattern); + const outputSize = str.length + (parts.length - 1) * (replacement.length - pattern.length); + this.context.memoryLimit.use(outputSize); + return parts.join(replacement); +} +function replace_first(v, arg1, arg2) { + const str = stringify(v); + arg1 = stringify(arg1); + arg2 = stringify(arg2); + this.context.memoryLimit.use(str.length + arg1.length + arg2.length); + return str.replace(arg1, () => arg2); +} +function replace_last(v, arg1, arg2) { + const str = stringify(v); + const pattern = stringify(arg1); + const replacement = stringify(arg2); + this.context.memoryLimit.use(str.length + pattern.length + replacement.length); + const index = str.lastIndexOf(pattern); + if (index === -1) + return str; + return str.substring(0, index) + replacement + str.substring(index + pattern.length); +} +function truncate(v, l = 50, o = '...') { + const str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + if (str.length <= l) + return v; + return str.substring(0, l - o.length) + o; +} +function truncatewords(v, words = 15, o = '...') { + const str = stringify(v); + o = stringify(o); + this.context.memoryLimit.use(str.length + o.length); + const arr = str.split(/\s+/); + if (words <= 0) + words = 1; + let ret = arr.slice(0, words).join(' '); + if (arr.length >= words) + ret += o; + return ret; +} +function normalize_whitespace(v) { + const str = stringify(v); + this.context.memoryLimit.use(str.length); + return str.replace(/\s+/g, ' '); +} +function number_of_words(input, mode) { + const str = stringify(input); + this.context.memoryLimit.use(str.length); + input = str.trim(); + if (!input) + return 0; + switch (mode) { + case 'cjk': + // Count CJK characters and words + return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length; + case 'auto': + // Count CJK characters, if none, count words + return rCJKWord.test(input) + ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length + : input.split(/\s+/).length; + default: + // Count words only + return input.split(/\s+/).length; + } +} +function array_to_sentence_string(array, connector = 'and') { + connector = stringify(connector); + this.context.memoryLimit.use(array.length + connector.length); + switch (array.length) { + case 0: + return ''; + case 1: + return array[0]; + case 2: + return `${array[0]} ${connector} ${array[1]}`; + default: + return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`; + } +} + +var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string +}); + +function base64Encode(str) { + return Buffer.from(str, 'utf8').toString('base64'); +} +function base64Decode(str) { + return Buffer.from(str, 'base64').toString('utf8'); +} + +/** + * Base64 related filters + * + * Implements base64_encode and base64_decode filters for Shopify compatibility + */ +function base64_encode(value) { + if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) { + this.context.memoryLimit.use(value.byteLength); + return value.toString('base64'); + } + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Encode(str); +} +function base64_decode(value) { + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return base64Decode(str); +} + +var base64Filters = /*#__PURE__*/Object.freeze({ + __proto__: null, + base64_encode: base64_encode, + base64_decode: base64_decode +}); + +function sha256(str) { + return createHash('sha256').update(str, 'utf8').digest('hex'); +} +function hmacSha256(str, key) { + return createHmac('sha256', key).update(str, 'utf8').digest('hex'); +} + +/** + * Crypto related filters + * + * Implements sha256 and hmac_sha256 filters for Shopify compatibility + */ +function sha256$1(value) { + const str = stringify(value); + this.context.memoryLimit.use(str.length); + return sha256(str); +} +function hmac_sha256(value, key) { + const str = stringify(value); + const keyStr = stringify(key); + this.context.memoryLimit.use(str.length + keyStr.length); + return hmacSha256(str, keyStr); +} + +var cryptoFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + sha256: sha256$1, + hmac_sha256: hmac_sha256 +}); + +const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, htmlFilters), mathFilters), urlFilters), arrayFilters), dateFilters), stringFilters), base64Filters), cryptoFilters), misc); + +class AssignTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.key = this.identifier.content; + this.tokenizer.assert(this.key, 'expected variable name'); + this.tokenizer.skipBlank(); + this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected "="'); + this.tokenizer.advance(); + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + } + *render(ctx) { + ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf); + } + *arguments() { + yield this.value; + } + *localScope() { + yield this.identifier; + } +} + +const MODIFIERS = ['offset', 'limit', 'reversed']; +class ForTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const variable = this.tokenizer.readIdentifier(); + const inStr = this.tokenizer.readIdentifier(); + const collection = this.tokenizer.readValue(); + if (!variable.size() || inStr.content !== 'in' || !collection) { + throw new Error(`illegal tag: ${token.getText()}`); + } + this.variable = variable.content; + this.collection = collection; + this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = []; + this.elseTemplates = []; + let p; + const stream = parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates; }) + .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop(); }) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { throw new Error(`tag ${token.getText()} not closed`); }); + stream.start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + let collection = toEnumerable(yield evalToken(this.collection, ctx)); + if (!collection.length) { + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + return; + } + const continueKey = 'continue-' + this.variable + '-' + this.collection.getText(); + ctx.push(createScope({ continue: ctx.getRegister(continueKey, {}) })); + const hash = yield this.hash.render(ctx); + ctx.pop(); + const modifiers = this.liquid.options.orderedFilterParameters + ? Object.keys(hash).filter(x => MODIFIERS.includes(x)) + : MODIFIERS.filter(x => hash[x] !== undefined); + collection = modifiers.reduce((collection, modifier) => { + if (modifier === 'offset') + return offset(collection, hash['offset']); + if (modifier === 'limit') + return limit(collection, hash['limit']); + return reversed(collection); + }, collection); + ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length); + const scope = createScope({ forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }); + ctx.push(scope); + for (const item of collection) { + scope[this.variable] = item; + ctx.continueCalled = ctx.breakCalled = false; + yield r.renderTemplates(this.templates, ctx, emitter); + if (ctx.breakCalled) + break; + scope.forloop.next(); + } + ctx.continueCalled = ctx.breakCalled = false; + ctx.pop(); + } + *children() { + const templates = this.templates.slice(); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } + *arguments() { + yield this.collection; + for (const v of Object.values(this.hash.hash)) { + if (isValueToken(v)) { + yield v; + } + } + } + blockScope() { + return [this.variable, 'forloop']; + } +} +function reversed(arr) { + return [...arr].reverse(); +} +function offset(arr, count) { + return arr.slice(count); +} +function limit(arr, count) { + return arr.slice(0, count); +} + +class CaptureTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.templates = []; + this.identifier = this.readVariable(); + this.variable = this.identifier.content; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcapture') + return; + this.templates.push(parser.parseToken(token, remainTokens)); + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + readVariable() { + let ident = this.tokenizer.readIdentifier(); + if (ident.content) + return ident; + ident = this.tokenizer.readQuoted(); + if (ident) + return ident; + throw this.tokenizer.error('invalid capture name'); + } + *render(ctx) { + const r = this.liquid.renderer; + const html = yield r.renderTemplates(this.templates, ctx); + ctx.bottom()[this.variable] = html; + } + *children() { + return this.templates; + } + *localScope() { + yield this.identifier; + } +} + +class CaseTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + this.elseTemplates = []; + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + this.elseTemplates = []; + let p = []; + let elseCount = 0; + const stream = parser.parseStream(remainTokens) + .on('tag:when', (token) => { + if (elseCount > 0) { + return; + } + p = []; + const values = []; + while (!token.tokenizer.end()) { + values.push(token.tokenizer.readValueOrThrow()); + token.tokenizer.skipBlank(); + if (token.tokenizer.peek() === ',') { + token.tokenizer.readTo(','); + } + else { + token.tokenizer.readTo('or'); + } + } + this.branches.push({ + values, + templates: p + }); + }) + .on('tag:else', () => { + elseCount++; + p = this.elseTemplates; + }) + .on('tag:endcase', () => stream.stop()) + .on('template', (tpl) => { + if (p !== this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + stream.start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf)); + let branchHit = false; + for (const branch of this.branches) { + for (const valueToken of branch.values) { + const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf); + if (equals(target, value)) { + yield r.renderTemplates(branch.templates, ctx, emitter); + branchHit = true; + break; + } + } + } + if (!branchHit) { + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + } + } + *arguments() { + yield this.value; + yield* this.branches.flatMap(b => b.values); + } + *children() { + const templates = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } +} + +class CommentTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endcomment') + return; + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + render() { } +} + +class RenderTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const tokenizer = this.tokenizer; + this.file = parseFilePath(tokenizer, this.liquid, parser); + this.currentFile = token.file; + while (!tokenizer.end()) { + tokenizer.skipBlank(); + const begin = tokenizer.p; + const keyword = tokenizer.readIdentifier(); + if (keyword.content === 'with' || keyword.content === 'for') { + tokenizer.skipBlank(); + // can be normal key/value pair, like "with: true" + if (tokenizer.peek() !== ':') { + const value = tokenizer.readValue(); + // can be normal key, like "with," + if (value) { + const beforeAs = tokenizer.p; + const asStr = tokenizer.readIdentifier(); + let alias; + if (asStr.content === 'as') + alias = tokenizer.readIdentifier(); + else + tokenizer.p = beforeAs; + this[keyword.content] = { value, alias: alias && alias.content }; + tokenizer.skipBlank(); + if (tokenizer.peek() === ',') + tokenizer.advance(); + continue; // matched! + } + } + } + /** + * restore cursor if with/for not matched + */ + tokenizer.p = begin; + break; + } + this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator); + } + *render(ctx, emitter) { + const { liquid, hash } = this; + const filepath = (yield renderFilePath(this['file'], ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const childCtx = ctx.spawn(); + const scope = childCtx.bottom(); + __assign(scope, yield hash.render(ctx)); + if (this['with']) { + const { value, alias } = this['with']; + scope[alias || filepath] = yield evalToken(value, ctx); + } + if (this['for']) { + const { value, alias } = this['for']; + const collection = toEnumerable(yield evalToken(value, ctx)); + scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias); + for (const item of collection) { + scope[alias] = item; + const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])); + yield liquid.renderer.renderTemplates(templates, childCtx, emitter); + scope['forloop'].next(); + } + } + else { + const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])); + yield liquid.renderer.renderTemplates(templates, childCtx, emitter); + } + } + *children(partials, sync) { + if (partials && isString(this['file'])) { + return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])); + } + return []; + } + partialScope() { + if (isString(this['file'])) { + const names = Object.keys(this.hash.hash); + if (this['with']) { + const { value, alias } = this['with']; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + if (this['for']) { + const { value, alias } = this['for']; + if (isString(alias)) { + names.push([alias, value]); + } + else if (isString(this.file)) { + names.push([this.file, value]); + } + } + return { name: this['file'], isolated: true, scope: names }; + } + } + *arguments() { + for (const v of Object.values(this.hash.hash)) { + if (isValueToken(v)) { + yield v; + } + } + if (this['with']) { + const { value } = this['with']; + if (isValueToken(value)) { + yield value; + } + } + if (this['for']) { + const { value } = this['for']; + if (isValueToken(value)) { + yield value; + } + } + } +} +/** + * @return null for "none", + * @return Template[] for quoted with tags and/or filters + * @return Token for expression (not quoted) + * @throws TypeError if cannot read next token + */ +function parseFilePath(tokenizer, liquid, parser) { + if (liquid.options.dynamicPartials) { + const file = tokenizer.readValue(); + tokenizer.assert(file, 'illegal file path'); + if (file.getText() === 'none') + return; + if (isQuotedToken(file)) { + // for filenames like "files/{{file}}", eval as liquid template + const templates = parser.parse(evalQuotedToken(file)); + return optimize(templates); + } + return file; + } + const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]; + const templates = optimize(parser.parseTokens(tokens)); + return templates === 'none' ? undefined : templates; +} +function optimize(templates) { + // for filenames like "files/file.liquid", extract the string directly + if (templates.length === 1 && isHTMLToken(templates[0].token)) + return templates[0].token.getContent(); + return templates; +} +function* renderFilePath(file, ctx, liquid) { + if (typeof file === 'string') + return file; + if (Array.isArray(file)) + return liquid.renderer.renderTemplates(file, ctx); + return yield evalToken(file, ctx); +} + +class IncludeTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const { tokenizer } = token; + this['file'] = parseFilePath(tokenizer, this.liquid, parser); + this['currentFile'] = token.file; + const begin = tokenizer.p; + const withStr = tokenizer.readIdentifier(); + if (withStr.content === 'with') { + tokenizer.skipBlank(); + if (tokenizer.peek() !== ':') { + this.withVar = tokenizer.readValue(); + } + else + tokenizer.p = begin; + } + else + tokenizer.p = begin; + this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator); + } + *render(ctx, emitter) { + const { liquid, hash, withVar } = this; + const { renderer } = liquid; + const filepath = (yield renderFilePath(this['file'], ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const saved = ctx.saveRegister('blocks', 'blockMode'); + ctx.setRegister('blocks', {}); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + const scope = createScope((yield hash.render(ctx))); + if (withVar) + scope[filepath] = yield evalToken(withVar, ctx); + const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])); + ctx.push(ctx.opts.jekyllInclude ? createScope({ include: scope }) : scope); + yield renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + ctx.restoreRegister(saved); + } + *children(partials, sync) { + if (partials && isString(this['file'])) { + return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])); + } + return []; + } + partialScope() { + if (isString(this['file'])) { + let names; + if (this.liquid.options.jekyllInclude) { + names = ['include']; + } + else { + names = Object.keys(this.hash.hash); + if (this.withVar) { + names.push([this['file'], this.withVar]); + } + } + return { name: this['file'], isolated: false, scope: names }; + } + } + *arguments() { + yield* Object.values(this.hash.hash).filter(isValueToken); + if (isValueToken(this['file'])) { + yield this['file']; + } + if (isValueToken(this.withVar)) { + yield this.withVar; + } + } +} + +class DecrementTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.variable = this.identifier.content; + } + render(context, emitter) { + const scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + emitter.write(stringify(--scope[this.variable])); + } + *localScope() { + yield this.identifier; + } +} + +class CycleTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.candidates = []; + const group = this.tokenizer.readValue(); + this.tokenizer.skipBlank(); + if (group) { + if (this.tokenizer.peek() === ':') { + this.group = group; + this.tokenizer.advance(); + } + else + this.candidates.push(group); + } + while (!this.tokenizer.end()) { + const value = this.tokenizer.readValue(); + if (value) + this.candidates.push(value); + this.tokenizer.readTo(','); + } + this.tokenizer.assert(this.candidates.length, () => `empty candidates: "${token.getText()}"`); + } + *render(ctx, emitter) { + const group = (yield evalToken(this.group, ctx)); + const fingerprint = `cycle:${group}:` + this.candidates.join(','); + const groups = ctx.getRegister('cycle', {}); + let idx = groups[fingerprint]; + if (idx === undefined) { + idx = groups[fingerprint] = 0; + } + const candidate = this.candidates[idx]; + idx = (idx + 1) % this.candidates.length; + groups[fingerprint] = idx; + return yield evalToken(candidate, ctx); + } + *arguments() { + yield* this.candidates; + if (this.group) { + yield this.group; + } + } +} + +class IfTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + let p = []; + parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid), + templates: (p = []) + })) + .on('tag:elsif', (token) => { + assert(!this.elseTemplates, 'unexpected elsif after else'); + this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), this.liquid), + templates: (p = []) + }); + }) + .on('tag:else', tag => { + assertEmpty(tag.args); + assert(!this.elseTemplates, 'duplicated else'); + p = this.elseTemplates = []; + }) + .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); }) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); }) + .start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + for (const { value, templates } of this.branches) { + const v = yield value.value(ctx, ctx.opts.lenientIf); + if (isTruthy(v, ctx)) { + yield r.renderTemplates(templates, ctx, emitter); + return; + } + } + yield r.renderTemplates(this.elseTemplates || [], ctx, emitter); + } + *children() { + const templates = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + templates.push(...this.elseTemplates); + } + return templates; + } + arguments() { + return this.branches.map(b => b.value); + } +} + +class IncrementTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.identifier = this.tokenizer.readIdentifier(); + this.variable = this.identifier.content; + } + render(context, emitter) { + const scope = context.environments; + if (!isNumber(scope[this.variable])) { + scope[this.variable] = 0; + } + const val = scope[this.variable]; + scope[this.variable]++; + emitter.write(stringify(val)); + } + *localScope() { + yield this.identifier; + } +} + +class LayoutTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + this.file = parseFilePath(this.tokenizer, this.liquid, parser); + this['currentFile'] = token.file; + this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = parser.parseTokens(remainTokens); + } + *render(ctx, emitter) { + const { liquid, args, file } = this; + const { renderer } = liquid; + if (file === undefined) { + ctx.setRegister('blockMode', BlockMode.OUTPUT); + yield renderer.renderTemplates(this.templates, ctx, emitter); + return; + } + const filepath = (yield renderFilePath(this.file, ctx, liquid)); + assert(filepath, () => `illegal file path "${filepath}"`); + const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])); + // render remaining contents and store rendered results + ctx.setRegister('blockMode', BlockMode.STORE); + const html = yield renderer.renderTemplates(this.templates, ctx); + const blocks = ctx.getRegister('blocks', {}); + // set whole content to anonymous block if anonymous doesn't specified + if (blocks[''] === undefined) + blocks[''] = (parent, emitter) => emitter.write(html); + ctx.setRegister('blockMode', BlockMode.OUTPUT); + // render the layout file use stored blocks + ctx.push(createScope((yield args.render(ctx)))); + yield renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + } + *children(partials) { + const templates = this.templates.slice(); + if (partials && isString(this.file)) { + templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile']))); + } + return templates; + } + *arguments() { + for (const v of Object.values(this.args.hash)) { + if (isValueToken(v)) { + yield v; + } + } + if (isValueToken(this.file)) { + yield this.file; + } + } + partialScope() { + if (isString(this.file)) { + return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }; + } + } +} + +class BlockTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + this.templates = []; + const match = /\w+/.exec(token.args); + this.block = match ? match[0] : ''; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endblock') + return; + const template = parser.parseToken(token, remainTokens); + this.templates.push(template); + } + throw new Error(`tag ${token.getText()} not closed`); + } + *render(ctx, emitter) { + const blockRender = this.getBlockRender(ctx); + if (ctx.getRegister('blockMode') === BlockMode.STORE) { + ctx.getRegister('blocks', {})[this.block] = blockRender; + } + else { + yield blockRender(new BlockDrop(), emitter); + } + } + getBlockRender(ctx) { + const self = this; + const { liquid, templates } = this; + const renderChild = ctx.getRegister('blocks', {})[this.block]; + const renderCurrent = function* (superBlock, emitter) { + const stack = ctx.getRegister('blockStack', []); + if (stack.includes(self)) + throw new Error('block tag cannot be nested'); + stack.push(self); + ctx.push(createScope({ block: superBlock })); + yield liquid.renderer.renderTemplates(templates, ctx, emitter); + ctx.pop(); + stack.pop(); + }; + return renderChild + ? (superBlock, emitter) => renderChild(new BlockDrop((emitter) => renderCurrent(superBlock, emitter)), emitter) + : renderCurrent; + } + *children() { + return this.templates; + } + blockScope() { + return ['block']; + } +} + +class RawTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + this.tokens = []; + while (remainTokens.length) { + const token = remainTokens.shift(); + if (isTagToken(token) && token.name === 'endraw') + return; + this.tokens.push(token); + } + throw new Error(`tag ${tagToken.getText()} not closed`); + } + render() { + return this.tokens.map((token) => token.getText()).join(''); + } +} + +class TablerowloopDrop extends ForloopDrop { + constructor(length, cols, collection, variable) { + super(length, collection, variable); + this.length = length; + this.cols = cols; + } + row() { + return Math.floor(this.i / this.cols) + 1; + } + col0() { + return (this.i % this.cols); + } + col() { + return this.col0() + 1; + } + col_first() { + return this.col0() === 0; + } + col_last() { + return this.col() === this.cols; + } +} + +class TablerowTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + const variable = this.tokenizer.readIdentifier(); + this.tokenizer.skipBlank(); + const predicate = this.tokenizer.readIdentifier(); + const collectionToken = this.tokenizer.readValue(); + if (predicate.content !== 'in' || !collectionToken) { + throw new Error(`illegal tag: ${tagToken.getText()}`); + } + this.variable = variable.content; + this.collection = collectionToken; + this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator); + this.templates = []; + let p; + const stream = parser.parseStream(remainTokens) + .on('start', () => (p = this.templates)) + .on('tag:endtablerow', () => stream.stop()) + .on('template', (tpl) => p.push(tpl)) + .on('end', () => { + throw new Error(`tag ${tagToken.getText()} not closed`); + }); + stream.start(); + } + *render(ctx, emitter) { + let collection = toEnumerable(yield evalToken(this.collection, ctx)); + const args = (yield this.args.render(ctx)); + const offset = args.offset || 0; + const limit = (args.limit === undefined) ? collection.length : args.limit; + collection = collection.slice(offset, offset + limit); + const cols = args.cols || collection.length; + const r = this.liquid.renderer; + const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable); + const scope = createScope({ tablerowloop }); + ctx.push(scope); + for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) { + scope[this.variable] = collection[idx]; + if (tablerowloop.col0() === 0) { + if (tablerowloop.row() !== 1) + emitter.write(''); + emitter.write(``); + } + emitter.write(``); + yield r.renderTemplates(this.templates, ctx, emitter); + emitter.write(''); + } + if (collection.length) + emitter.write(''); + ctx.pop(); + } + *children() { + return this.templates; + } + *arguments() { + yield this.collection; + for (const v of Object.values(this.args.hash)) { + if (isValueToken(v)) { + yield v; + } + } + } + blockScope() { + return [this.variable, 'tablerowloop']; + } +} + +class UnlessTag extends Tag { + constructor(tagToken, remainTokens, liquid, parser) { + super(tagToken, remainTokens, liquid); + this.branches = []; + this.elseTemplates = []; + let p = []; + let elseCount = 0; + parser.parseStream(remainTokens) + .on('start', () => this.branches.push({ + value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid), + test: isFalsy, + templates: (p = []) + })) + .on('tag:elsif', (token) => { + if (elseCount > 0) { + p = []; + return; + } + this.branches.push({ + value: new Value(token.tokenizer.readFilteredValue(), this.liquid), + test: isTruthy, + templates: (p = []) + }); + }) + .on('tag:else', () => { + elseCount++; + p = this.elseTemplates; + }) + .on('tag:endunless', function () { this.stop(); }) + .on('template', (tpl) => { + if (p !== this.elseTemplates || elseCount === 1) { + p.push(tpl); + } + }) + .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); }) + .start(); + } + *render(ctx, emitter) { + const r = this.liquid.renderer; + for (const { value, test, templates } of this.branches) { + const v = yield value.value(ctx, ctx.opts.lenientIf); + if (test(v, ctx)) { + yield r.renderTemplates(templates, ctx, emitter); + return; + } + } + yield r.renderTemplates(this.elseTemplates, ctx, emitter); + } + *children() { + const children = this.branches.flatMap(b => b.templates); + if (this.elseTemplates) { + children.push(...this.elseTemplates); + } + return children; + } + arguments() { + return this.branches.map(b => b.value); + } +} + +class BreakTag extends Tag { + render(ctx, _emitter) { + ctx.breakCalled = true; + } +} + +class ContinueTag extends Tag { + render(ctx, _emitter) { + ctx.continueCalled = true; + } +} + +class EchoTag extends Tag { + constructor(token, remainTokens, liquid) { + super(token, remainTokens, liquid); + this.tokenizer.skipBlank(); + if (!this.tokenizer.end()) { + this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid); + } + } + *render(ctx, emitter) { + if (!this.value) + return; + const val = yield this.value.value(ctx, false); + emitter.write(val); + } + *arguments() { + if (this.value) { + yield this.value; + } + } +} + +class LiquidTag extends Tag { + constructor(token, remainTokens, liquid, parser) { + super(token, remainTokens, liquid); + const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options); + this.templates = parser.parseTokens(tokens); + } + *render(ctx, emitter) { + yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter); + } + *children() { + return this.templates; + } +} + +class InlineCommentTag extends Tag { + constructor(tagToken, remainTokens, liquid) { + super(tagToken, remainTokens, liquid); + if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) { + throw new Error('every line of an inline comment must start with a \'#\' character'); + } + } + render() { } +} + +const tags = { + assign: AssignTag, + 'for': ForTag, + capture: CaptureTag, + 'case': CaseTag, + comment: CommentTag, + include: IncludeTag, + render: RenderTag, + decrement: DecrementTag, + increment: IncrementTag, + cycle: CycleTag, + 'if': IfTag, + layout: LayoutTag, + block: BlockTag, + raw: RawTag, + tablerow: TablerowTag, + unless: UnlessTag, + 'break': BreakTag, + 'continue': ContinueTag, + echo: EchoTag, + liquid: LiquidTag, + '#': InlineCommentTag +}; + +class Liquid { + constructor(opts = {}) { + this.renderer = new Render(); + this.filters = Object.create(null); + this.tags = Object.create(null); + this.options = normalize(opts); + // eslint-disable-next-line deprecation/deprecation + this.parser = new Parser(this); + forOwn(tags, (conf, name) => this.registerTag(name, conf)); + forOwn(filters, (handler, name) => this.registerFilter(name, handler)); + } + parse(html, filepath) { + const parser = new Parser(this); + return parser.parse(html, filepath); + } + _render(tpl, scope, renderOptions) { + const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplates(tpl, ctx); + } + render(tpl, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: false }))); + }); + } + renderSync(tpl, scope, renderOptions) { + return toValueSync(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: true }))); + } + renderToNodeStream(tpl, scope, renderOptions = {}) { + const ctx = new Context(scope, this.options, renderOptions); + return this.renderer.renderTemplatesToNodeStream(tpl, ctx); + } + _parseAndRender(html, scope, renderOptions) { + const tpl = this.parse(html); + return this._render(tpl, scope, renderOptions); + } + parseAndRender(html, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: false }))); + }); + } + parseAndRenderSync(html, scope, renderOptions) { + return toValueSync(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: true }))); + } + _parsePartialFile(file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile); + } + _parseLayoutFile(file, sync, currentFile) { + return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile); + } + _parseFile(file, sync, lookupType, currentFile) { + return new Parser(this).parseFile(file, sync, lookupType, currentFile); + } + parseFile(file, lookupType) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(new Parser(this).parseFile(file, false, lookupType)); + }); + } + parseFileSync(file, lookupType) { + return toValueSync(new Parser(this).parseFile(file, true, lookupType)); + } + *_renderFile(file, ctx, renderFileOptions) { + const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)); + return yield this._render(templates, ctx, renderFileOptions); + } + renderFile(file, ctx, renderFileOptions) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: false }))); + }); + } + renderFileSync(file, ctx, renderFileOptions) { + return toValueSync(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: true }))); + } + renderFileToNodeStream(file, scope, renderOptions) { + return __awaiter(this, void 0, void 0, function* () { + const templates = yield this.parseFile(file); + return this.renderToNodeStream(templates, scope, renderOptions); + }); + } + _evalValue(str, scope) { + const value = new Value(str, this); + const ctx = scope instanceof Context ? scope : new Context(scope, this.options); + return value.value(ctx); + } + evalValue(str, scope) { + return __awaiter(this, void 0, void 0, function* () { + return toPromise(this._evalValue(str, scope)); + }); + } + evalValueSync(str, scope) { + return toValueSync(this._evalValue(str, scope)); + } + registerFilter(name, filter) { + this.filters[name] = filter; + } + registerTag(name, tag) { + this.tags[name] = isFunction(tag) ? tag : createTagClass(tag); + } + plugin(plugin) { + return plugin.call(this, Liquid); + } + express() { + const self = this; // eslint-disable-line + let firstCall = true; + return function (filePath, ctx, callback) { + if (firstCall) { + firstCall = false; + const dirs = normalizeDirectoryList(this.root); + self.options.root.unshift(...dirs); + self.options.layouts.unshift(...dirs); + self.options.partials.unshift(...dirs); + } + self.renderFile(filePath, ctx).then(html => callback(null, html), callback); + }; + } + analyze(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + return analyze(template, options); + }); + } + analyzeSync(template, options = {}) { + return analyzeSync(template, options); + } + parseAndAnalyze(html, filename, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + return analyze(this.parse(html, filename), options); + }); + } + parseAndAnalyzeSync(html, filename, options = {}) { + return analyzeSync(this.parse(html, filename), options); + } + /** Return an array of all variables without their properties. */ + variables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + }); + } + /** Return an array of all variables without their properties. */ + variablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.variables); + } + /** Return an array of all variables including their properties/paths. */ + fullVariables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v))))); + }); + } + /** Return an array of all variables including their properties/paths. */ + fullVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegments(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray())))); + }); + } + /** Return an array of all variables, each as an array of properties/segments. */ + variableSegmentsSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray())))); + } + /** Return an array of all expected context variables without their properties. */ + globalVariables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + }); + } + /** Return an array of all expected context variables without their properties. */ + globalVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Object.keys(analysis.globals); + } + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariables(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v))))); + }); + } + /** Return an array of all expected context variables including their properties/paths. */ + globalFullVariablesSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v))))); + } + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegments(template, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const analysis = yield analyze(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray())))); + }); + } + /** Return an array of all expected context variables, each as an array of properties/segments. */ + globalVariableSegmentsSync(template, options = {}) { + const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options); + return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray())))); + } +} + +/* istanbul ignore file */ +const version = '[VI]{version}[/VI]'; + +export { AssertionError, AssignTag, BlockTag, BreakTag, CaptureTag, CaseTag, CommentTag, Context, ContinueTag, CycleTag, DecrementTag, Drop, EchoTag, Expression, Filter, ForTag, Hash, IfTag, IncludeTag, IncrementTag, InlineCommentTag, LayoutTag, Liquid, LiquidError, LiquidTag, LookupType, Output, ParseError, ParseStream, Parser, RawTag, RenderError, RenderTag, TablerowTag, Tag, TagToken, Token, TokenKind, TokenizationError, Tokenizer, typeGuards as TypeGuards, UndefinedVariableError, UnlessTag, Value, Variable, analyze, analyzeSync, assert, createTrie, defaultOperators, defaultOptions, evalQuotedToken, evalToken, filters, isFalsy, isTruthy, tags, toPromise, toValue, toValueSync, version }; diff --git a/node_modules/liquidjs/dist/parser/filter-arg.d.ts b/node_modules/liquidjs/dist/parser/filter-arg.d.ts new file mode 100644 index 0000000..dfe7996 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/filter-arg.d.ts @@ -0,0 +1,5 @@ +import { ValueToken } from '../tokens/value-token'; +type KeyValuePair = [string?, ValueToken?]; +export type FilterArg = ValueToken | KeyValuePair; +export declare function isKeyValuePair(arr: FilterArg): arr is KeyValuePair; +export {}; diff --git a/node_modules/liquidjs/dist/parser/index.d.ts b/node_modules/liquidjs/dist/parser/index.d.ts new file mode 100644 index 0000000..931955e --- /dev/null +++ b/node_modules/liquidjs/dist/parser/index.d.ts @@ -0,0 +1,4 @@ +export * from './tokenizer'; +export * from './parser'; +export * from './parse-stream'; +export * from './token-kind'; diff --git a/node_modules/liquidjs/dist/parser/parse-stream.d.ts b/node_modules/liquidjs/dist/parser/parse-stream.d.ts new file mode 100644 index 0000000..83b97d7 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parse-stream.d.ts @@ -0,0 +1,15 @@ +import { Token, TopLevelToken } from '../tokens'; +import { Template } from '../template'; +type ParseToken = ((token: T, remainTokens: T[]) => Template); +export declare class ParseStream { + private tokens; + private handlers; + private stopRequested; + private parseToken; + constructor(tokens: T[], parseToken: ParseToken); + on(name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream; + private trigger; + start(): this; + stop(): this; +} +export {}; diff --git a/node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts b/node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/parser/parser.d.ts b/node_modules/liquidjs/dist/parser/parser.d.ts new file mode 100644 index 0000000..33e628d --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parser.d.ts @@ -0,0 +1,21 @@ +import { ParseStream } from './parse-stream'; +import { TopLevelToken } from '../tokens'; +import { Template, Output, HTML } from '../template'; +import { LookupType } from '../fs'; +import type { Liquid } from '../liquid'; +export declare class Parser { + parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator; + private liquid; + private fs; + private cache?; + private loader; + private parseLimit; + private readFile; + constructor(liquid: Liquid); + parse(html: string, filepath?: string): Template[]; + parseTokens(tokens: TopLevelToken[]): Template[]; + parseToken(token: TopLevelToken, remainTokens: TopLevelToken[]): import("../template").Tag | Output | HTML; + parseStream(tokens: TopLevelToken[]): ParseStream; + private _parseFileCached; + private _parseFile; +} diff --git a/node_modules/liquidjs/dist/parser/parser.spec.d.ts b/node_modules/liquidjs/dist/parser/parser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parser.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/parser/token-kind.d.ts b/node_modules/liquidjs/dist/parser/token-kind.d.ts new file mode 100644 index 0000000..47bec4f --- /dev/null +++ b/node_modules/liquidjs/dist/parser/token-kind.d.ts @@ -0,0 +1,16 @@ +export declare enum TokenKind { + Number = 1, + Literal = 2, + Tag = 4, + Output = 8, + HTML = 16, + Filter = 32, + Hash = 64, + PropertyAccess = 128, + Word = 256, + Range = 512, + Quoted = 1024, + Operator = 2048, + FilteredValue = 4096, + Delimited = 12 +} diff --git a/node_modules/liquidjs/dist/parser/tokenizer.d.ts b/node_modules/liquidjs/dist/parser/tokenizer.d.ts new file mode 100644 index 0000000..6070291 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/tokenizer.d.ts @@ -0,0 +1,63 @@ +import { FilteredValueToken, TagToken, HTMLToken, HashToken, QuotedToken, LiquidTagToken, OutputToken, ValueToken, Token, RangeToken, FilterToken, TopLevelToken, OperatorToken, LiteralToken, IdentifierToken, NumberToken } from '../tokens'; +import { Trie, TokenizationError } from '../util'; +import { Operators, Expression } from '../render'; +import { NormalizedFullOptions } from '../liquid-options'; +import { FilterArg } from './filter-arg'; +export declare class Tokenizer { + input: string; + file?: string | undefined; + p: number; + N: number; + private rawBeginAt; + private opTrie; + private literalTrie; + constructor(input: string, operators?: Operators, file?: string | undefined, range?: [number, number]); + readExpression(): Expression; + readExpressionTokens(): IterableIterator; + readOperator(): OperatorToken | undefined; + matchTrie(trie: Trie): number; + readFilteredValue(): FilteredValueToken; + readFilters(): FilterToken[]; + readFilter(): FilterToken | null; + readFilterArg(): FilterArg | undefined; + readTopLevelTokens(options?: NormalizedFullOptions): TopLevelToken[]; + readTopLevelToken(options: NormalizedFullOptions): TopLevelToken; + readHTMLToken(stopStrings: string[]): HTMLToken; + readTagToken(options: NormalizedFullOptions): TagToken; + readToDelimiter(delimiter: string, respectQuoted?: boolean): number; + readOutputToken(options?: NormalizedFullOptions): OutputToken; + readEndrawOrRawContent(options: NormalizedFullOptions): HTMLToken | TagToken; + readLiquidTagTokens(options?: NormalizedFullOptions): LiquidTagToken[]; + readLiquidTagToken(options: NormalizedFullOptions): LiquidTagToken | undefined; + error(msg: string, pos?: number): TokenizationError; + assert(pred: unknown, msg: string | (() => string), pos?: number): void; + snapshot(begin?: number): string; + /** + * @deprecated use #readIdentifier instead + */ + readWord(): IdentifierToken; + readIdentifier(): IdentifierToken; + readNonEmptyIdentifier(): IdentifierToken | undefined; + readTagName(): string; + readHashes(jekyllStyle?: boolean | string): HashToken[]; + readHash(jekyllStyle?: boolean | string): HashToken | undefined; + remaining(): string; + advance(step?: number): void; + end(): boolean; + read(): string; + readTo(end: string): number; + readValue(): ValueToken | undefined; + readScopeValue(): ValueToken | undefined; + private readProperties; + readNumber(): NumberToken | undefined; + readLiteral(): LiteralToken | undefined; + readRange(): RangeToken | undefined; + readValueOrThrow(): ValueToken; + readQuoted(): QuotedToken | undefined; + readFileNameTemplate(options: NormalizedFullOptions): IterableIterator; + match(word: string): boolean; + rmatch(pattern: string): boolean; + peekType(n?: number): number; + peek(n?: number): string; + skipBlank(): void; +} diff --git a/node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts b/node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts b/node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts new file mode 100644 index 0000000..a1cbdcd --- /dev/null +++ b/node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts @@ -0,0 +1,3 @@ +import { Token } from '../tokens'; +import { NormalizedFullOptions } from '../liquid-options'; +export declare function whiteSpaceCtrl(tokens: Token[], options: NormalizedFullOptions): void; diff --git a/node_modules/liquidjs/dist/render/boolean.d.ts b/node_modules/liquidjs/dist/render/boolean.d.ts new file mode 100644 index 0000000..6354075 --- /dev/null +++ b/node_modules/liquidjs/dist/render/boolean.d.ts @@ -0,0 +1,3 @@ +import { Context } from '../context/context'; +export declare function isTruthy(val: any, ctx: Context): boolean; +export declare function isFalsy(val: any, ctx: Context): boolean; diff --git a/node_modules/liquidjs/dist/render/boolean.spec.d.ts b/node_modules/liquidjs/dist/render/boolean.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/boolean.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/render/expression.d.ts b/node_modules/liquidjs/dist/render/expression.d.ts new file mode 100644 index 0000000..a46d819 --- /dev/null +++ b/node_modules/liquidjs/dist/render/expression.d.ts @@ -0,0 +1,10 @@ +import { QuotedToken, Token } from '../tokens'; +import type { Context } from '../context'; +export declare class Expression { + readonly postfix: Token[]; + constructor(tokens: IterableIterator); + evaluate(ctx: Context, lenient?: boolean): Generator; + valid(): boolean; +} +export declare function evalToken(token: Token | undefined, ctx: Context, lenient?: boolean): IterableIterator; +export declare function evalQuotedToken(token: QuotedToken): string; diff --git a/node_modules/liquidjs/dist/render/expression.spec.d.ts b/node_modules/liquidjs/dist/render/expression.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/expression.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/render/index.d.ts b/node_modules/liquidjs/dist/render/index.d.ts new file mode 100644 index 0000000..c0ed824 --- /dev/null +++ b/node_modules/liquidjs/dist/render/index.d.ts @@ -0,0 +1,4 @@ +export * from './render'; +export * from './expression'; +export * from './operator'; +export * from './boolean'; diff --git a/node_modules/liquidjs/dist/render/operator.d.ts b/node_modules/liquidjs/dist/render/operator.d.ts new file mode 100644 index 0000000..6a49663 --- /dev/null +++ b/node_modules/liquidjs/dist/render/operator.d.ts @@ -0,0 +1,8 @@ +import { Context } from '../context'; +export type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean; +export type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean; +export type OperatorHandler = UnaryOperatorHandler | BinaryOperatorHandler; +export type Operators = Record; +export declare const defaultOperators: Operators; +export declare function equals(lhs: any, rhs: any): boolean; +export declare function arrayIncludes(arr: any[], item: any): boolean; diff --git a/node_modules/liquidjs/dist/render/render.d.ts b/node_modules/liquidjs/dist/render/render.d.ts new file mode 100644 index 0000000..e724c60 --- /dev/null +++ b/node_modules/liquidjs/dist/render/render.d.ts @@ -0,0 +1,8 @@ +/// +import { Context } from '../context'; +import { Template } from '../template'; +import { Emitter } from '../emitters'; +export declare class Render { + renderTemplatesToNodeStream(templates: Template[], ctx: Context): NodeJS.ReadableStream; + renderTemplates(templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator; +} diff --git a/node_modules/liquidjs/dist/render/render.spec.d.ts b/node_modules/liquidjs/dist/render/render.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/render.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/render/string.d.ts b/node_modules/liquidjs/dist/render/string.d.ts new file mode 100644 index 0000000..ed1794b --- /dev/null +++ b/node_modules/liquidjs/dist/render/string.d.ts @@ -0,0 +1 @@ +export declare function parseStringLiteral(str: string): string; diff --git a/node_modules/liquidjs/dist/render/string.spec.d.ts b/node_modules/liquidjs/dist/render/string.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/string.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/tags/assign.d.ts b/node_modules/liquidjs/dist/tags/assign.d.ts new file mode 100644 index 0000000..c13f8a6 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/assign.d.ts @@ -0,0 +1,12 @@ +import { Liquid, TopLevelToken, TagToken, Context, Tag } from '..'; +import { Arguments } from '../template'; +import { IdentifierToken } from '../tokens'; +export default class extends Tag { + private key; + private value; + private identifier; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(ctx: Context): Generator; + arguments(): Arguments; + localScope(): Iterable; +} diff --git a/node_modules/liquidjs/dist/tags/block.d.ts b/node_modules/liquidjs/dist/tags/block.d.ts new file mode 100644 index 0000000..d8f732e --- /dev/null +++ b/node_modules/liquidjs/dist/tags/block.d.ts @@ -0,0 +1,11 @@ +import { Liquid, TagToken, TopLevelToken, Template, Context, Emitter, Tag } from '..'; +import { Parser } from '../parser'; +export default class extends Tag { + block: string; + templates: Template[]; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + private getBlockRender; + children(): Generator; + blockScope(): Iterable; +} diff --git a/node_modules/liquidjs/dist/tags/break.d.ts b/node_modules/liquidjs/dist/tags/break.d.ts new file mode 100644 index 0000000..f3d4225 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/break.d.ts @@ -0,0 +1,4 @@ +import { Context, Emitter, Tag } from '..'; +export default class extends Tag { + render(ctx: Context, _emitter: Emitter): void; +} diff --git a/node_modules/liquidjs/dist/tags/capture.d.ts b/node_modules/liquidjs/dist/tags/capture.d.ts new file mode 100644 index 0000000..fe4b32c --- /dev/null +++ b/node_modules/liquidjs/dist/tags/capture.d.ts @@ -0,0 +1,13 @@ +import { Liquid, Tag, Template, Context, TagToken, TopLevelToken } from '..'; +import { Parser } from '../parser'; +import { IdentifierToken, QuotedToken } from '../tokens'; +export default class extends Tag { + identifier: IdentifierToken | QuotedToken; + variable: string; + templates: Template[]; + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + private readVariable; + render(ctx: Context): Generator; + children(): Generator; + localScope(): Iterable; +} diff --git a/node_modules/liquidjs/dist/tags/case.d.ts b/node_modules/liquidjs/dist/tags/case.d.ts new file mode 100644 index 0000000..7daf6f7 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/case.d.ts @@ -0,0 +1,15 @@ +import { ValueToken, Liquid, Value, Emitter, TagToken, TopLevelToken, Context, Template, Tag } from '..'; +import { Parser } from '../parser'; +import { Arguments } from '../template'; +export default class extends Tag { + value: Value; + branches: { + values: ValueToken[]; + templates: Template[]; + }[]; + elseTemplates: Template[]; + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + arguments(): Arguments; + children(): Generator; +} diff --git a/node_modules/liquidjs/dist/tags/comment.d.ts b/node_modules/liquidjs/dist/tags/comment.d.ts new file mode 100644 index 0000000..2c0f4b9 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/comment.d.ts @@ -0,0 +1,5 @@ +import { Liquid, TopLevelToken, TagToken, Tag } from '..'; +export default class extends Tag { + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(): void; +} diff --git a/node_modules/liquidjs/dist/tags/continue.d.ts b/node_modules/liquidjs/dist/tags/continue.d.ts new file mode 100644 index 0000000..ab3892b --- /dev/null +++ b/node_modules/liquidjs/dist/tags/continue.d.ts @@ -0,0 +1,4 @@ +import { Tag, Emitter, Context } from '..'; +export default class extends Tag { + render(ctx: Context, _emitter: Emitter): void; +} diff --git a/node_modules/liquidjs/dist/tags/cycle.d.ts b/node_modules/liquidjs/dist/tags/cycle.d.ts new file mode 100644 index 0000000..442c445 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/cycle.d.ts @@ -0,0 +1,9 @@ +import { TopLevelToken, Liquid, Emitter, TagToken, Context, Tag } from '..'; +import { Arguments } from '../template'; +export default class extends Tag { + private candidates; + private group?; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(ctx: Context, emitter: Emitter): Generator; + arguments(): Arguments; +} diff --git a/node_modules/liquidjs/dist/tags/decrement.d.ts b/node_modules/liquidjs/dist/tags/decrement.d.ts new file mode 100644 index 0000000..2aa08fb --- /dev/null +++ b/node_modules/liquidjs/dist/tags/decrement.d.ts @@ -0,0 +1,9 @@ +import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'; +import { IdentifierToken } from '../tokens'; +export default class extends Tag { + private identifier; + private variable; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(context: Context, emitter: Emitter): void; + localScope(): Iterable; +} diff --git a/node_modules/liquidjs/dist/tags/echo.d.ts b/node_modules/liquidjs/dist/tags/echo.d.ts new file mode 100644 index 0000000..292da18 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/echo.d.ts @@ -0,0 +1,8 @@ +import { Liquid, TopLevelToken, Emitter, TagToken, Context, Tag } from '..'; +import { Arguments } from '../template'; +export default class extends Tag { + private value?; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(ctx: Context, emitter: Emitter): Generator; + arguments(): Arguments; +} diff --git a/node_modules/liquidjs/dist/tags/for.d.ts b/node_modules/liquidjs/dist/tags/for.d.ts new file mode 100644 index 0000000..1f62a17 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/for.d.ts @@ -0,0 +1,15 @@ +import { Hash, ValueToken, Liquid, Tag, Emitter, TagToken, TopLevelToken, Context, Template } from '..'; +import { Parser } from '../parser'; +import { Arguments } from '../template'; +export default class extends Tag { + variable: string; + collection: ValueToken; + hash: Hash; + templates: Template[]; + elseTemplates: Template[]; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(): Generator; + arguments(): Arguments; + blockScope(): Iterable; +} diff --git a/node_modules/liquidjs/dist/tags/if.d.ts b/node_modules/liquidjs/dist/tags/if.d.ts new file mode 100644 index 0000000..a82cf28 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/if.d.ts @@ -0,0 +1,14 @@ +import { Liquid, Tag, Value, Emitter, TagToken, TopLevelToken, Context, Template } from '..'; +import { Parser } from '../parser'; +import { Arguments } from '../template'; +export default class extends Tag { + branches: { + value: Value; + templates: Template[]; + }[]; + elseTemplates: Template[] | undefined; + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(): Generator; + arguments(): Arguments; +} diff --git a/node_modules/liquidjs/dist/tags/include.d.ts b/node_modules/liquidjs/dist/tags/include.d.ts new file mode 100644 index 0000000..e073faa --- /dev/null +++ b/node_modules/liquidjs/dist/tags/include.d.ts @@ -0,0 +1,12 @@ +import { Template, TopLevelToken, Liquid, Tag, Emitter, TagToken, Context } from '..'; +import { Parser } from '../parser'; +import { Arguments, PartialScope } from '../template'; +export default class extends Tag { + private withVar?; + private hash; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(partials: boolean, sync: boolean): Generator; + partialScope(): PartialScope | undefined; + arguments(): Arguments; +} diff --git a/node_modules/liquidjs/dist/tags/increment.d.ts b/node_modules/liquidjs/dist/tags/increment.d.ts new file mode 100644 index 0000000..2aa08fb --- /dev/null +++ b/node_modules/liquidjs/dist/tags/increment.d.ts @@ -0,0 +1,9 @@ +import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'; +import { IdentifierToken } from '../tokens'; +export default class extends Tag { + private identifier; + private variable; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(context: Context, emitter: Emitter): void; + localScope(): Iterable; +} diff --git a/node_modules/liquidjs/dist/tags/index.d.ts b/node_modules/liquidjs/dist/tags/index.d.ts new file mode 100644 index 0000000..37852f9 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/index.d.ts @@ -0,0 +1,24 @@ +import AssignTag from './assign'; +import ForTag from './for'; +import CaptureTag from './capture'; +import CaseTag from './case'; +import CommentTag from './comment'; +import IncludeTag from './include'; +import RenderTag from './render'; +import DecrementTag from './decrement'; +import CycleTag from './cycle'; +import IfTag from './if'; +import IncrementTag from './increment'; +import LayoutTag from './layout'; +import BlockTag from './block'; +import RawTag from './raw'; +import TablerowTag from './tablerow'; +import UnlessTag from './unless'; +import BreakTag from './break'; +import ContinueTag from './continue'; +import EchoTag from './echo'; +import LiquidTag from './liquid'; +import InlineCommentTag from './inline-comment'; +import type { TagClass } from '../template/tag'; +export declare const tags: Record; +export { AssignTag, ForTag, CaptureTag, CaseTag, CommentTag, IncludeTag, RenderTag, DecrementTag, IncrementTag, CycleTag, IfTag, LayoutTag, BlockTag, RawTag, TablerowTag, UnlessTag, BreakTag, ContinueTag, EchoTag, LiquidTag, InlineCommentTag }; diff --git a/node_modules/liquidjs/dist/tags/inline-comment.d.ts b/node_modules/liquidjs/dist/tags/inline-comment.d.ts new file mode 100644 index 0000000..98282ab --- /dev/null +++ b/node_modules/liquidjs/dist/tags/inline-comment.d.ts @@ -0,0 +1,5 @@ +import { TagToken, Liquid, TopLevelToken, Tag } from '..'; +export default class extends Tag { + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(): void; +} diff --git a/node_modules/liquidjs/dist/tags/layout.d.ts b/node_modules/liquidjs/dist/tags/layout.d.ts new file mode 100644 index 0000000..8b84c5a --- /dev/null +++ b/node_modules/liquidjs/dist/tags/layout.d.ts @@ -0,0 +1,14 @@ +import { Template, Liquid, Tag, Emitter, Hash, TagToken, TopLevelToken, Context } from '..'; +import { ParsedFileName } from './render'; +import { Parser } from '../parser'; +import { Arguments, PartialScope } from '../template'; +export default class extends Tag { + args: Hash; + templates: Template[]; + file?: ParsedFileName; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(partials: boolean): Generator; + arguments(): Arguments; + partialScope(): PartialScope | undefined; +} diff --git a/node_modules/liquidjs/dist/tags/liquid.d.ts b/node_modules/liquidjs/dist/tags/liquid.d.ts new file mode 100644 index 0000000..59540be --- /dev/null +++ b/node_modules/liquidjs/dist/tags/liquid.d.ts @@ -0,0 +1,8 @@ +import { Template, Emitter, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'; +import { Parser } from '../parser'; +export default class extends Tag { + templates: Template[]; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(): Generator; +} diff --git a/node_modules/liquidjs/dist/tags/raw.d.ts b/node_modules/liquidjs/dist/tags/raw.d.ts new file mode 100644 index 0000000..26e9e68 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/raw.d.ts @@ -0,0 +1,6 @@ +import { Liquid, TagToken, TopLevelToken, Tag } from '..'; +export default class extends Tag { + private tokens; + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + render(): string; +} diff --git a/node_modules/liquidjs/dist/tags/render.d.ts b/node_modules/liquidjs/dist/tags/render.d.ts new file mode 100644 index 0000000..6b054ae --- /dev/null +++ b/node_modules/liquidjs/dist/tags/render.d.ts @@ -0,0 +1,22 @@ +import { TopLevelToken, Liquid, Token, Template, Tokenizer, Emitter, TagToken, Context, Tag } from '..'; +import { Parser } from '../parser'; +import { Arguments, PartialScope } from '../template'; +export type ParsedFileName = Template[] | Token | string | undefined; +export default class extends Tag { + private file; + private currentFile?; + private hash; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(partials: boolean, sync: boolean): Generator; + partialScope(): PartialScope | undefined; + arguments(): Arguments; +} +/** + * @return null for "none", + * @return Template[] for quoted with tags and/or filters + * @return Token for expression (not quoted) + * @throws TypeError if cannot read next token + */ +export declare function parseFilePath(tokenizer: Tokenizer, liquid: Liquid, parser: Parser): ParsedFileName; +export declare function renderFilePath(file: ParsedFileName, ctx: Context, liquid: Liquid): IterableIterator; diff --git a/node_modules/liquidjs/dist/tags/tablerow.d.ts b/node_modules/liquidjs/dist/tags/tablerow.d.ts new file mode 100644 index 0000000..809a224 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/tablerow.d.ts @@ -0,0 +1,14 @@ +import { ValueToken, Liquid, Tag, Emitter, Hash, TagToken, TopLevelToken, Context, Template } from '..'; +import { Parser } from '../parser'; +import { Arguments } from '../template'; +export default class extends Tag { + variable: string; + args: Hash; + templates: Template[]; + collection: ValueToken; + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(): Generator; + arguments(): Arguments; + blockScope(): string[]; +} diff --git a/node_modules/liquidjs/dist/tags/unless.d.ts b/node_modules/liquidjs/dist/tags/unless.d.ts new file mode 100644 index 0000000..fd69953 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/unless.d.ts @@ -0,0 +1,15 @@ +import { Liquid, Tag, Value, TopLevelToken, Template, Emitter, Context, TagToken } from '..'; +import { Parser } from '../parser'; +import { Arguments } from '../template'; +export default class extends Tag { + branches: { + value: Value; + test: (val: any, ctx: Context) => boolean; + templates: Template[]; + }[]; + elseTemplates: Template[]; + constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser); + render(ctx: Context, emitter: Emitter): Generator; + children(): Generator; + arguments(): Arguments; +} diff --git a/node_modules/liquidjs/dist/template/analysis.d.ts b/node_modules/liquidjs/dist/template/analysis.d.ts new file mode 100644 index 0000000..4a0d647 --- /dev/null +++ b/node_modules/liquidjs/dist/template/analysis.d.ts @@ -0,0 +1,85 @@ +import { Template } from '.'; +/** + * Row, column and file name where a variable was found. + */ +export interface VariableLocation { + row: number; + col: number; + file?: string; +} +/** + * A variable's segments as an array, possibly with nested arrays of segments. + */ +export type SegmentArray = Array; +/** + * A variable's segments and location, which can be coerced to a string. + */ +export declare class Variable { + readonly segments: Array; + readonly location: VariableLocation; + constructor(segments: Array, location: VariableLocation); + toString(): string; + /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */ + toArray(): SegmentArray; +} +/** + * Property names and array indexes that make up a path to a variable. + */ +export type VariableSegments = Array; +/** + * A mapping of variable names to an array of locations at which the variable was found. + */ +export type Variables = { + [key: string]: Variable[]; +}; +/** + * Group variables by the string representation of their root segment. + */ +export declare class VariableMap { + private map; + constructor(); + get(key: Variable): Variable[]; + has(key: Variable): boolean; + push(variable: Variable): void; + asObject(): Variables; +} +/** + * The result of calling `analyze()` or `analyzeSync()`. + */ +export interface StaticAnalysis { + /** + * All variables, whether they are in scope or not. Including references to names + * such as `forloop` from the `for` tag. + */ + variables: Variables; + /** + * Variables that are not in scope. These could be a "global" variables that are + * expected to be provided by the application developer, or possible mistakes + * from the template author. + * + * If a variable is referenced before and after assignment, you should expect + * that variable to be included in `globals`, `variables` and `locals`, each with + * a different location. + */ + globals: Variables; + /** + * Template variables that are added to the template local scope using tags like + * `assign`, `capture` or `increment`. + */ + locals: Variables; +} +export interface StaticAnalysisOptions { + /** + * When `true` (the default), try to load partial templates and analyze them too. + */ + partials?: boolean; +} +export declare const defaultStaticAnalysisOptions: StaticAnalysisOptions; +/** + * Statically analyze a template and report variable usage. + */ +export declare function analyze(template: Template[], options?: StaticAnalysisOptions): Promise; +/** + * Statically analyze a template and report variable usage. + */ +export declare function analyzeSync(template: Template[], options?: StaticAnalysisOptions): StaticAnalysis; diff --git a/node_modules/liquidjs/dist/template/analysis.spec.d.ts b/node_modules/liquidjs/dist/template/analysis.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/analysis.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/template/filter-impl-options.d.ts b/node_modules/liquidjs/dist/template/filter-impl-options.d.ts new file mode 100644 index 0000000..fa303b0 --- /dev/null +++ b/node_modules/liquidjs/dist/template/filter-impl-options.d.ts @@ -0,0 +1,14 @@ +import type { Context } from '../context'; +import type { Liquid } from '../liquid'; +import type { FilterToken } from '../tokens'; +export interface FilterImpl { + context: Context; + token: FilterToken; + liquid: Liquid; +} +export type FilterHandler = (this: FilterImpl, value: any, ...args: any[]) => any; +export interface FilterOptions { + handler: FilterHandler; + raw: boolean; +} +export type FilterImplOptions = FilterHandler | FilterOptions; diff --git a/node_modules/liquidjs/dist/template/filter.d.ts b/node_modules/liquidjs/dist/template/filter.d.ts new file mode 100644 index 0000000..987abd4 --- /dev/null +++ b/node_modules/liquidjs/dist/template/filter.d.ts @@ -0,0 +1,15 @@ +import { Context } from '../context'; +import { FilterImplOptions } from './filter-impl-options'; +import { FilterArg } from '../parser/filter-arg'; +import { Liquid } from '../liquid'; +import { FilterToken } from '../tokens'; +export declare class Filter { + name: string; + args: FilterArg[]; + readonly raw: boolean; + private handler; + private liquid; + private token; + constructor(token: FilterToken, options: FilterImplOptions | undefined, liquid: Liquid); + render(value: any, context: Context): IterableIterator; +} diff --git a/node_modules/liquidjs/dist/template/filter.spec.d.ts b/node_modules/liquidjs/dist/template/filter.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/filter.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/template/hash.d.ts b/node_modules/liquidjs/dist/template/hash.d.ts new file mode 100644 index 0000000..b50e404 --- /dev/null +++ b/node_modules/liquidjs/dist/template/hash.d.ts @@ -0,0 +1,18 @@ +import { Context } from '../context/context'; +import { Tokenizer } from '../parser/tokenizer'; +import { Token } from '../tokens/token'; +type HashValueTokens = Record; +/** + * Key-Value Pairs Representing Tag Arguments + * Example: + * For the markup `, foo:'bar', coo:2 reversed %}`, + * hash['foo'] === 'bar' + * hash['coo'] === 2 + * hash['reversed'] === undefined + */ +export declare class Hash { + hash: HashValueTokens; + constructor(input: string | Tokenizer, jekyllStyle?: boolean | string); + render(ctx: Context): Generator, unknown>; +} +export {}; diff --git a/node_modules/liquidjs/dist/template/hash.spec.d.ts b/node_modules/liquidjs/dist/template/hash.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/hash.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/template/html.d.ts b/node_modules/liquidjs/dist/template/html.d.ts new file mode 100644 index 0000000..8b8136d --- /dev/null +++ b/node_modules/liquidjs/dist/template/html.d.ts @@ -0,0 +1,9 @@ +import { TemplateImpl, Template } from '../template'; +import { HTMLToken } from '../tokens'; +import { Context } from '../context'; +import { Emitter } from '../emitters'; +export declare class HTML extends TemplateImpl implements Template { + private str; + constructor(token: HTMLToken); + render(ctx: Context, emitter: Emitter): IterableIterator; +} diff --git a/node_modules/liquidjs/dist/template/index.d.ts b/node_modules/liquidjs/dist/template/index.d.ts new file mode 100644 index 0000000..0c45314 --- /dev/null +++ b/node_modules/liquidjs/dist/template/index.d.ts @@ -0,0 +1,11 @@ +export * from './template'; +export * from './template-impl'; +export * from './tag'; +export * from './tag-options-adapter'; +export * from './filter'; +export * from './filter-impl-options'; +export * from './hash'; +export * from './value'; +export * from './output'; +export * from './html'; +export * from './analysis'; diff --git a/node_modules/liquidjs/dist/template/output.d.ts b/node_modules/liquidjs/dist/template/output.d.ts new file mode 100644 index 0000000..9191ad5 --- /dev/null +++ b/node_modules/liquidjs/dist/template/output.d.ts @@ -0,0 +1,12 @@ +import { Value } from './value'; +import { Arguments, Template, TemplateImpl } from '../template'; +import { Context } from '../context/context'; +import { Emitter } from '../emitters/emitter'; +import { OutputToken } from '../tokens/output-token'; +import { Liquid } from '../liquid'; +export declare class Output extends TemplateImpl implements Template { + value: Value; + constructor(token: OutputToken, liquid: Liquid); + render(ctx: Context, emitter: Emitter): IterableIterator; + arguments(): Arguments; +} diff --git a/node_modules/liquidjs/dist/template/output.spec.d.ts b/node_modules/liquidjs/dist/template/output.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/output.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/template/tag-options-adapter.d.ts b/node_modules/liquidjs/dist/template/tag-options-adapter.d.ts new file mode 100644 index 0000000..e4f85e4 --- /dev/null +++ b/node_modules/liquidjs/dist/template/tag-options-adapter.d.ts @@ -0,0 +1,10 @@ +import { Tag, TagClass, TagRenderReturn } from './tag'; +import { TagToken, TopLevelToken } from '../tokens'; +import { Emitter } from '../emitters'; +import { Context } from '../context'; +export interface TagImplOptions { + [key: string]: any; + parse?: (this: Tag & TagImplOptions, token: TagToken, remainingTokens: TopLevelToken[]) => void; + render: (this: Tag & TagImplOptions, ctx: Context, emitter: Emitter, hash: Record) => TagRenderReturn; +} +export declare function createTagClass(options: TagImplOptions): TagClass; diff --git a/node_modules/liquidjs/dist/template/tag.d.ts b/node_modules/liquidjs/dist/template/tag.d.ts new file mode 100644 index 0000000..b33245f --- /dev/null +++ b/node_modules/liquidjs/dist/template/tag.d.ts @@ -0,0 +1,18 @@ +import { TemplateImpl } from './template-impl'; +import type { Emitter } from '../emitters/emitter'; +import type { Parser, Tokenizer } from '../parser'; +import type { Context } from '../context/context'; +import type { TopLevelToken, TagToken } from '../tokens'; +import type { Template } from './template'; +import type { Liquid } from '../liquid'; +export type TagRenderReturn = Generator | Promise | unknown; +export declare abstract class Tag extends TemplateImpl implements Template { + name: string; + liquid: Liquid; + protected tokenizer: Tokenizer; + constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid); + abstract render(ctx: Context, emitter: Emitter): TagRenderReturn; +} +export interface TagClass { + new (token: TagToken, tokens: TopLevelToken[], liquid: Liquid, parser: Parser): Tag; +} diff --git a/node_modules/liquidjs/dist/template/template-impl.d.ts b/node_modules/liquidjs/dist/template/template-impl.d.ts new file mode 100644 index 0000000..99edd24 --- /dev/null +++ b/node_modules/liquidjs/dist/template/template-impl.d.ts @@ -0,0 +1,4 @@ +export declare abstract class TemplateImpl { + token: T; + constructor(token: T); +} diff --git a/node_modules/liquidjs/dist/template/template.d.ts b/node_modules/liquidjs/dist/template/template.d.ts new file mode 100644 index 0000000..a1fba7d --- /dev/null +++ b/node_modules/liquidjs/dist/template/template.d.ts @@ -0,0 +1,36 @@ +import { Context } from '../context/context'; +import { Token } from '../tokens/token'; +import { Emitter } from '../emitters/emitter'; +import { IdentifierToken, QuotedToken, ValueToken } from '../tokens'; +import { Value } from './value'; +export type Argument = Value | ValueToken; +export type Arguments = Iterable; +/** Scope information used when analyzing partial templates. */ +export interface PartialScope { + /** + * The name of the partial template. We need this to make sure we only analyze + * each template once. + * */ + name: string; + /** + * If `true`, names in `scope` will be added to a new, isolated scope before + * analyzing any child templates, without access to the parent template's scope. + */ + isolated: boolean; + /** + * A list of names that will be in scope for the child template. + * + * If an item is a [string, Argument] tuple, the string is considered an alias + * for the argument. + */ + scope: Iterable; +} +export interface Template { + token: Token; + render(ctx: Context, emitter: Emitter): any; + children?(partials: boolean, sync: boolean): Generator; + arguments?(): Arguments; + blockScope?(): Iterable; + localScope?(): Iterable; + partialScope?(): PartialScope | undefined; +} diff --git a/node_modules/liquidjs/dist/template/value.d.ts b/node_modules/liquidjs/dist/template/value.d.ts new file mode 100644 index 0000000..05e2ff9 --- /dev/null +++ b/node_modules/liquidjs/dist/template/value.d.ts @@ -0,0 +1,15 @@ +import { Filter } from './filter'; +import { Expression } from '../render'; +import type { FilteredValueToken } from '../tokens'; +import type { Liquid } from '../liquid'; +import type { Context } from '../context'; +export declare class Value { + readonly filters: Filter[]; + readonly initial: Expression; + /** + * @param str the value to be valuated, eg.: "foobar" | truncate: 3 + */ + constructor(input: string | FilteredValueToken, liquid: Liquid); + value(ctx: Context, lenient?: boolean): Generator; + private getFilter; +} diff --git a/node_modules/liquidjs/dist/template/value.spec.d.ts b/node_modules/liquidjs/dist/template/value.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/value.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/tokens/delimited-token.d.ts b/node_modules/liquidjs/dist/tokens/delimited-token.d.ts new file mode 100644 index 0000000..523bda2 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/delimited-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token'; +import { TokenKind } from '../parser'; +export declare abstract class DelimitedToken extends Token { + trimLeft: boolean; + trimRight: boolean; + contentRange: [number, number]; + constructor(kind: TokenKind, [contentBegin, contentEnd]: [number, number], input: string, begin: number, end: number, trimLeft: boolean, trimRight: boolean, file?: string); + get content(): string; +} diff --git a/node_modules/liquidjs/dist/tokens/filter-token.d.ts b/node_modules/liquidjs/dist/tokens/filter-token.d.ts new file mode 100644 index 0000000..f298cc1 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/filter-token.d.ts @@ -0,0 +1,7 @@ +import { Token } from './token'; +import { FilterArg } from '../parser/filter-arg'; +export declare class FilterToken extends Token { + name: string; + args: FilterArg[]; + constructor(name: string, args: FilterArg[], input: string, begin: number, end: number, file?: string); +} diff --git a/node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts b/node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts new file mode 100644 index 0000000..a535051 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts @@ -0,0 +1,17 @@ +import { Token } from './token'; +import { FilterToken } from './filter-token'; +import { Expression } from '../render'; +/** + * value expression with optional filters + * e.g. + * {% assign foo="bar" | append: "coo" %} + */ +export declare class FilteredValueToken extends Token { + initial: Expression; + filters: FilterToken[]; + input: string; + begin: number; + end: number; + file?: string | undefined; + constructor(initial: Expression, filters: FilterToken[], input: string, begin: number, end: number, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/hash-token.d.ts b/node_modules/liquidjs/dist/tokens/hash-token.d.ts new file mode 100644 index 0000000..68d0511 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/hash-token.d.ts @@ -0,0 +1,12 @@ +import { Token } from './token'; +import { ValueToken } from './value-token'; +import { IdentifierToken } from './identifier-token'; +export declare class HashToken extends Token { + input: string; + begin: number; + end: number; + name: IdentifierToken; + value?: ValueToken | undefined; + file?: string | undefined; + constructor(input: string, begin: number, end: number, name: IdentifierToken, value?: ValueToken | undefined, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/html-token.d.ts b/node_modules/liquidjs/dist/tokens/html-token.d.ts new file mode 100644 index 0000000..298a200 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/html-token.d.ts @@ -0,0 +1,11 @@ +import { Token } from './token'; +export declare class HTMLToken extends Token { + input: string; + begin: number; + end: number; + file?: string | undefined; + trimLeft: number; + trimRight: number; + constructor(input: string, begin: number, end: number, file?: string | undefined); + getContent(): string; +} diff --git a/node_modules/liquidjs/dist/tokens/identifier-token.d.ts b/node_modules/liquidjs/dist/tokens/identifier-token.d.ts new file mode 100644 index 0000000..e40ebf3 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/identifier-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token'; +export declare class IdentifierToken extends Token { + input: string; + begin: number; + end: number; + file?: string | undefined; + content: string; + constructor(input: string, begin: number, end: number, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/index.d.ts b/node_modules/liquidjs/dist/tokens/index.d.ts new file mode 100644 index 0000000..f61c8c0 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/index.d.ts @@ -0,0 +1,18 @@ +export * from './top-level-token'; +export * from './tag-token'; +export * from './output-token'; +export * from './html-token'; +export * from './number-token'; +export * from './identifier-token'; +export * from './literal-token'; +export * from './operator-token'; +export * from './property-access-token'; +export * from './filter-token'; +export * from './hash-token'; +export * from './quoted-token'; +export * from './token'; +export * from './range-token'; +export * from './value-token'; +export * from './liquid-tag-token'; +export * from './delimited-token'; +export * from './filtered-value-token'; diff --git a/node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts b/node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts new file mode 100644 index 0000000..c6e29a8 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts @@ -0,0 +1,12 @@ +import { DelimitedToken } from './delimited-token'; +import { NormalizedFullOptions } from '../liquid-options'; +import { Tokenizer } from '../parser'; +/** + * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}` + */ +export declare class LiquidTagToken extends DelimitedToken { + name: string; + tokenizer: Tokenizer; + constructor(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: string); + get args(): string; +} diff --git a/node_modules/liquidjs/dist/tokens/literal-token.d.ts b/node_modules/liquidjs/dist/tokens/literal-token.d.ts new file mode 100644 index 0000000..739076c --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/literal-token.d.ts @@ -0,0 +1,11 @@ +import { Token } from './token'; +import { LiteralValue } from '../util'; +export declare class LiteralToken extends Token { + input: string; + begin: number; + end: number; + file?: string | undefined; + content: LiteralValue; + literal: string; + constructor(input: string, begin: number, end: number, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/number-token.d.ts b/node_modules/liquidjs/dist/tokens/number-token.d.ts new file mode 100644 index 0000000..2faf6f1 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/number-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token'; +export declare class NumberToken extends Token { + input: string; + begin: number; + end: number; + file?: string | undefined; + content: number; + constructor(input: string, begin: number, end: number, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/operator-token.d.ts b/node_modules/liquidjs/dist/tokens/operator-token.d.ts new file mode 100644 index 0000000..dac5180 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/operator-token.d.ts @@ -0,0 +1,38 @@ +import { Token } from './token'; +export declare const enum OperatorType { + Binary = 0, + Unary = 1 +} +export declare const operatorPrecedences: { + '==': number; + '!=': number; + '>': number; + '<': number; + '>=': number; + '<=': number; + contains: number; + not: number; + and: number; + or: number; +}; +export declare const operatorTypes: { + '==': OperatorType; + '!=': OperatorType; + '>': OperatorType; + '<': OperatorType; + '>=': OperatorType; + '<=': OperatorType; + contains: OperatorType; + not: OperatorType; + and: OperatorType; + or: OperatorType; +}; +export declare class OperatorToken extends Token { + input: string; + begin: number; + end: number; + file?: string | undefined; + operator: string; + constructor(input: string, begin: number, end: number, file?: string | undefined); + getPrecedence(): any; +} diff --git a/node_modules/liquidjs/dist/tokens/output-token.d.ts b/node_modules/liquidjs/dist/tokens/output-token.d.ts new file mode 100644 index 0000000..33a7cb3 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/output-token.d.ts @@ -0,0 +1,5 @@ +import { DelimitedToken } from './delimited-token'; +import { NormalizedFullOptions } from '../liquid-options'; +export declare class OutputToken extends DelimitedToken { + constructor(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: string); +} diff --git a/node_modules/liquidjs/dist/tokens/property-access-token.d.ts b/node_modules/liquidjs/dist/tokens/property-access-token.d.ts new file mode 100644 index 0000000..1717801 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/property-access-token.d.ts @@ -0,0 +1,12 @@ +import { Token } from './token'; +import { LiteralToken } from './literal-token'; +import { ValueToken } from './value-token'; +import { IdentifierToken } from './identifier-token'; +import { NumberToken } from './number-token'; +import { RangeToken } from './range-token'; +import { QuotedToken } from './quoted-token'; +export declare class PropertyAccessToken extends Token { + variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined; + props: (ValueToken | IdentifierToken)[]; + constructor(variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined, props: (ValueToken | IdentifierToken)[], input: string, begin: number, end: number, file?: string); +} diff --git a/node_modules/liquidjs/dist/tokens/quoted-token.d.ts b/node_modules/liquidjs/dist/tokens/quoted-token.d.ts new file mode 100644 index 0000000..7de7f0b --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/quoted-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token'; +export declare class QuotedToken extends Token { + input: string; + begin: number; + end: number; + file?: string | undefined; + readonly content: string; + constructor(input: string, begin: number, end: number, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/range-token.d.ts b/node_modules/liquidjs/dist/tokens/range-token.d.ts new file mode 100644 index 0000000..d2a4c40 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/range-token.d.ts @@ -0,0 +1,11 @@ +import { Token } from './token'; +import { ValueToken } from './value-token'; +export declare class RangeToken extends Token { + input: string; + begin: number; + end: number; + lhs: ValueToken; + rhs: ValueToken; + file?: string | undefined; + constructor(input: string, begin: number, end: number, lhs: ValueToken, rhs: ValueToken, file?: string | undefined); +} diff --git a/node_modules/liquidjs/dist/tokens/tag-token.d.ts b/node_modules/liquidjs/dist/tokens/tag-token.d.ts new file mode 100644 index 0000000..e51fefd --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/tag-token.d.ts @@ -0,0 +1,9 @@ +import { DelimitedToken } from './delimited-token'; +import { Tokenizer } from '../parser'; +import type { NormalizedFullOptions } from '../liquid-options'; +export declare class TagToken extends DelimitedToken { + name: string; + tokenizer: Tokenizer; + readonly args: string; + constructor(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: string); +} diff --git a/node_modules/liquidjs/dist/tokens/token.d.ts b/node_modules/liquidjs/dist/tokens/token.d.ts new file mode 100644 index 0000000..b45a0c0 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/token.d.ts @@ -0,0 +1,12 @@ +import { TokenKind } from '../parser'; +export declare abstract class Token { + kind: TokenKind; + input: string; + begin: number; + end: number; + file?: string | undefined; + constructor(kind: TokenKind, input: string, begin: number, end: number, file?: string | undefined); + getText(): string; + getPosition(): number[]; + size(): number; +} diff --git a/node_modules/liquidjs/dist/tokens/top-level-token.d.ts b/node_modules/liquidjs/dist/tokens/top-level-token.d.ts new file mode 100644 index 0000000..830d452 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/top-level-token.d.ts @@ -0,0 +1,4 @@ +import type { TagToken } from './tag-token'; +import type { HTMLToken } from './html-token'; +import type { OutputToken } from './output-token'; +export type TopLevelToken = TagToken | OutputToken | HTMLToken; diff --git a/node_modules/liquidjs/dist/tokens/value-token.d.ts b/node_modules/liquidjs/dist/tokens/value-token.d.ts new file mode 100644 index 0000000..017bfc6 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/value-token.d.ts @@ -0,0 +1,6 @@ +import { RangeToken } from './range-token'; +import { LiteralToken } from './literal-token'; +import { NumberToken } from './number-token'; +import { QuotedToken } from './quoted-token'; +import { PropertyAccessToken } from './property-access-token'; +export type ValueToken = RangeToken | LiteralToken | QuotedToken | PropertyAccessToken | NumberToken; diff --git a/node_modules/liquidjs/dist/util/assert.d.ts b/node_modules/liquidjs/dist/util/assert.d.ts new file mode 100644 index 0000000..230729e --- /dev/null +++ b/node_modules/liquidjs/dist/util/assert.d.ts @@ -0,0 +1,2 @@ +export declare function assert(predicate: T | null | undefined, message?: string | (() => string)): void; +export declare function assertEmpty(predicate: T | null | undefined, message?: string): void; diff --git a/node_modules/liquidjs/dist/util/assert.spec.d.ts b/node_modules/liquidjs/dist/util/assert.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/assert.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/async.d.ts b/node_modules/liquidjs/dist/util/async.d.ts new file mode 100644 index 0000000..6200fcd --- /dev/null +++ b/node_modules/liquidjs/dist/util/async.d.ts @@ -0,0 +1,4 @@ +export type LiquidAsync any> = (sync: boolean, ...args: Parameters) => ReturnType | Promise>; +export declare function toLiquidAsync any>(asyncFn: (...args: Parameters) => Promise>, syncFn?: F): LiquidAsync; +export declare function toPromise(val: Generator | Promise | T): Promise; +export declare function toValueSync(val: Generator | T): T; diff --git a/node_modules/liquidjs/dist/util/async.spec.d.ts b/node_modules/liquidjs/dist/util/async.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/async.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/character.d.ts b/node_modules/liquidjs/dist/util/character.d.ts new file mode 100644 index 0000000..e41d432 --- /dev/null +++ b/node_modules/liquidjs/dist/util/character.d.ts @@ -0,0 +1,10 @@ +export declare const TYPES: number[]; +export declare const WORD = 1; +export declare const OPERATOR = 2; +export declare const BLANK = 4; +export declare const QUOTE = 8; +export declare const INLINE_BLANK = 16; +export declare const NUMBER = 32; +export declare const SIGN = 64; +export declare const PUNCTUATION = 128; +export declare function isWord(char: string): boolean; diff --git a/node_modules/liquidjs/dist/util/error.d.ts b/node_modules/liquidjs/dist/util/error.d.ts new file mode 100644 index 0000000..215005d --- /dev/null +++ b/node_modules/liquidjs/dist/util/error.d.ts @@ -0,0 +1,35 @@ +import { Token } from '../tokens/token'; +import { Template } from '../template/template'; +export declare abstract class LiquidError extends Error { + token: Token; + context: string; + originalError?: Error; + constructor(err: Error | string, token: Token); + protected update(): void; + static is(obj: unknown): obj is LiquidError; +} +export declare class TokenizationError extends LiquidError { + constructor(message: string, token: Token); +} +export declare class ParseError extends LiquidError { + constructor(err: Error, token: Token); +} +export declare class RenderError extends LiquidError { + constructor(err: Error, tpl: Template); + static is(obj: any): obj is RenderError; +} +export declare class LiquidErrors extends LiquidError { + errors: RenderError[]; + constructor(errors: RenderError[]); + static is(obj: any): obj is LiquidErrors; +} +export declare class UndefinedVariableError extends LiquidError { + constructor(err: Error, token: Token); +} +export declare class InternalUndefinedVariableError extends Error { + variableName: string; + constructor(variableName: string); +} +export declare class AssertionError extends Error { + constructor(message: string); +} diff --git a/node_modules/liquidjs/dist/util/error.spec.d.ts b/node_modules/liquidjs/dist/util/error.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/error.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/index.d.ts b/node_modules/liquidjs/dist/util/index.d.ts new file mode 100644 index 0000000..fa6a79c --- /dev/null +++ b/node_modules/liquidjs/dist/util/index.d.ts @@ -0,0 +1,12 @@ +export * from './error'; +export * from './character'; +export * from './assert'; +export * from './literal'; +export * from './underscore'; +export * from './operator-trie'; +export * from './type-guards'; +export * from './async'; +export * from './strftime'; +export * from './liquid-date'; +export * from './limiter'; +export * from './intl'; diff --git a/node_modules/liquidjs/dist/util/intl.d.ts b/node_modules/liquidjs/dist/util/intl.d.ts new file mode 100644 index 0000000..4037931 --- /dev/null +++ b/node_modules/liquidjs/dist/util/intl.d.ts @@ -0,0 +1,6 @@ +export declare function getDateTimeFormat(): { + (locales?: string | string[] | undefined, options?: Intl.DateTimeFormatOptions | undefined): Intl.DateTimeFormat; + new (locales?: string | string[] | undefined, options?: Intl.DateTimeFormatOptions | undefined): Intl.DateTimeFormat; + supportedLocalesOf(locales: string | string[], options?: Intl.DateTimeFormatOptions | undefined): string[]; + readonly prototype: Intl.DateTimeFormat; +} | undefined; diff --git a/node_modules/liquidjs/dist/util/limiter.d.ts b/node_modules/liquidjs/dist/util/limiter.d.ts new file mode 100644 index 0000000..75b025d --- /dev/null +++ b/node_modules/liquidjs/dist/util/limiter.d.ts @@ -0,0 +1,8 @@ +export declare class Limiter { + private message; + private base; + private limit; + constructor(resource: string, limit: number); + use(count: number): void; + check(count: number): void; +} diff --git a/node_modules/liquidjs/dist/util/liquid-date.d.ts b/node_modules/liquidjs/dist/util/liquid-date.d.ts new file mode 100644 index 0000000..88097e9 --- /dev/null +++ b/node_modules/liquidjs/dist/util/liquid-date.d.ts @@ -0,0 +1,52 @@ +/** + * A date implementation with timezone info, just like Ruby date + * + * Implementation: + * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods + * - rewrite getTimezoneOffset() to trick strftime + */ +export declare class LiquidDate { + private locale; + private timezoneOffset; + private timezoneName; + private date; + private displayDate; + private DateTimeFormat; + timezoneFixed: boolean; + constructor(init: string | number | Date, locale: string, timezone?: number | string); + getTime(): number; + getMilliseconds(): number; + getSeconds(): number; + getMinutes(): number; + getHours(): number; + getDay(): number; + getDate(): number; + getMonth(): number; + getFullYear(): number; + toLocaleString(locale?: string, init?: any): string; + toLocaleTimeString(locale?: string): string; + toLocaleDateString(locale?: string): string; + getTimezoneOffset(): number; + getTimeZoneName(): string | undefined; + getLongMonthName(): string; + getShortMonthName(): string; + getLongWeekdayName(): string; + getShortWeekdayName(): string; + valid(): boolean; + private format; + /** + * Create a Date object fixed to it's declared Timezone. Both + * - 2021-08-06T02:29:00.000Z and + * - 2021-08-06T02:29:00.000+08:00 + * will always be displayed as + * - 2021-08-06 02:29:00 + * regardless timezoneOffset in JavaScript realm + * + * The implementation hack: + * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`, + * we create a different Date to trick strftime, it's both simpler and more performant. + * Given that a template is expected to be parsed fewer times than rendered. + */ + static createDateFixedToTimezone(dateString: string, locale: string): LiquidDate; + private static getTimezoneOffset; +} diff --git a/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts b/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/literal.d.ts b/node_modules/liquidjs/dist/util/literal.d.ts new file mode 100644 index 0000000..bc1b406 --- /dev/null +++ b/node_modules/liquidjs/dist/util/literal.d.ts @@ -0,0 +1,11 @@ +import { BlankDrop, EmptyDrop, NullDrop } from '../drop'; +export declare const literalValues: { + true: boolean; + false: boolean; + nil: NullDrop; + null: NullDrop; + empty: EmptyDrop; + blank: BlankDrop; +}; +export type LiteralKey = keyof typeof literalValues; +export type LiteralValue = typeof literalValues[LiteralKey]; diff --git a/node_modules/liquidjs/dist/util/operator-trie.d.ts b/node_modules/liquidjs/dist/util/operator-trie.d.ts new file mode 100644 index 0000000..b21050e --- /dev/null +++ b/node_modules/liquidjs/dist/util/operator-trie.d.ts @@ -0,0 +1,14 @@ +interface TrieInput { + [key: string]: T; +} +interface TrieLeafNode { + data: T; + end: true; + needBoundary?: true; +} +export interface Trie { + [key: string]: Trie | TrieLeafNode; +} +export type TrieNode = Trie | TrieLeafNode; +export declare function createTrie(input: TrieInput): Trie; +export {}; diff --git a/node_modules/liquidjs/dist/util/performance.d.ts b/node_modules/liquidjs/dist/util/performance.d.ts new file mode 100644 index 0000000..4dca49a --- /dev/null +++ b/node_modules/liquidjs/dist/util/performance.d.ts @@ -0,0 +1,5 @@ +interface LiquidPerformance { + now: () => number; +} +export declare function getPerformance(): LiquidPerformance; +export {}; diff --git a/node_modules/liquidjs/dist/util/performance.spec.d.ts b/node_modules/liquidjs/dist/util/performance.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/performance.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/strftime.d.ts b/node_modules/liquidjs/dist/util/strftime.d.ts new file mode 100644 index 0000000..fc2e684 --- /dev/null +++ b/node_modules/liquidjs/dist/util/strftime.d.ts @@ -0,0 +1,3 @@ +import { LiquidDate } from './liquid-date'; +import type { Limiter } from './limiter'; +export declare function strftime(d: LiquidDate, formatStr: string, memoryLimit?: Pick): string; diff --git a/node_modules/liquidjs/dist/util/strftime.spec.d.ts b/node_modules/liquidjs/dist/util/strftime.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/strftime.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/type-guards.d.ts b/node_modules/liquidjs/dist/util/type-guards.d.ts new file mode 100644 index 0000000..b6ea5e7 --- /dev/null +++ b/node_modules/liquidjs/dist/util/type-guards.d.ts @@ -0,0 +1,13 @@ +import { RangeToken, NumberToken, QuotedToken, LiteralToken, PropertyAccessToken, OutputToken, HTMLToken, TagToken, IdentifierToken, DelimitedToken, OperatorToken, ValueToken } from '../tokens'; +export declare function isDelimitedToken(val: any): val is DelimitedToken; +export declare function isOperatorToken(val: any): val is OperatorToken; +export declare function isHTMLToken(val: any): val is HTMLToken; +export declare function isOutputToken(val: any): val is OutputToken; +export declare function isTagToken(val: any): val is TagToken; +export declare function isQuotedToken(val: any): val is QuotedToken; +export declare function isLiteralToken(val: any): val is LiteralToken; +export declare function isNumberToken(val: any): val is NumberToken; +export declare function isPropertyAccessToken(val: any): val is PropertyAccessToken; +export declare function isWordToken(val: any): val is IdentifierToken; +export declare function isRangeToken(val: any): val is RangeToken; +export declare function isValueToken(val: any): val is ValueToken; diff --git a/node_modules/liquidjs/dist/util/type-guards.spec.d.ts b/node_modules/liquidjs/dist/util/type-guards.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/type-guards.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/dist/util/underscore.d.ts b/node_modules/liquidjs/dist/util/underscore.d.ts new file mode 100644 index 0000000..0102429 --- /dev/null +++ b/node_modules/liquidjs/dist/util/underscore.d.ts @@ -0,0 +1,40 @@ +export declare const toString: () => string; +export declare const hasOwnProperty: (v: PropertyKey) => boolean; +export declare function isString(value: any): value is string; +export declare function isFunction(value: any): value is Function; +export declare function isPromise(val: any): val is Promise; +export declare function isIterator(val: any): val is IterableIterator; +export declare function promisify(fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise; +export declare function promisify(fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise; +export declare function stringify(value: any): string; +export declare function toEnumerable(val: any): T[]; +export declare function toArray(val: any): any[]; +export declare function toValue(value: any): any; +export declare function toNumber(value: any): number; +export declare function isNumber(value: any): value is number; +export declare function toLiquid(value: any): any; +export declare function isNil(value: any): boolean; +export declare function isUndefined(value: any): boolean; +export declare function isArray(value: any): value is any[]; +export declare function isArrayLike(value: any): value is any[]; +export declare function isIterable(value: any): value is Iterable; +export declare function forOwn(obj: Record | undefined, iteratee: ((val: T, key: string, obj: { + [key: string]: T; +}) => boolean | void)): Record; +export declare function last(arr: T[]): T; +export declare function last(arr: string): string; +export declare function isObject(value: any): value is object; +export declare function range(start: number, stop: number, step?: number): number[]; +export declare function padStart(str: any, length: number, ch?: string): any; +export declare function padEnd(str: any, length: number, ch?: string): any; +export declare function pad(str: any, length: number, ch: string, add: (str: string, ch: string) => string): any; +export declare function identify(val: T): T; +export declare function changeCase(str: string): string; +export declare function ellipsis(str: string, N: number): string; +export declare function orderedCompare(a: any, b: any): 0 | 1 | -1; +export declare function caseInsensitiveCompare(a: any, b: any): 0 | 1 | -1; +export declare function argumentsToValue any, T>(fn: F): (this: T, ...args: Parameters) => any; +export declare function argumentsToNumber any, T>(fn: F): (this: T, ...args: Parameters) => any; +export declare function escapeRegExp(text: string): string; +/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */ +export declare function strictUniq(array: Array): Generator; diff --git a/node_modules/liquidjs/dist/util/underscore.spec.d.ts b/node_modules/liquidjs/dist/util/underscore.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/underscore.spec.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/node_modules/liquidjs/package.json b/node_modules/liquidjs/package.json new file mode 100644 index 0000000..4e2e8b6 --- /dev/null +++ b/node_modules/liquidjs/package.json @@ -0,0 +1,175 @@ +{ + "name": "liquidjs", + "version": "10.27.0", + "sideEffects": false, + "description": "A simple, expressive and safe Shopify / Github Pages compatible template engine in pure JavaScript.", + "main": "dist/liquid.node.js", + "module": "dist/liquid.node.mjs", + "es2015": "dist/liquid.browser.mjs", + "browser": { + "./dist/liquid.node.js": "./dist/liquid.browser.umd.js", + "./dist/liquid.node.mjs": "./dist/liquid.browser.mjs" + }, + "types": "dist/index.d.ts", + "engines": { + "node": ">=16" + }, + "scripts": { + "lint": "eslint \"**/*.mjs\" \"**/*.ts\" .", + "check": "npm run build && npm run build:docs && npm test && npm run lint && npm run perf:diff", + "test": "jest", + "test:coverage": "jest --coverage src test/integration", + "test:e2e": "jest test/e2e", + "test:demo": "./test/demo/test.sh", + "perf:diff": "node bin/perf-diff.js", + "perf:engines": "cd benchmark && npm run engines", + "version": "npm run build && npm test", + "build": "rollup -c rollup.config.mjs", + "build:cjs": "BUNDLES=cjs rollup -c rollup.config.mjs", + "build:min": "BUNDLES=min rollup -c rollup.config.mjs", + "build:umd": "BUNDLES=umd rollup -c rollup.config.mjs", + "build:charmap": "./bin/character-gen.js > src/util/character.ts", + "build:docs": "run-s build:docs-liquid build:contributors build:apidoc build:changelog build:docs-hexo", + "build:docs-liquid": "cross-env BUNDLES=min rollup -c rollup.config.mjs && shx mkdir -p docs/public/js && shx cp dist/liquid.browser.min.js docs/public/js/", + "build:contributors": "node bin/build-contributors.js", + "build:apidoc": "shx rm -rf docs/source/api && typedoc --plugin typedoc-plugin-missing-exports ./src --gitRevision master --out docs/source/api", + "build:changelog": "node bin/build-changelog.js", + "build:docs-hexo": "cd docs && npm ci && npm run build && shx cp CNAME public/" + }, + "bin": { + "liquidjs": "./bin/liquid.js", + "liquid": "./bin/liquid.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/harttle/liquidjs.git" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + }, + "files": [ + "bin/liquid.js", + "dist", + "LICENSE", + "README.md" + ], + "keywords": [ + "liquid", + "template engine", + "express", + "jinja", + "shopify" + ], + "author": "Harttle", + "license": "MIT", + "bugs": { + "url": "https://github.com/harttle/liquidjs/issues" + }, + "homepage": "https://github.com/harttle/liquidjs#readme", + "devDependencies": { + "@commitlint/cli": "^12.1.4", + "@commitlint/config-conventional": "^8.2.0", + "@semantic-release/changelog": "^6.0.2", + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^13.1.5", + "@semantic-release/release-notes-generator": "^10.0.3", + "@types/benchmark": "^1.0.31", + "@types/express": "^4.17.2", + "@types/jest": "^29.4.0", + "@types/jsdom": "^12.2.2", + "@types/node": "^22.3.0", + "@types/sinon": "^10.0.13", + "@types/supertest": "^2.0.7", + "@typescript-eslint/eslint-plugin": "^5.6.0", + "@typescript-eslint/parser": "^5.6.0", + "all-contributors-cli": "^6.24.0", + "benchmark": "^2.1.4", + "coveralls": "^3.0.2", + "cross-env": "^5.2.0", + "eslint": "^7.32.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-mocha": "^5.3.0", + "eslint-plugin-node": "^8.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-standard": "^4.0.0", + "express": "^4.16.4", + "husky": "^4.2.5", + "jest": "^29.5.0", + "jsdom": "^16.5.0", + "npm-run-all2": "^8.0.4", + "rollup": "^1.26.3", + "rollup-plugin-replace": "^2.1.0", + "rollup-plugin-typescript2": "^0.31.1", + "rollup-plugin-uglify": "^6.0.4", + "rollup-plugin-version-injector": "^1.3.3", + "semantic-release": "^25.0.3", + "shx": "^0.4.0", + "sinon": "^15.0.2", + "supertest": "^3.4.2", + "ts-jest": "^29.0.5", + "tslib": "^2.3.1", + "typedoc": "^0.26.5", + "typedoc-plugin-missing-exports": "^3.0.0", + "typescript": "^4.5.3" + }, + "dependencies": { + "commander": "^10.0.0" + }, + "release": { + "branch": "master", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + "@semantic-release/npm", + [ + "@semantic-release/git", + { + "assets": [ + "package.json", + "package-lock.json", + "CHANGELOG.md" + ], + "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "dist/*.umd.js", + "label": "liquid.js" + }, + { + "path": "dist/*.min.js", + "label": "liquid.min.js" + }, + { + "path": "dist/*.min.js.map", + "label": "liquid.min.js.map" + } + ] + } + ] + ] + }, + "publishConfig": { + "provenance": true + }, + "nyc": { + "extension": [ + ".ts" + ] + }, + "husky": { + "hooks": { + "pre-commit": "npm run check", + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + } +} diff --git a/node_modules/list-to-array/.npmignore b/node_modules/list-to-array/.npmignore new file mode 100644 index 0000000..123ae94 --- /dev/null +++ b/node_modules/list-to-array/.npmignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules diff --git a/node_modules/list-to-array/LICENSE b/node_modules/list-to-array/LICENSE new file mode 100644 index 0000000..b9d8498 --- /dev/null +++ b/node_modules/list-to-array/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Jed Watson + +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/list-to-array/README.md b/node_modules/list-to-array/README.md new file mode 100644 index 0000000..2fec249 --- /dev/null +++ b/node_modules/list-to-array/README.md @@ -0,0 +1,52 @@ +# list-to-array + +Simple javascript lib for converting a [comma || space] delimited string to an array. + +Trims values so you can use human-friendly lists like `'one, two, three' => ['one','two','three']` + +If in array is provided, it is simply returned. If a falsy or non-string value is provided, an empty array is returned. + +Won't work with values that contain spaces. + +## Installation + +``` +npm install list-to-array +``` + +Works in node.js, iojs or bundle for the browser with browserify or webpack. + +## Usage + +``` +var listToArray = require('list-to-array'); + +console.log(listToArray('one, two, three')); + +// logs ['one','two','three'] +``` + +## License + +(The MIT License) + +Copyright (c) 2015 Jed Watson + +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/list-to-array/index.js b/node_modules/list-to-array/index.js new file mode 100644 index 0000000..78efcf9 --- /dev/null +++ b/node_modules/list-to-array/index.js @@ -0,0 +1,18 @@ +function truthy(val) { return val; } +function trim(str) { return str.trim(); } + +function listToArray (str, delimiter) { + if (Array.isArray(str)) { + return str; + } + if (!str || typeof str !== 'string') { + return []; + } + if (!delimiter) { + delimiter = ' '; + str = str.replace(/\,/g, ' '); + } + return str.split(delimiter).map(trim).filter(truthy); +} + +module.exports = listToArray; diff --git a/node_modules/list-to-array/package.json b/node_modules/list-to-array/package.json new file mode 100644 index 0000000..a6b8ed0 --- /dev/null +++ b/node_modules/list-to-array/package.json @@ -0,0 +1,32 @@ +{ + "name": "list-to-array", + "version": "1.1.0", + "description": "Simple javascript lib for converting a [comma || space] delimited string to an array", + "main": "index.js", + "author": "Jed Watson", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/JedWatson/list-to-array.git" + }, + "bugs": { + "url": "https://github.com/JedWatson/list-to-array/issues" + }, + "homepage": "https://github.com/JedWatson/list-to-array", + "scripts": { + "test": "mocha tests.js" + }, + "keywords": [ + "array", + "list", + "string", + "manipulation", + "conversion", + "function", + "library" + ], + "devDependencies": { + "mocha": "^2.2.5", + "must": "^0.12.0" + } +} diff --git a/node_modules/list-to-array/tests.js b/node_modules/list-to-array/tests.js new file mode 100644 index 0000000..456d275 --- /dev/null +++ b/node_modules/list-to-array/tests.js @@ -0,0 +1,29 @@ +var demand = require('must'); +var listToArray = require('./index'); + +describe('listToArray', function() { + it('splits a comma-delimited list into an array', function() { + listToArray('one,two,three').must.eql(['one', 'two', 'three']); + }); + it('splits a space-delimited list into an array', function() { + listToArray('one two three').must.eql(['one', 'two', 'three']); + }); + it('trims whitespace from values', function() { + listToArray('one, two, three').must.eql(['one', 'two', 'three']); + }); + it('splits a list into an array', function() { + listToArray('one,two,three').must.eql(['one', 'two', 'three']); + }); + it('returns a empty array w/ no arguments', function() { + listToArray().must.eql([]); + }); + it('returns a empty array for a blank string', function() { + listToArray('').must.eql([]); + }); + it('returns a empty array when only given whitespace', function() { + listToArray(' ').must.eql([]); + }); + it('returns a empty array when only given whitespace and commas', function() { + listToArray(' , ').must.eql([]); + }); +}); diff --git a/node_modules/luxon/LICENSE.md b/node_modules/luxon/LICENSE.md new file mode 100644 index 0000000..2d560a6 --- /dev/null +++ b/node_modules/luxon/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2019 JS Foundation and other contributors + +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/luxon/README.md b/node_modules/luxon/README.md new file mode 100644 index 0000000..3fcacd7 --- /dev/null +++ b/node_modules/luxon/README.md @@ -0,0 +1,55 @@ +# Luxon + +[![MIT License][license-image]][license] [![Build Status][github-action-image]][github-action-url] [![NPM version][npm-version-image]][npm-url] [![Coverage Status][test-coverage-image]][test-coverage-url] [![PRs welcome][contributing-image]][contributing-url] + +Luxon is a library for working with dates and times in JavaScript. + +```js +DateTime.now().setZone("America/New_York").minus({ weeks: 1 }).endOf("day").toISO(); +``` + +## Upgrading to 3.0 + +[Guide](https://moment.github.io/luxon/#upgrading) + +## Features + * DateTime, Duration, and Interval types. + * Immutable, chainable, unambiguous API. + * Parsing and formatting for common and custom formats. + * Native time zone and Intl support (no locale or tz files). + +## Download/install + +[Download/install instructions](https://moment.github.io/luxon/#/install) + +## Documentation + +* [General documentation](https://moment.github.io/luxon/#/?id=luxon) +* [API docs](https://moment.github.io/luxon/api-docs/index.html) +* [Quick tour](https://moment.github.io/luxon/#/tour) +* [For Moment users](https://moment.github.io/luxon/#/moment) +* [Why does Luxon exist?](https://moment.github.io/luxon/#/why) +* [A quick demo](https://moment.github.io/luxon/demo/global.html) + +## Development + +See [contributing](CONTRIBUTING.md). + +![Phasers to stun][phasers-image] + +[license-image]: https://img.shields.io/badge/license-MIT-blue.svg +[license]: LICENSE.md + +[github-action-image]: https://github.com/moment/luxon/actions/workflows/test.yml/badge.svg +[github-action-url]: https://github.com/moment/luxon/actions/workflows/test.yml + +[npm-url]: https://npmjs.org/package/luxon +[npm-version-image]: https://badge.fury.io/js/luxon.svg + +[test-coverage-url]: https://codecov.io/gh/moment/luxon +[test-coverage-image]: https://codecov.io/gh/moment/luxon/branch/master/graph/badge.svg + +[contributing-url]: https://github.com/moment/luxon/blob/master/CONTRIBUTING.md +[contributing-image]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg + +[phasers-image]: https://img.shields.io/badge/phasers-stun-brightgreen.svg diff --git a/node_modules/luxon/build/amd/luxon.js b/node_modules/luxon/build/amd/luxon.js new file mode 100644 index 0000000..dcdb4f9 --- /dev/null +++ b/node_modules/luxon/build/amd/luxon.js @@ -0,0 +1,8741 @@ +define(['exports'], (function (exports) { 'use strict'; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); + } + + // these aren't really private, but nor are they really useful to document + /** + * @private + */ + var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + return LuxonError; + }( /*#__PURE__*/_wrapNativeSuper(Error)); + /** + * @private + */ + var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError; + }(LuxonError); + + /** + * @private + */ + var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError; + }(LuxonError); + + /** + * @private + */ + var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError; + }(LuxonError); + + /** + * @private + */ + var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError; + }(LuxonError); + + /** + * @private + */ + var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError; + }(LuxonError); + + /** + * @private + */ + var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError; + }(LuxonError); + + /** + * @private + */ + var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError; + }(LuxonError); + + /** + * @private + */ + + var n = "numeric", + s = "short", + l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n + }; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s + }; + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l + }; + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + + /** + * @interface + */ + var Zone = /*#__PURE__*/function () { + function Zone() {} + var _proto = Zone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */; + _createClass(Zone, [{ + key: "type", + get: + /** + * The type of zone + * @abstract + * @type {string} + */ + function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone; + }(); + + var singleton$1 = null; + + /** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ + var SystemZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(SystemZone, _Zone); + function SystemZone() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + + /** @override **/; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/; + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/; + _createClass(SystemZone, [{ + key: "type", + get: /** @override **/ + function get() { + return "system"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + function get() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + }]); + return SystemZone; + }(Zone); + + var dtfCache = new Map(); + function makeDTF(zoneName) { + var dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; + } + var typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 + }; + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fadOrBc = parsed[4], + fHour = parsed[5], + fMinute = parsed[6], + fSecond = parsed[7]; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; + } + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date); + var filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value; + var pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; + } + var ianaZoneCache = new Map(); + /** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ + var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + var zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */; + IANAZone.resetCache = function resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */; + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */; + IANAZone.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone(name) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.zoneName = name; + /** @private **/ + _this.valid = IANAZone.isValidZone(name); + return _this; + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + var _proto = IANAZone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + if (!this.valid) return NaN; + var date = new Date(ts); + if (isNaN(date)) return NaN; + var dtf = makeDTF(this.name); + var _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + adOrBc = _ref2[3], + hour = _ref2[4], + minute = _ref2[5], + second = _ref2[6]; + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */; + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone; + }(Zone); + + var _excluded = ["base"], + _excluded2 = ["padTo", "floor"]; + + // todo - remap caching + + var intlLFCache = {}; + function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; + } + var intlDTCache = new Map(); + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; + } + var intlNumCache = new Map(); + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; + } + var intlRelCache = new Map(); + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); // exclude `base` from the options + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; + } + var sysLocaleCache = null; + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } + } + var intlResolvedOptionsCache = new Map(); + function getCachedIntResolvedOptions(locString) { + var opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; + } + var weekInfoCache = new Map(); + function getCachedWeekInfo(locString) { + var data = weekInfoCache.get(locString); + if (!data) { + var locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = _extends({}, fallbackWeekSettings, data); + } + weekInfoCache.set(locString, data); + } + return data; + } + function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + var xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + var smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; + return [selectedStr, numberingSystem, calendar]; + } + } + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } + } + function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; + } + function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; + } + function listStuff(loc, length, englishFn, intlFn) { + var mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } + } + + /** + * @private + */ + var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter; + }(); + /** + * @private + */ + var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + var z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + var intlOpts = _extends({}, this.opts); + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter.prototype; + _proto2.format = function format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(function (_ref) { + var value = _ref.value; + return value; + }).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + var _this = this; + var parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(function (part) { + if (part.type === "timeZoneName") { + var offsetName = _this.originalZone.offsetName(_this.dt.ts, { + locale: _this.dt.locale, + format: _this.opts.timeZoneName + }); + return _extends({}, part, { + value: offsetName + }); + } else { + return part; + } + }); + } + return parts; + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter; + }(); + /** + * @private + */ + var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter; + }(); + var fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] + }; + + /** + * @private + */ + var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + }; + Locale.create = function create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + var weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + }; + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + }; + Locale.fromObject = function fromObject(_temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + locale = _ref2.locale, + numberingSystem = _ref2.numberingSystem, + outputCalendar = _ref2.outputCalendar, + weekSettings = _ref2.weekSettings; + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + }; + function Locale(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format) { + var _this2 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, months, function () { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-"); + format &= !monthSpecialCase; + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this2.monthsCache[formatStr][length]) { + var mapper = !monthSpecialCase ? function (dt) { + return _this2.extract(dt, intl, "month"); + } : function (dt) { + return _this2.dtFormatter(dt, intl).format(); + }; + _this2.monthsCache[formatStr][length] = mapMonths(mapper); + } + return _this2.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format) { + var _this3 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this3.weekdaysCache[formatStr][length]) { + _this3.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this3.extract(dt, intl, "weekday"); + }); + } + return _this3.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1() { + var _this4 = this; + return listStuff(this, undefined, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this4.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this4.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this4.extract(dt, intl, "dayperiod"); + }); + } + return _this4.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length) { + var _this5 = this; + return listStuff(this, length, eras, function () { + var intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!_this5.eraCache[length]) { + _this5.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this5.extract(dt, intl, "era"); + }); + } + return _this5.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + }; + _proto4.getWeekSettings = function getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + }; + _proto4.getStartOfWeek = function getStartOfWeek() { + return this.getWeekSettings().firstDay; + }; + _proto4.getMinDaysInFirstWeek = function getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + }; + _proto4.getWeekendDays = function getWeekendDays() { + return this.getWeekSettings().weekend; + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _proto4.toString = function toString() { + return "Locale(" + this.locale + ", " + this.numberingSystem + ", " + this.outputCalendar + ")"; + }; + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale; + }(); + + var singleton = null; + + /** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ + var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */; + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone(offset) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.fixed = offset; + return _this; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + var _proto = FixedOffsetZone.prototype; + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + _proto.offsetName = function offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */; + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + _proto.offset = function offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */; + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return "Etc/GMT" + formatOffset(-this.fixed, "narrow"); + } + } + }, { + key: "isUniversal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "utcInstance", + get: + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + function get() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + }]); + return FixedOffsetZone; + }(Zone); + + /** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ + var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + function InvalidZone(zoneName) { + var _this; + _this = _Zone.call(this) || this; + /** @private */ + _this.zoneName = zoneName; + return _this; + } + + /** @override **/ + var _proto = InvalidZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + + /** @override **/; + _proto.formatOffset = function formatOffset() { + return ""; + } + + /** @override **/; + _proto.offset = function offset() { + return NaN; + } + + /** @override **/; + _proto.equals = function equals() { + return false; + } + + /** @override **/; + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone; + }(Zone); + + /** + * @private + */ + function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } + } + + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } + } + + // cache of {numberingSystem: {append: regex}} + var digitRegexCache = new Map(); + function resetDigitRegexCache() { + digitRegexCache.clear(); + } + function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + if (append === void 0) { + append = ""; + } + var ns = numberingSystem || "latn"; + var appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + var regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp("" + numberingSystems[ns] + append); + appendCache.set(append, regex); + } + return regex; + } + + var now = function now() { + return Date.now(); + }, + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + + /** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ + var Settings = /*#__PURE__*/function () { + function Settings() {} + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + }; + _createClass(Settings, null, [{ + key: "now", + get: + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + function get() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */, + set: function set(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + }, { + key: "defaultZone", + get: + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + function get() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + }, { + key: "defaultWeekSettings", + get: function get() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */, + set: function set(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + }, { + key: "twoDigitCutoffYear", + get: function get() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */, + set: function set(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings; + }(); + + var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid; + }(); + + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); + } + function dayOfWeek(year, month, day) { + var d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + var js = d.getUTCDay(); + return js === 0 ? 7 : js; + } + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; + } + function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; + } + function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; + } + + /** + * @private + */ + + function gregorianToWeek(gregObj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + var weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); + } + function weekToGregorian(weekData, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(weekData)); + } + function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day; + var ordinal = computeOrdinal(year, month, day); + return _extends({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); + } + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); + } + + /** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ + function usesLocalWeekValues(obj, loc) { + var hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + var hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } + } + function hasInvalidWeekData(obj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; + } + + /** + * @private + */ + + // TYPES + + function isUndefined(o) { + return typeof o === "undefined"; + } + function isNumber(o) { + return typeof o === "number"; + } + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; + } + function isString(o) { + return typeof o === "string"; + } + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + + // CAPABILITIES + + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } + function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } + } + + // OBJECTS AND ARRAYS + + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(function (v) { + return !integerBetween(v, 1, 7); + })) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } + } + + // NUMBERS AND STRINGS + + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } + + // x % n but takes the sign of n instead of x + function floorMod(x, n) { + return x - n * Math.floor(x / n); + } + function padStart(input, n) { + if (n === void 0) { + n = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } + } + function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } + } + function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } + } + function roundTo(number, digits, rounding) { + if (rounding === void 0) { + rounding = "round"; + } + var factor = Math.pow(10, digits); + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError("Value rounding " + rounding + " is out of range"); + } + } + + // DATE BASICS + + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } + + // convert a calendar object to a local timestamp (epoch, but with the offset baked in) + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; + } + + // adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js + function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + var fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; + } + function weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + var weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; + } + + // PARSING + + function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } + + // signedOffset('-5', '30') -> -330 + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } + + // COERCION + + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; + } + + /** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + function formatOffset(offset, format) { + var hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + + /** + * @private + */ + + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + + function stringifyTokens(splits, tokenToString) { + var s = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; + } + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + + /** + * @private + */ + var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter(locale, opts); + }; + Formatter.parseFormat = function parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + }; + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.dtFormatter = function dtFormatter(dt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + }; + _proto.formatInterval = function formatInterval(interval, opts) { + var df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + }; + _proto.num = function num(n, p, signDisplay) { + if (p === void 0) { + p = 0; + } + if (signDisplay === void 0) { + signDisplay = undefined; + } + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + // fractional seconds + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + // hours + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return _this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return _this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "n": + return _this.num(dt.localWeekNumber); + case "nn": + return _this.num(dt.localWeekNumber, 2); + case "ii": + return _this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return _this.num(dt.localWeekYear, 4); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + // like 1 + return _this.num(dt.quarter); + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = function tokenToString(lildur, info) { + return function (token) { + var mapped = tokenToField(token); + if (mapped) { + var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + var signDisplay; + if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (_this2.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + }; + return Formatter; + }(); + + /* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + + var ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); + } + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + return [_extends({}, mergedVals, val), zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); + }; + } + function parse(s) { + if (s == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; + } + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function (match, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; + } + + // ISO and SQL parsing + var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; + var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; + var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; + var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); + var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?"); + var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; + var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; + var isoOrdinalRegex = /(\d{4})-?(\d{3})/; + var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); + var extractISOOrdinalData = simpleParse("year", "ordinal"); + var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one + var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); + var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); + } + function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + function extractISOTime(match, cursor) { + var item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; + } + + // ISO time parsing + + var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + + // ISO duration parsing + + var isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; + function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate(num, force) { + if (force === void 0) { + force = false; + } + return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; + } + + // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York + // and not just that we're in -240 *right now*. But since I don't think these are used that often + // I'm just going to ignore that + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; + } + + // RFC 2822/5322 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; + } + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } + + // http date + + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + + /* + * @private + */ + + function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); + } + var extractISOTimeOnly = combineExtractors(extractISOTime); + function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + + var INVALID$2 = "Invalid Duration"; + + // unit conversion constants + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); + + // units ordered by size + var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits$1.slice(0).reverse(); + + // clone really means "create another instance just like this one, but with these changes" + function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + // deep merge for vals + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); + } + function durationToMillis(matrix, vals) { + var _vals$milliseconds; + var sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (var _iterator = _createForOfIteratorHelperLoose(reverseUnits.slice(1)), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; + } + + // NB: mutates parameters + function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + var factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var previousVal = vals[previous] * factor; + var conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + var rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); + } + + // Remove all properties with a value of 0 from an object + function removeZeroes(vals) { + var newVals = {}; + for (var _i = 0, _Object$entries = Object.entries(vals); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; + } + + /** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ + var Duration = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + var matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */; + Duration.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */; + Duration.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */; + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */; + Duration.fromISOTime = function fromISOTime(text, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text), + parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */; + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + + /** + * @private + */; + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */; + var _proto = Duration.prototype; + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return INVALID$2; + var showZeros = opts.showZeros !== false; + var l = orderedUnits$1.map(function (unit) { + var val = _this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit.slice(0, -1) + })).format(val); + }).filter(function (n) { + return n; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */; + _proto.toObject = function toObject() { + if (!this.isValid) return {}; + return _extends({}, this.values); + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */; + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts, { + includeOffset: false + }); + var dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */; + _proto.toString = function toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Duration { values: " + JSON.stringify(this.values) + " }"; + } else { + return "Duration { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */; + _proto.toMillis = function toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration), + result = {}; + for (var _i2 = 0, _orderedUnits = orderedUnits$1; _i2 < _orderedUnits.length; _i2++) { + var k = _orderedUnits[_i2]; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + for (var _i3 = 0, _Object$keys = Object.keys(this.values); _i3 < _Object$keys.length; _i3++) { + var k = _Object$keys[_i3]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */; + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy, + matrix = _ref.matrix; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }); + var opts = { + loc: loc, + matrix: matrix, + conversionAccuracy: conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */; + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */; + _proto.rescale = function rescale() { + if (!this.isValid) return this; + var vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + for (var _i4 = 0, _orderedUnits2 = orderedUnits$1; _i4 < _orderedUnits2.length; _i4++) { + var k = _orderedUnits2[_i4]; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */; + _proto.shiftToAll = function shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */; + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + for (var _i5 = 0, _Object$keys2 = Object.keys(this.values); _i5 < _Object$keys2.length; _i5++) { + var k = _Object$keys2[_i5]; + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */; + _proto.removeZeros = function removeZeros() { + if (!this.isValid) return this; + var vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */; + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (var _i6 = 0, _orderedUnits3 = orderedUnits$1; _i6 < _orderedUnits3.length; _i6++) { + var u = _orderedUnits3[_i6]; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration; + }(Symbol.for("nodejs.util.inspect.custom")); + + var INVALID$1 = "Invalid Interval"; + + // checks if the start is equal to or before the end + function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } + } + + /** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ + var Interval = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */; + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.after = function after(start, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */; + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + if (s && e) { + var start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s, opts); + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */; + var _proto = Interval.prototype; + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */; + _proto.count = function count(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) return NaN; + var start = this.start.startOf(unit, opts); + var end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(function (a, b) { + return a.toMillis() - b.toMillis(); + }), + results = []; + var s = this.s, + i = 0; + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s = this.s, + idx = 1, + next; + var results = []; + while (s < this.e) { + var added = this.start.plus(dur.mapUnits(function (x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */; + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */; + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */; + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */; + Interval.xor = function xor(intervals) { + var _Array$prototype; + var start = null, + currentCount = 0; + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */; + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Interval { start: " + this.s.toISO() + ", end: " + this.e.toISO() + " }"; + } else { + return "Interval { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */; + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + }, { + key: "lastDateTime", + get: function get() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval; + }(Symbol.for("nodejs.util.inspect.custom")); + + /** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ + var Info = /*#__PURE__*/function () { + function Info() {} + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */; + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */; + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */; + Info.getStartOfWeek = function getStartOfWeek(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$locObj = _ref.locObj, + locObj = _ref$locObj === void 0 ? null : _ref$locObj; + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */; + Info.getMinimumDaysInFirstWeek = function getMinimumDaysInFirstWeek(_temp2) { + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$locObj = _ref2.locObj, + locObj = _ref2$locObj === void 0 ? null : _ref2$locObj; + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */; + Info.getWeekendWeekdays = function getWeekendWeekdays(_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$locObj = _ref3.locObj, + locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */; + Info.months = function months(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, + _ref4$locObj = _ref4.locObj, + locObj = _ref4$locObj === void 0 ? null : _ref4$locObj, + _ref4$outputCalendar = _ref4.outputCalendar, + outputCalendar = _ref4$outputCalendar === void 0 ? "gregory" : _ref4$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */; + Info.monthsFormat = function monthsFormat(length, _temp5) { + if (length === void 0) { + length = "long"; + } + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale, + _ref5$numberingSystem = _ref5.numberingSystem, + numberingSystem = _ref5$numberingSystem === void 0 ? null : _ref5$numberingSystem, + _ref5$locObj = _ref5.locObj, + locObj = _ref5$locObj === void 0 ? null : _ref5$locObj, + _ref5$outputCalendar = _ref5.outputCalendar, + outputCalendar = _ref5$outputCalendar === void 0 ? "gregory" : _ref5$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */; + Info.weekdays = function weekdays(length, _temp6) { + if (length === void 0) { + length = "long"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale, + _ref6$numberingSystem = _ref6.numberingSystem, + numberingSystem = _ref6$numberingSystem === void 0 ? null : _ref6$numberingSystem, + _ref6$locObj = _ref6.locObj, + locObj = _ref6$locObj === void 0 ? null : _ref6$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */; + Info.weekdaysFormat = function weekdaysFormat(length, _temp7) { + if (length === void 0) { + length = "long"; + } + var _ref7 = _temp7 === void 0 ? {} : _temp7, + _ref7$locale = _ref7.locale, + locale = _ref7$locale === void 0 ? null : _ref7$locale, + _ref7$numberingSystem = _ref7.numberingSystem, + numberingSystem = _ref7$numberingSystem === void 0 ? null : _ref7$numberingSystem, + _ref7$locObj = _ref7.locObj, + locObj = _ref7$locObj === void 0 ? null : _ref7$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */; + Info.meridiems = function meridiems(_temp8) { + var _ref8 = _temp8 === void 0 ? {} : _temp8, + _ref8$locale = _ref8.locale, + locale = _ref8$locale === void 0 ? null : _ref8$locale; + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */; + Info.eras = function eras(length, _temp9) { + if (length === void 0) { + length = "short"; + } + var _ref9 = _temp9 === void 0 ? {} : _temp9, + _ref9$locale = _ref9.locale, + locale = _ref9$locale === void 0 ? null : _ref9$locale; + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */; + Info.features = function features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + }; + return Info; + }(); + + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); + } + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["quarters", function (a, b) { + return b.quarter - a.quarter + (b.year - a.year) * 4; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var earlier = cursor; + var lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; + } + function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus; + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[lowestOrder] = 1, _cursor$plus)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } + } + + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; + } + var NBSP = String.fromCharCode(160); + var spaceOrNBSP = "[ " + NBSP + "]"; + var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); + } + function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); + } + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } + } + function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; + } + function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; + } + function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + + /** + * @param token + * @param {Locale} loc + */ + function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; + } + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } + }; + function tokenForPart(part, formatOpts, resolvedOpts) { + var type = part.type, + value = part.value; + if (type === "literal") { + var isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + var style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + var actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + var val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val: val + }; + } + return undefined; + } + function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; + } + function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } + } + function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; + } + var dummyDateTimeCache = null; + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; + } + function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + var tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; + } + function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); + } + + /** + * @private + */ + + var TokenParser = /*#__PURE__*/function () { + function TokenParser(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(function (t) { + return unitForToken(t, locale); + }); + this.disqualifyingUnit = this.units.find(function (t) { + return t.invalidReason; + }); + if (!this.disqualifyingUnit) { + var _buildRegex = buildRegex(this.units), + regexString = _buildRegex[0], + handlers = _buildRegex[1]; + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + var _proto = TokenParser.prototype; + _proto.explainFromTokens = function explainFromTokens(input) { + if (!this.isValid) { + return { + input: input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + var _match = match(input, this.regex, this.handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, undefined], + result = _ref6[0], + zone = _ref6[1], + specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input: input, + tokens: this.tokens, + regex: this.regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone, + specificOffset: specificOffset + }; + } + }; + _createClass(TokenParser, [{ + key: "isValid", + get: function get() { + return !this.disqualifyingUnit; + } + }, { + key: "invalidReason", + get: function get() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } + }]); + return TokenParser; + }(); + function explainFromTokens(locale, input, format) { + var parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); + } + function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + specificOffset = _explainFromTokens.specificOffset, + invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; + } + function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + var formatter = Formatter.create(locale, formatOpts); + var df = formatter.dtFormatter(getDummyDateTime()); + var parts = df.formatToParts(); + var resolvedOpts = df.resolvedOptions(); + return parts.map(function (p) { + return tokenForPart(p, formatOpts, resolvedOpts); + }); + } + + var INVALID = "Invalid DateTime"; + var MAX_DATE = 8.64e15; + function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); + } + + // we cache week data on the DT object and this intermediates the cache + /** + * @param {DateTime} dt + */ + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; + } + + /** + * @param {DateTime} dt + */ + function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; + } + + // clone really means, "make a new object with these modifications". all "setters" really use this + // to create a new object while only changing some of the properties + function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(_extends({}, current, alts, { + old: current + })); + } + + // find the right offset a given local time. The o input is our guess, which determines which + // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) + function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + var o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; + } + + // convert an epoch timestamp into a calendar object with the given offset + function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } + + // convert a calendar object to a epoch timestamp + function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); + } + + // create a new DT instance by adding a duration, adjusting for DSTs + function adjustTime(inst, dur) { + var oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = _extends({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts: ts, + o: o + }; + } + + // helper useful in turning the results of parsing into real dates + // by handling the zone options + function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + var setZone = opts.setZone, + zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset: specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } + } + + // if you want to output a technical format (e.g. RFC 2822), this helper + // helps handle the details + function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; + } + function _toISODate(o, extended, precision) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; + } + function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; + } + + // defaults for unspecified units in the supported calendars + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + + // Units in the supported calendars, sorted by bigness + var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + + // standardize case and plurality in units + function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } + } + + // cache offsets for zones based on the current timestamp when this function is + // first called. When we are handling a datetime from components like (year, + // month, day, hour) in a time zone, we need a guess about what the timezone + // offset is so that we can convert into a UTC timestamp. One way is to find the + // offset of now in the zone. The actual date may have a different offset (for + // example, if we handle a date in June while we're in December in a zone that + // observes DST), but we can check and adjust that. + // + // When handling many dates, calculating the offset for now every time is + // expensive. It's just a guess, so we can cache the offset to use even if we + // are right on a time change boundary (we'll just correct in the other + // direction). Using a timestamp from first read is a slight optimization for + // handling dates close to the current date, since those dates will usually be + // in the same offset (we could set the timestamp statically, instead). We use a + // single timestamp for all zones to make things a bit more predictable. + // + // This is safe for quickDT (used by local() and utc()) because we don't fill in + // higher-order units from tsNow (as we do in fromObject, this requires that + // offset is calculated from tsNow). + /** + * @param {Zone} zone + * @return {number} + */ + function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + var zoneName = zone.name; + var offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; + } + + // this is a dumbed down version of fromObject() that runs about 60% faster + // but doesn't do any validation, makes a bunch of assumptions about what units + // are present, and so on. + function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + var loc = Locale.fromObject(opts); + var ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (var _i = 0, _orderedUnits = orderedUnits; _i < _orderedUnits.length; _i++) { + var u = _orderedUnits[_i]; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + var offsetProvis = guessOffsetForZone(zone); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = Settings.now(); + } + return new DateTime({ + ts: ts, + zone: zone, + loc: loc, + o: o + }); + } + function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator = _createForOfIteratorHelperLoose(opts.units), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); + } + function lastOpts(argList) { + var opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; + } + + /** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ + var zoneOffsetTs; + /** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ + var zoneOffsetGuessCache = new Map(); + + /** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ + var DateTime = /*#__PURE__*/function (_Symbol$for) { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c = _ref[0]; + o = _ref[1]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + var ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + DateTime.now = function now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */; + DateTime.local = function local() { + var _lastOpts = lastOpts(arguments), + opts = _lastOpts[0], + args = _lastOpts[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */; + DateTime.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), + opts = _lastOpts2[0], + args = _lastOpts2[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */; + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */; + DateTime.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + var loc = Locale.fromObject(opts); + var normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues = usesLocalWeekValues(normalized, loc), + minDaysInFirstWeek = _usesLocalWeekValues.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues.startOfWeek; + var tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + var foundFirst = false; + for (var _iterator2 = _createForOfIteratorHelperLoose(units), _step2; !(_step2 = _iterator2()).done;) { + var u = _step2.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + var gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */; + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */; + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */; + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + specificOffset = _parseFromTokens[2], + invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */; + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */; + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */; + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */; + DateTime.parseFormatForOpts = function parseFormatForOpts(formatOpts, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(function (t) { + return t ? t.val : null; + }).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */; + DateTime.expandFormat = function expandFormat(fmt, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(function (t) { + return t.val; + }).join(""); + }; + DateTime.resetCache = function resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */; + var _proto = DateTime.prototype; + _proto.get = function get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */; + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + _proto.getPossibleOffsets = function getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + var dayMs = 86400000; + var minuteMs = 60000; + var localTS = objToLocalTS(this.c); + var oEarlier = this.zone.offset(localTS - dayMs); + var oLater = this.zone.offset(localTS + dayMs); + var o1 = this.zone.offset(localTS - oEarlier * minuteMs); + var o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + var ts1 = localTS - o1 * minuteMs; + var ts2 = localTS - o2 * minuteMs; + var c1 = tsToObj(ts1, o1); + var c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */; + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */; + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + _ref2$keepLocalTime = _ref2.keepLocalTime, + keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, + _ref2$keepCalendarTim = _ref2.keepCalendarTime, + keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone: zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + locale = _ref3.locale, + numberingSystem = _ref3.numberingSystem, + outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone(this, { + loc: loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues2 = usesLocalWeekValues(normalized, this.loc), + minDaysInFirstWeek = _usesLocalWeekValues2.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues2.startOfWeek; + var settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), normalized), minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + return clone(this, { + ts: ts, + o: o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */; + _proto.startOf = function startOf(unit, _temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, + _ref4$useLocaleWeeks = _ref4.useLocaleWeeks, + useLocaleWeeks = _ref4$useLocaleWeeks === void 0 ? false : _ref4$useLocaleWeeks; + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + var startOfWeek = this.loc.getStartOfWeek(); + var weekday = this.weekday; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */; + _proto.endOf = function endOf(unit, opts) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */; + _proto.toISO = function toISO(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format, + _ref5$suppressSeconds = _ref5.suppressSeconds, + suppressSeconds = _ref5$suppressSeconds === void 0 ? false : _ref5$suppressSeconds, + _ref5$suppressMillise = _ref5.suppressMilliseconds, + suppressMilliseconds = _ref5$suppressMillise === void 0 ? false : _ref5$suppressMillise, + _ref5$includeOffset = _ref5.includeOffset, + includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, + _ref5$extendedZone = _ref5.extendedZone, + extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone, + _ref5$precision = _ref5.precision, + precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var ext = format === "extended"; + var c = _toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */; + _proto.toISODate = function toISODate(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format, + _ref6$precision = _ref6.precision, + precision = _ref6$precision === void 0 ? "day" : _ref6$precision; + if (!this.isValid) { + return null; + } + return _toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */; + _proto.toISOTime = function toISOTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressMillise = _ref7.suppressMilliseconds, + suppressMilliseconds = _ref7$suppressMillise === void 0 ? false : _ref7$suppressMillise, + _ref7$suppressSeconds = _ref7.suppressSeconds, + suppressSeconds = _ref7$suppressSeconds === void 0 ? false : _ref7$suppressSeconds, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includePrefix = _ref7.includePrefix, + includePrefix = _ref7$includePrefix === void 0 ? false : _ref7$includePrefix, + _ref7$extendedZone = _ref7.extendedZone, + extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, + _ref7$format = _ref7.format, + format = _ref7$format === void 0 ? "extended" : _ref7$format, + _ref7$precision = _ref7.precision, + precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */; + _proto.toSQLTime = function toSQLTime(_temp7) { + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$includeOffset = _ref8.includeOffset, + includeOffset = _ref8$includeOffset === void 0 ? true : _ref8$includeOffset, + _ref8$includeZone = _ref8.includeZone, + includeZone = _ref8$includeZone === void 0 ? false : _ref8$includeZone, + _ref8$includeOffsetSp = _ref8.includeOffsetSpace, + includeOffsetSpace = _ref8$includeOffsetSp === void 0 ? true : _ref8$includeOffsetSp; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "DateTime { ts: " + this.toISO() + ", zone: " + this.zone.name + ", locale: " + this.locale + " }"; + } else { + return "DateTime { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */; + _proto.toUnixInteger = function toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */; + _proto.hasSame = function hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units: units, + unit: unit + })); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */; + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */; + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */; + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */; + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */; + DateTime.buildFormatParser = function buildFormatParser(fmt, options) { + if (options === void 0) { + options = {}; + } + var _options2 = options, + _options2$locale = _options2.locale, + locale = _options2$locale === void 0 ? null : _options2$locale, + _options2$numberingSy = _options2.numberingSystem, + numberingSystem = _options2$numberingSy === void 0 ? null : _options2$numberingSy, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */; + DateTime.fromFormatParser = function fromFormatParser(text, formatParser, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + var _opts2 = opts, + _opts2$locale = _opts2.locale, + locale = _opts2$locale === void 0 ? null : _opts2$locale, + _opts2$numberingSyste = _opts2.numberingSystem, + numberingSystem = _opts2$numberingSyste === void 0 ? null : _opts2$numberingSyste, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError("fromFormatParser called with a locale of " + localeToUse + ", " + ("but the format parser was created for " + formatParser.locale)); + } + var _formatParser$explain = formatParser.explainFromTokens(text), + result = _formatParser$explain.result, + zone = _formatParser$explain.zone, + specificOffset = _formatParser$explain.specificOffset, + invalidReason = _formatParser$explain.invalidReason; + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, "format " + formatParser.format, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */; + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + }, { + key: "zone", + get: function get() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + }, { + key: "isWeekend", + get: function get() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + }, { + key: "localWeekday", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + }, { + key: "localWeekNumber", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + }, { + key: "localWeekYear", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + }, { + key: "weeksInLocalWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime; + }(Symbol.for("nodejs.util.inspect.custom")); + function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + + var VERSION = "3.7.2"; + + exports.DateTime = DateTime; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.Settings = Settings; + exports.SystemZone = SystemZone; + exports.VERSION = VERSION; + exports.Zone = Zone; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/amd/luxon.js.map b/node_modules/luxon/build/amd/luxon.js.map new file mode 100644 index 0000000..30cf226 --- /dev/null +++ b/node_modules/luxon/build/amd/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","_Error","_inheritsLoose","apply","arguments","_wrapNativeSuper","Error","InvalidDateTimeError","_LuxonError","reason","call","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","prototype","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","_createClass","key","get","name","singleton","SystemZone","_Zone","_ref","locale","parseZoneInfo","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","Map","makeDTF","zoneName","dtf","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","_formatted$i","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","_this","valid","NaN","isNaN","_ref2","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","_opts","base","cacheKeyOpts","_objectWithoutPropertiesLoose","_excluded","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","_extends","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","_options","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","_excluded2","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_proto3","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","_temp","numbering","_parseLocaleString","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","_this2","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","_this3","meridiems","_this4","eras","_this5","field","df","results","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","instance","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","_iterator","_createForOfIteratorHelperLoose","_step","done","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","_len","regexes","_key","full","source","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","_parseISODuration","fromISOTime","_parseISOTimeOnly","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","invalidReason","valueOf","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","_i4","_orderedUnits2","own","ak","negated","_i5","_Object$keys2","removeZeros","eq","v1","v2","_i6","_orderedUnits3","Symbol","for","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","_split","startIsValid","endIsValid","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","sofar","final","xor","_Array$prototype","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8","_ref8$locale","_temp9","_ref9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","_differs","_differs$_i","differ","_highOrderDiffs","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","_buildRegex","regexString","explainFromTokens","_match","rawMatches","parser","parseFromTokens","_explainFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","ianaName","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","_objToTS","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","_iterator2","_step2","higherOrderInvalid","gregorian","_objToTS2","tsFinal","offsetFinal","_parseISODate","fromRFC2822","_parseRFC2822Date","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","resolvedLocaleOptions","_Formatter$create$res","toLocal","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","newTS","asObj","_objToTS3","setLocale","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/cjs-browser/luxon.js b/node_modules/luxon/build/cjs-browser/luxon.js new file mode 100644 index 0000000..679b0ee --- /dev/null +++ b/node_modules/luxon/build/cjs-browser/luxon.js @@ -0,0 +1,8739 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } +} +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; +} +function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); +} +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); +} +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); +} +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } +} +function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); +} +function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; +} +function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); +} +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; +} +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; +} +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} +function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); +} +function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); +} + +// these aren't really private, but nor are they really useful to document +/** + * @private + */ +var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + return LuxonError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); +/** + * @private + */ +var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError; +}(LuxonError); + +/** + * @private + */ +var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError; +}(LuxonError); + +/** + * @private + */ +var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError; +}(LuxonError); + +/** + * @private + */ +var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError; +}(LuxonError); + +/** + * @private + */ +var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError; +}(LuxonError); + +/** + * @private + */ +var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError; +}(LuxonError); + +/** + * @private + */ +var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError; +}(LuxonError); + +/** + * @private + */ + +var n = "numeric", + s = "short", + l = "long"; +var DATE_SHORT = { + year: n, + month: n, + day: n +}; +var DATE_MED = { + year: n, + month: s, + day: n +}; +var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s +}; +var DATE_FULL = { + year: n, + month: l, + day: n +}; +var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l +}; +var TIME_SIMPLE = { + hour: n, + minute: n +}; +var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n +}; +var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l +}; +var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" +}; +var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" +}; +var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s +}; +var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l +}; +var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n +}; +var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n +}; +var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n +}; +var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n +}; +var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n +}; +var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s +}; +var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l +}; +var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l +}; + +/** + * @interface + */ +var Zone = /*#__PURE__*/function () { + function Zone() {} + var _proto = Zone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */; + _createClass(Zone, [{ + key: "type", + get: + /** + * The type of zone + * @abstract + * @type {string} + */ + function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone; +}(); + +var singleton$1 = null; + +/** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ +var SystemZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(SystemZone, _Zone); + function SystemZone() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + + /** @override **/; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/; + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/; + _createClass(SystemZone, [{ + key: "type", + get: /** @override **/ + function get() { + return "system"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + function get() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + }]); + return SystemZone; +}(Zone); + +var dtfCache = new Map(); +function makeDTF(zoneName) { + var dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; +} +var typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 +}; +function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fadOrBc = parsed[4], + fHour = parsed[5], + fMinute = parsed[6], + fSecond = parsed[7]; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; +} +function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date); + var filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value; + var pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; +} +var ianaZoneCache = new Map(); +/** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ +var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + var zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */; + IANAZone.resetCache = function resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */; + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */; + IANAZone.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone(name) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.zoneName = name; + /** @private **/ + _this.valid = IANAZone.isValidZone(name); + return _this; + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + var _proto = IANAZone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + if (!this.valid) return NaN; + var date = new Date(ts); + if (isNaN(date)) return NaN; + var dtf = makeDTF(this.name); + var _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + adOrBc = _ref2[3], + hour = _ref2[4], + minute = _ref2[5], + second = _ref2[6]; + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */; + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone; +}(Zone); + +var _excluded = ["base"], + _excluded2 = ["padTo", "floor"]; + +// todo - remap caching + +var intlLFCache = {}; +function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; +} +var intlDTCache = new Map(); +function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; +} +var intlNumCache = new Map(); +function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; +} +var intlRelCache = new Map(); +function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); // exclude `base` from the options + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; +} +var sysLocaleCache = null; +function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } +} +var intlResolvedOptionsCache = new Map(); +function getCachedIntResolvedOptions(locString) { + var opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; +} +var weekInfoCache = new Map(); +function getCachedWeekInfo(locString) { + var data = weekInfoCache.get(locString); + if (!data) { + var locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = _extends({}, fallbackWeekSettings, data); + } + weekInfoCache.set(locString, data); + } + return data; +} +function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + var xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + var smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; + return [selectedStr, numberingSystem, calendar]; + } +} +function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } +} +function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; +} +function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; +} +function listStuff(loc, length, englishFn, intlFn) { + var mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } +} +function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } +} + +/** + * @private + */ +var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter; +}(); +/** + * @private + */ +var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + var z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + var intlOpts = _extends({}, this.opts); + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter.prototype; + _proto2.format = function format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(function (_ref) { + var value = _ref.value; + return value; + }).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + var _this = this; + var parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(function (part) { + if (part.type === "timeZoneName") { + var offsetName = _this.originalZone.offsetName(_this.dt.ts, { + locale: _this.dt.locale, + format: _this.opts.timeZoneName + }); + return _extends({}, part, { + value: offsetName + }); + } else { + return part; + } + }); + } + return parts; + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter; +}(); +/** + * @private + */ +var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter; +}(); +var fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] +}; + +/** + * @private + */ +var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + }; + Locale.create = function create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + var weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + }; + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + }; + Locale.fromObject = function fromObject(_temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + locale = _ref2.locale, + numberingSystem = _ref2.numberingSystem, + outputCalendar = _ref2.outputCalendar, + weekSettings = _ref2.weekSettings; + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + }; + function Locale(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format) { + var _this2 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, months, function () { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-"); + format &= !monthSpecialCase; + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this2.monthsCache[formatStr][length]) { + var mapper = !monthSpecialCase ? function (dt) { + return _this2.extract(dt, intl, "month"); + } : function (dt) { + return _this2.dtFormatter(dt, intl).format(); + }; + _this2.monthsCache[formatStr][length] = mapMonths(mapper); + } + return _this2.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format) { + var _this3 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this3.weekdaysCache[formatStr][length]) { + _this3.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this3.extract(dt, intl, "weekday"); + }); + } + return _this3.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1() { + var _this4 = this; + return listStuff(this, undefined, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this4.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this4.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this4.extract(dt, intl, "dayperiod"); + }); + } + return _this4.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length) { + var _this5 = this; + return listStuff(this, length, eras, function () { + var intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!_this5.eraCache[length]) { + _this5.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this5.extract(dt, intl, "era"); + }); + } + return _this5.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + }; + _proto4.getWeekSettings = function getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + }; + _proto4.getStartOfWeek = function getStartOfWeek() { + return this.getWeekSettings().firstDay; + }; + _proto4.getMinDaysInFirstWeek = function getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + }; + _proto4.getWeekendDays = function getWeekendDays() { + return this.getWeekSettings().weekend; + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _proto4.toString = function toString() { + return "Locale(" + this.locale + ", " + this.numberingSystem + ", " + this.outputCalendar + ")"; + }; + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale; +}(); + +var singleton = null; + +/** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ +var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */; + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone(offset) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.fixed = offset; + return _this; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + var _proto = FixedOffsetZone.prototype; + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + _proto.offsetName = function offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */; + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + _proto.offset = function offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */; + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return "Etc/GMT" + formatOffset(-this.fixed, "narrow"); + } + } + }, { + key: "isUniversal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "utcInstance", + get: + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + function get() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + }]); + return FixedOffsetZone; +}(Zone); + +/** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ +var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + function InvalidZone(zoneName) { + var _this; + _this = _Zone.call(this) || this; + /** @private */ + _this.zoneName = zoneName; + return _this; + } + + /** @override **/ + var _proto = InvalidZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + + /** @override **/; + _proto.formatOffset = function formatOffset() { + return ""; + } + + /** @override **/; + _proto.offset = function offset() { + return NaN; + } + + /** @override **/; + _proto.equals = function equals() { + return false; + } + + /** @override **/; + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone; +}(Zone); + +/** + * @private + */ +function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } +} + +var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" +}; +var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] +}; +var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); +function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } +} + +// cache of {numberingSystem: {append: regex}} +var digitRegexCache = new Map(); +function resetDigitRegexCache() { + digitRegexCache.clear(); +} +function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + if (append === void 0) { + append = ""; + } + var ns = numberingSystem || "latn"; + var appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + var regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp("" + numberingSystems[ns] + append); + appendCache.set(append, regex); + } + return regex; +} + +var now = function now() { + return Date.now(); + }, + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + +/** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ +var Settings = /*#__PURE__*/function () { + function Settings() {} + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + }; + _createClass(Settings, null, [{ + key: "now", + get: + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + function get() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */, + set: function set(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + }, { + key: "defaultZone", + get: + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + function get() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + }, { + key: "defaultWeekSettings", + get: function get() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */, + set: function set(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + }, { + key: "twoDigitCutoffYear", + get: function get() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */, + set: function set(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings; +}(); + +var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid; +}(); + +var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; +function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); +} +function dayOfWeek(year, month, day) { + var d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + var js = d.getUTCDay(); + return js === 0 ? 7 : js; +} +function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; +} +function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; +} +function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; +} + +/** + * @private + */ + +function gregorianToWeek(gregObj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + var weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); +} +function weekToGregorian(weekData, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(weekData)); +} +function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day; + var ordinal = computeOrdinal(year, month, day); + return _extends({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); +} +function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); +} + +/** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ +function usesLocalWeekValues(obj, loc) { + var hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + var hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } +} +function hasInvalidWeekData(obj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; +} +function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; +} +function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; +} +function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; +} + +/** + * @private + */ + +// TYPES + +function isUndefined(o) { + return typeof o === "undefined"; +} +function isNumber(o) { + return typeof o === "number"; +} +function isInteger(o) { + return typeof o === "number" && o % 1 === 0; +} +function isString(o) { + return typeof o === "string"; +} +function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; +} + +// CAPABILITIES + +function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } +} +function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } +} + +// OBJECTS AND ARRAYS + +function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; +} +function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; +} +function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); +} +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} +function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(function (v) { + return !integerBetween(v, 1, 7); + })) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } +} + +// NUMBERS AND STRINGS + +function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; +} + +// x % n but takes the sign of n instead of x +function floorMod(x, n) { + return x - n * Math.floor(x / n); +} +function padStart(input, n) { + if (n === void 0) { + n = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; +} +function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } +} +function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } +} +function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } +} +function roundTo(number, digits, rounding) { + if (rounding === void 0) { + rounding = "round"; + } + var factor = Math.pow(10, digits); + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError("Value rounding " + rounding + " is out of range"); + } +} + +// DATE BASICS + +function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} +function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } +} + +// convert a calendar object to a local timestamp (epoch, but with the offset baked in) +function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; +} + +// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js +function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + var fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; +} +function weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + var weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; +} +function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; +} + +// PARSING + +function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; +} + +// signedOffset('-5', '30') -> -330 +function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; +} + +// COERCION + +function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; +} +function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; +} + +/** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ +function formatOffset(offset, format) { + var hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } +} +function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); +} + +/** + * @private + */ + +var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; +var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; +function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } +} +var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; +var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; +var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; +function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } +} +var meridiems = ["AM", "PM"]; +var erasLong = ["Before Christ", "Anno Domini"]; +var erasShort = ["BC", "AD"]; +var erasNarrow = ["B", "A"]; +function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } +} +function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; +} +function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; +} +function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; +} +function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; +} +function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; +} + +function stringifyTokens(splits, tokenToString) { + var s = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; +} +var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS +}; + +/** + * @private + */ +var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter(locale, opts); + }; + Formatter.parseFormat = function parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + }; + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.dtFormatter = function dtFormatter(dt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + }; + _proto.formatInterval = function formatInterval(interval, opts) { + var df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + }; + _proto.num = function num(n, p, signDisplay) { + if (p === void 0) { + p = 0; + } + if (signDisplay === void 0) { + signDisplay = undefined; + } + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + // fractional seconds + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + // hours + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return _this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return _this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "n": + return _this.num(dt.localWeekNumber); + case "nn": + return _this.num(dt.localWeekNumber, 2); + case "ii": + return _this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return _this.num(dt.localWeekYear, 4); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + // like 1 + return _this.num(dt.quarter); + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = function tokenToString(lildur, info) { + return function (token) { + var mapped = tokenToField(token); + if (mapped) { + var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + var signDisplay; + if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (_this2.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + }; + return Formatter; +}(); + +/* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + +var ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; +function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); +} +function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + return [_extends({}, mergedVals, val), zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); + }; +} +function parse(s) { + if (s == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; +} +function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function (match, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; +} + +// ISO and SQL parsing +var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; +var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; +var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; +var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); +var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?"); +var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; +var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; +var isoOrdinalRegex = /(\d{4})-?(\d{3})/; +var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); +var extractISOOrdinalData = simpleParse("year", "ordinal"); +var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one +var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); +var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); +function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); +} +function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; +} +function extractISOTime(match, cursor) { + var item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; +} +function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; +} +function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; +} + +// ISO time parsing + +var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + +// ISO duration parsing + +var isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; +function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate(num, force) { + if (force === void 0) { + force = false; + } + return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; +} + +// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York +// and not just that we're in -240 *right now*. But since I don't think these are used that often +// I'm just going to ignore that +var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; +function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; +} + +// RFC 2822/5322 +var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; +function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; +} +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); +} + +// http date + +var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; +function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); +var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); +var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); +var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); +var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); +var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); +var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); +var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + +/* + * @private + */ + +function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); +} +function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); +} +function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); +} +function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); +} +var extractISOTimeOnly = combineExtractors(extractISOTime); +function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); +} +var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); +var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); +var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); +function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); +} + +var INVALID$2 = "Invalid Duration"; + +// unit conversion constants +var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); + +// units ordered by size +var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; +var reverseUnits = orderedUnits$1.slice(0).reverse(); + +// clone really means "create another instance just like this one, but with these changes" +function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + // deep merge for vals + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); +} +function durationToMillis(matrix, vals) { + var _vals$milliseconds; + var sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (var _iterator = _createForOfIteratorHelperLoose(reverseUnits.slice(1)), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; +} + +// NB: mutates parameters +function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + var factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var previousVal = vals[previous] * factor; + var conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + var rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); +} + +// Remove all properties with a value of 0 from an object +function removeZeroes(vals) { + var newVals = {}; + for (var _i = 0, _Object$entries = Object.entries(vals); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; +} + +/** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ +var Duration = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + var matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */; + Duration.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */; + Duration.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */; + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */; + Duration.fromISOTime = function fromISOTime(text, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text), + parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */; + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + + /** + * @private + */; + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */; + var _proto = Duration.prototype; + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return INVALID$2; + var showZeros = opts.showZeros !== false; + var l = orderedUnits$1.map(function (unit) { + var val = _this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit.slice(0, -1) + })).format(val); + }).filter(function (n) { + return n; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */; + _proto.toObject = function toObject() { + if (!this.isValid) return {}; + return _extends({}, this.values); + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */; + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts, { + includeOffset: false + }); + var dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */; + _proto.toString = function toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Duration { values: " + JSON.stringify(this.values) + " }"; + } else { + return "Duration { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */; + _proto.toMillis = function toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration), + result = {}; + for (var _i2 = 0, _orderedUnits = orderedUnits$1; _i2 < _orderedUnits.length; _i2++) { + var k = _orderedUnits[_i2]; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + for (var _i3 = 0, _Object$keys = Object.keys(this.values); _i3 < _Object$keys.length; _i3++) { + var k = _Object$keys[_i3]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */; + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy, + matrix = _ref.matrix; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }); + var opts = { + loc: loc, + matrix: matrix, + conversionAccuracy: conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */; + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */; + _proto.rescale = function rescale() { + if (!this.isValid) return this; + var vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + for (var _i4 = 0, _orderedUnits2 = orderedUnits$1; _i4 < _orderedUnits2.length; _i4++) { + var k = _orderedUnits2[_i4]; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */; + _proto.shiftToAll = function shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */; + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + for (var _i5 = 0, _Object$keys2 = Object.keys(this.values); _i5 < _Object$keys2.length; _i5++) { + var k = _Object$keys2[_i5]; + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */; + _proto.removeZeros = function removeZeros() { + if (!this.isValid) return this; + var vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */; + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (var _i6 = 0, _orderedUnits3 = orderedUnits$1; _i6 < _orderedUnits3.length; _i6++) { + var u = _orderedUnits3[_i6]; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration; +}(Symbol.for("nodejs.util.inspect.custom")); + +var INVALID$1 = "Invalid Interval"; + +// checks if the start is equal to or before the end +function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } +} + +/** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ +var Interval = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */; + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.after = function after(start, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */; + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + if (s && e) { + var start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s, opts); + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */; + var _proto = Interval.prototype; + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */; + _proto.count = function count(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) return NaN; + var start = this.start.startOf(unit, opts); + var end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(function (a, b) { + return a.toMillis() - b.toMillis(); + }), + results = []; + var s = this.s, + i = 0; + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s = this.s, + idx = 1, + next; + var results = []; + while (s < this.e) { + var added = this.start.plus(dur.mapUnits(function (x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */; + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */; + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */; + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */; + Interval.xor = function xor(intervals) { + var _Array$prototype; + var start = null, + currentCount = 0; + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */; + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Interval { start: " + this.s.toISO() + ", end: " + this.e.toISO() + " }"; + } else { + return "Interval { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */; + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + }, { + key: "lastDateTime", + get: function get() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval; +}(Symbol.for("nodejs.util.inspect.custom")); + +/** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ +var Info = /*#__PURE__*/function () { + function Info() {} + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */; + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */; + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */; + Info.getStartOfWeek = function getStartOfWeek(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$locObj = _ref.locObj, + locObj = _ref$locObj === void 0 ? null : _ref$locObj; + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */; + Info.getMinimumDaysInFirstWeek = function getMinimumDaysInFirstWeek(_temp2) { + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$locObj = _ref2.locObj, + locObj = _ref2$locObj === void 0 ? null : _ref2$locObj; + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */; + Info.getWeekendWeekdays = function getWeekendWeekdays(_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$locObj = _ref3.locObj, + locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */; + Info.months = function months(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, + _ref4$locObj = _ref4.locObj, + locObj = _ref4$locObj === void 0 ? null : _ref4$locObj, + _ref4$outputCalendar = _ref4.outputCalendar, + outputCalendar = _ref4$outputCalendar === void 0 ? "gregory" : _ref4$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */; + Info.monthsFormat = function monthsFormat(length, _temp5) { + if (length === void 0) { + length = "long"; + } + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale, + _ref5$numberingSystem = _ref5.numberingSystem, + numberingSystem = _ref5$numberingSystem === void 0 ? null : _ref5$numberingSystem, + _ref5$locObj = _ref5.locObj, + locObj = _ref5$locObj === void 0 ? null : _ref5$locObj, + _ref5$outputCalendar = _ref5.outputCalendar, + outputCalendar = _ref5$outputCalendar === void 0 ? "gregory" : _ref5$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */; + Info.weekdays = function weekdays(length, _temp6) { + if (length === void 0) { + length = "long"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale, + _ref6$numberingSystem = _ref6.numberingSystem, + numberingSystem = _ref6$numberingSystem === void 0 ? null : _ref6$numberingSystem, + _ref6$locObj = _ref6.locObj, + locObj = _ref6$locObj === void 0 ? null : _ref6$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */; + Info.weekdaysFormat = function weekdaysFormat(length, _temp7) { + if (length === void 0) { + length = "long"; + } + var _ref7 = _temp7 === void 0 ? {} : _temp7, + _ref7$locale = _ref7.locale, + locale = _ref7$locale === void 0 ? null : _ref7$locale, + _ref7$numberingSystem = _ref7.numberingSystem, + numberingSystem = _ref7$numberingSystem === void 0 ? null : _ref7$numberingSystem, + _ref7$locObj = _ref7.locObj, + locObj = _ref7$locObj === void 0 ? null : _ref7$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */; + Info.meridiems = function meridiems(_temp8) { + var _ref8 = _temp8 === void 0 ? {} : _temp8, + _ref8$locale = _ref8.locale, + locale = _ref8$locale === void 0 ? null : _ref8$locale; + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */; + Info.eras = function eras(length, _temp9) { + if (length === void 0) { + length = "short"; + } + var _ref9 = _temp9 === void 0 ? {} : _temp9, + _ref9$locale = _ref9.locale, + locale = _ref9$locale === void 0 ? null : _ref9$locale; + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */; + Info.features = function features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + }; + return Info; +}(); + +function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); +} +function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["quarters", function (a, b) { + return b.quarter - a.quarter + (b.year - a.year) * 4; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var earlier = cursor; + var lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; +} +function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus; + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[lowestOrder] = 1, _cursor$plus)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } +} + +var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; +function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; +} +var NBSP = String.fromCharCode(160); +var spaceOrNBSP = "[ " + NBSP + "]"; +var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); +function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); +} +function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); +} +function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } +} +function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; +} +function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; +} +function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); +} + +/** + * @param token + * @param {Locale} loc + */ +function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; +} +var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } +}; +function tokenForPart(part, formatOpts, resolvedOpts) { + var type = part.type, + value = part.value; + if (type === "literal") { + var isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + var style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + var actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + var val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val: val + }; + } + return undefined; +} +function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; +} +function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } +} +function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; +} +var dummyDateTimeCache = null; +function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; +} +function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + var tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; +} +function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); +} + +/** + * @private + */ + +var TokenParser = /*#__PURE__*/function () { + function TokenParser(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(function (t) { + return unitForToken(t, locale); + }); + this.disqualifyingUnit = this.units.find(function (t) { + return t.invalidReason; + }); + if (!this.disqualifyingUnit) { + var _buildRegex = buildRegex(this.units), + regexString = _buildRegex[0], + handlers = _buildRegex[1]; + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + var _proto = TokenParser.prototype; + _proto.explainFromTokens = function explainFromTokens(input) { + if (!this.isValid) { + return { + input: input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + var _match = match(input, this.regex, this.handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, undefined], + result = _ref6[0], + zone = _ref6[1], + specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input: input, + tokens: this.tokens, + regex: this.regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone, + specificOffset: specificOffset + }; + } + }; + _createClass(TokenParser, [{ + key: "isValid", + get: function get() { + return !this.disqualifyingUnit; + } + }, { + key: "invalidReason", + get: function get() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } + }]); + return TokenParser; +}(); +function explainFromTokens(locale, input, format) { + var parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); +} +function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + specificOffset = _explainFromTokens.specificOffset, + invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; +} +function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + var formatter = Formatter.create(locale, formatOpts); + var df = formatter.dtFormatter(getDummyDateTime()); + var parts = df.formatToParts(); + var resolvedOpts = df.resolvedOptions(); + return parts.map(function (p) { + return tokenForPart(p, formatOpts, resolvedOpts); + }); +} + +var INVALID = "Invalid DateTime"; +var MAX_DATE = 8.64e15; +function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); +} + +// we cache week data on the DT object and this intermediates the cache +/** + * @param {DateTime} dt + */ +function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; +} + +/** + * @param {DateTime} dt + */ +function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; +} + +// clone really means, "make a new object with these modifications". all "setters" really use this +// to create a new object while only changing some of the properties +function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(_extends({}, current, alts, { + old: current + })); +} + +// find the right offset a given local time. The o input is our guess, which determines which +// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) +function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + var o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; +} + +// convert an epoch timestamp into a calendar object with the given offset +function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; +} + +// convert a calendar object to a epoch timestamp +function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); +} + +// create a new DT instance by adding a duration, adjusting for DSTs +function adjustTime(inst, dur) { + var oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = _extends({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts: ts, + o: o + }; +} + +// helper useful in turning the results of parsing into real dates +// by handling the zone options +function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + var setZone = opts.setZone, + zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset: specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } +} + +// if you want to output a technical format (e.g. RFC 2822), this helper +// helps handle the details +function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; +} +function _toISODate(o, extended, precision) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; +} +function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; +} + +// defaults for unspecified units in the supported calendars +var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + +// Units in the supported calendars, sorted by bigness +var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + +// standardize case and plurality in units +function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; +} +function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } +} + +// cache offsets for zones based on the current timestamp when this function is +// first called. When we are handling a datetime from components like (year, +// month, day, hour) in a time zone, we need a guess about what the timezone +// offset is so that we can convert into a UTC timestamp. One way is to find the +// offset of now in the zone. The actual date may have a different offset (for +// example, if we handle a date in June while we're in December in a zone that +// observes DST), but we can check and adjust that. +// +// When handling many dates, calculating the offset for now every time is +// expensive. It's just a guess, so we can cache the offset to use even if we +// are right on a time change boundary (we'll just correct in the other +// direction). Using a timestamp from first read is a slight optimization for +// handling dates close to the current date, since those dates will usually be +// in the same offset (we could set the timestamp statically, instead). We use a +// single timestamp for all zones to make things a bit more predictable. +// +// This is safe for quickDT (used by local() and utc()) because we don't fill in +// higher-order units from tsNow (as we do in fromObject, this requires that +// offset is calculated from tsNow). +/** + * @param {Zone} zone + * @return {number} + */ +function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + var zoneName = zone.name; + var offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; +} + +// this is a dumbed down version of fromObject() that runs about 60% faster +// but doesn't do any validation, makes a bunch of assumptions about what units +// are present, and so on. +function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + var loc = Locale.fromObject(opts); + var ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (var _i = 0, _orderedUnits = orderedUnits; _i < _orderedUnits.length; _i++) { + var u = _orderedUnits[_i]; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + var offsetProvis = guessOffsetForZone(zone); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = Settings.now(); + } + return new DateTime({ + ts: ts, + zone: zone, + loc: loc, + o: o + }); +} +function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator = _createForOfIteratorHelperLoose(opts.units), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); +} +function lastOpts(argList) { + var opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; +} + +/** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ +var zoneOffsetTs; +/** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ +var zoneOffsetGuessCache = new Map(); + +/** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ +var DateTime = /*#__PURE__*/function (_Symbol$for) { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c = _ref[0]; + o = _ref[1]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + var ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + DateTime.now = function now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */; + DateTime.local = function local() { + var _lastOpts = lastOpts(arguments), + opts = _lastOpts[0], + args = _lastOpts[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */; + DateTime.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), + opts = _lastOpts2[0], + args = _lastOpts2[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */; + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */; + DateTime.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + var loc = Locale.fromObject(opts); + var normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues = usesLocalWeekValues(normalized, loc), + minDaysInFirstWeek = _usesLocalWeekValues.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues.startOfWeek; + var tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + var foundFirst = false; + for (var _iterator2 = _createForOfIteratorHelperLoose(units), _step2; !(_step2 = _iterator2()).done;) { + var u = _step2.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + var gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */; + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */; + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */; + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + specificOffset = _parseFromTokens[2], + invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */; + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */; + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */; + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */; + DateTime.parseFormatForOpts = function parseFormatForOpts(formatOpts, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(function (t) { + return t ? t.val : null; + }).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */; + DateTime.expandFormat = function expandFormat(fmt, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(function (t) { + return t.val; + }).join(""); + }; + DateTime.resetCache = function resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */; + var _proto = DateTime.prototype; + _proto.get = function get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */; + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + _proto.getPossibleOffsets = function getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + var dayMs = 86400000; + var minuteMs = 60000; + var localTS = objToLocalTS(this.c); + var oEarlier = this.zone.offset(localTS - dayMs); + var oLater = this.zone.offset(localTS + dayMs); + var o1 = this.zone.offset(localTS - oEarlier * minuteMs); + var o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + var ts1 = localTS - o1 * minuteMs; + var ts2 = localTS - o2 * minuteMs; + var c1 = tsToObj(ts1, o1); + var c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */; + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */; + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + _ref2$keepLocalTime = _ref2.keepLocalTime, + keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, + _ref2$keepCalendarTim = _ref2.keepCalendarTime, + keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone: zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + locale = _ref3.locale, + numberingSystem = _ref3.numberingSystem, + outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone(this, { + loc: loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues2 = usesLocalWeekValues(normalized, this.loc), + minDaysInFirstWeek = _usesLocalWeekValues2.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues2.startOfWeek; + var settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), normalized), minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + return clone(this, { + ts: ts, + o: o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */; + _proto.startOf = function startOf(unit, _temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, + _ref4$useLocaleWeeks = _ref4.useLocaleWeeks, + useLocaleWeeks = _ref4$useLocaleWeeks === void 0 ? false : _ref4$useLocaleWeeks; + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + var startOfWeek = this.loc.getStartOfWeek(); + var weekday = this.weekday; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */; + _proto.endOf = function endOf(unit, opts) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */; + _proto.toISO = function toISO(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format, + _ref5$suppressSeconds = _ref5.suppressSeconds, + suppressSeconds = _ref5$suppressSeconds === void 0 ? false : _ref5$suppressSeconds, + _ref5$suppressMillise = _ref5.suppressMilliseconds, + suppressMilliseconds = _ref5$suppressMillise === void 0 ? false : _ref5$suppressMillise, + _ref5$includeOffset = _ref5.includeOffset, + includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, + _ref5$extendedZone = _ref5.extendedZone, + extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone, + _ref5$precision = _ref5.precision, + precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var ext = format === "extended"; + var c = _toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */; + _proto.toISODate = function toISODate(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format, + _ref6$precision = _ref6.precision, + precision = _ref6$precision === void 0 ? "day" : _ref6$precision; + if (!this.isValid) { + return null; + } + return _toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */; + _proto.toISOTime = function toISOTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressMillise = _ref7.suppressMilliseconds, + suppressMilliseconds = _ref7$suppressMillise === void 0 ? false : _ref7$suppressMillise, + _ref7$suppressSeconds = _ref7.suppressSeconds, + suppressSeconds = _ref7$suppressSeconds === void 0 ? false : _ref7$suppressSeconds, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includePrefix = _ref7.includePrefix, + includePrefix = _ref7$includePrefix === void 0 ? false : _ref7$includePrefix, + _ref7$extendedZone = _ref7.extendedZone, + extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, + _ref7$format = _ref7.format, + format = _ref7$format === void 0 ? "extended" : _ref7$format, + _ref7$precision = _ref7.precision, + precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */; + _proto.toSQLTime = function toSQLTime(_temp7) { + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$includeOffset = _ref8.includeOffset, + includeOffset = _ref8$includeOffset === void 0 ? true : _ref8$includeOffset, + _ref8$includeZone = _ref8.includeZone, + includeZone = _ref8$includeZone === void 0 ? false : _ref8$includeZone, + _ref8$includeOffsetSp = _ref8.includeOffsetSpace, + includeOffsetSpace = _ref8$includeOffsetSp === void 0 ? true : _ref8$includeOffsetSp; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "DateTime { ts: " + this.toISO() + ", zone: " + this.zone.name + ", locale: " + this.locale + " }"; + } else { + return "DateTime { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */; + _proto.toUnixInteger = function toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */; + _proto.hasSame = function hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units: units, + unit: unit + })); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */; + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */; + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */; + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */; + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */; + DateTime.buildFormatParser = function buildFormatParser(fmt, options) { + if (options === void 0) { + options = {}; + } + var _options2 = options, + _options2$locale = _options2.locale, + locale = _options2$locale === void 0 ? null : _options2$locale, + _options2$numberingSy = _options2.numberingSystem, + numberingSystem = _options2$numberingSy === void 0 ? null : _options2$numberingSy, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */; + DateTime.fromFormatParser = function fromFormatParser(text, formatParser, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + var _opts2 = opts, + _opts2$locale = _opts2.locale, + locale = _opts2$locale === void 0 ? null : _opts2$locale, + _opts2$numberingSyste = _opts2.numberingSystem, + numberingSystem = _opts2$numberingSyste === void 0 ? null : _opts2$numberingSyste, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError("fromFormatParser called with a locale of " + localeToUse + ", " + ("but the format parser was created for " + formatParser.locale)); + } + var _formatParser$explain = formatParser.explainFromTokens(text), + result = _formatParser$explain.result, + zone = _formatParser$explain.zone, + specificOffset = _formatParser$explain.specificOffset, + invalidReason = _formatParser$explain.invalidReason; + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, "format " + formatParser.format, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */; + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + }, { + key: "zone", + get: function get() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + }, { + key: "isWeekend", + get: function get() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + }, { + key: "localWeekday", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + }, { + key: "localWeekNumber", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + }, { + key: "localWeekYear", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + }, { + key: "weeksInLocalWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime; +}(Symbol.for("nodejs.util.inspect.custom")); +function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } +} + +var VERSION = "3.7.2"; + +exports.DateTime = DateTime; +exports.Duration = Duration; +exports.FixedOffsetZone = FixedOffsetZone; +exports.IANAZone = IANAZone; +exports.Info = Info; +exports.Interval = Interval; +exports.InvalidZone = InvalidZone; +exports.Settings = Settings; +exports.SystemZone = SystemZone; +exports.VERSION = VERSION; +exports.Zone = Zone; +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/cjs-browser/luxon.js.map b/node_modules/luxon/build/cjs-browser/luxon.js.map new file mode 100644 index 0000000..e965cb9 --- /dev/null +++ b/node_modules/luxon/build/cjs-browser/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","_Error","_inheritsLoose","apply","arguments","_wrapNativeSuper","Error","InvalidDateTimeError","_LuxonError","reason","call","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","prototype","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","_createClass","key","get","name","singleton","SystemZone","_Zone","_ref","locale","parseZoneInfo","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","Map","makeDTF","zoneName","dtf","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","_formatted$i","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","_this","valid","NaN","isNaN","_ref2","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","_opts","base","cacheKeyOpts","_objectWithoutPropertiesLoose","_excluded","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","_extends","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","_options","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","_excluded2","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_proto3","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","_temp","numbering","_parseLocaleString","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","_this2","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","_this3","meridiems","_this4","eras","_this5","field","df","results","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","instance","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","_iterator","_createForOfIteratorHelperLoose","_step","done","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","_len","regexes","_key","full","source","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","_parseISODuration","fromISOTime","_parseISOTimeOnly","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","invalidReason","valueOf","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","_i4","_orderedUnits2","own","ak","negated","_i5","_Object$keys2","removeZeros","eq","v1","v2","_i6","_orderedUnits3","Symbol","for","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","_split","startIsValid","endIsValid","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","sofar","final","xor","_Array$prototype","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8","_ref8$locale","_temp9","_ref9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","_differs","_differs$_i","differ","_highOrderDiffs","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","_buildRegex","regexString","explainFromTokens","_match","rawMatches","parser","parseFromTokens","_explainFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","ianaName","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","_objToTS","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","_iterator2","_step2","higherOrderInvalid","gregorian","_objToTS2","tsFinal","offsetFinal","_parseISODate","fromRFC2822","_parseRFC2822Date","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","resolvedLocaleOptions","_Formatter$create$res","toLocal","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","newTS","asObj","_objToTS3","setLocale","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/es6/luxon.mjs b/node_modules/luxon/build/es6/luxon.mjs new file mode 100644 index 0000000..06e1d6c --- /dev/null +++ b/node_modules/luxon/build/es6/luxon.mjs @@ -0,0 +1,8133 @@ +// these aren't really private, but nor are they really useful to document + +/** + * @private + */ +class LuxonError extends Error {} + +/** + * @private + */ +class InvalidDateTimeError extends LuxonError { + constructor(reason) { + super(`Invalid DateTime: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidIntervalError extends LuxonError { + constructor(reason) { + super(`Invalid Interval: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidDurationError extends LuxonError { + constructor(reason) { + super(`Invalid Duration: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class ConflictingSpecificationError extends LuxonError {} + +/** + * @private + */ +class InvalidUnitError extends LuxonError { + constructor(unit) { + super(`Invalid unit ${unit}`); + } +} + +/** + * @private + */ +class InvalidArgumentError extends LuxonError {} + +/** + * @private + */ +class ZoneIsAbstractError extends LuxonError { + constructor() { + super("Zone is an abstract class"); + } +} + +/** + * @private + */ + +const n = "numeric", + s = "short", + l = "long"; + +const DATE_SHORT = { + year: n, + month: n, + day: n, +}; + +const DATE_MED = { + year: n, + month: s, + day: n, +}; + +const DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, +}; + +const DATE_FULL = { + year: n, + month: l, + day: n, +}; + +const DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l, +}; + +const TIME_SIMPLE = { + hour: n, + minute: n, +}; + +const TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n, +}; + +const TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s, +}; + +const TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l, +}; + +const TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23", +}; + +const TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", +}; + +const TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s, +}; + +const TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l, +}; + +const DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n, +}; + +const DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n, +}; + +const DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n, +}; + +const DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n, +}; + +const DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n, +}; + +const DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s, +}; + +const DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s, +}; + +const DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l, +}; + +const DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l, +}; + +/** + * @interface + */ +class Zone { + /** + * The type of zone + * @abstract + * @type {string} + */ + get type() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + get name() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + get ianaName() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + get isUniversal() { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */ + get isValid() { + throw new ZoneIsAbstractError(); + } +} + +let singleton$1 = null; + +/** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ +class SystemZone extends Zone { + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + static get instance() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + + /** @override **/ + get type() { + return "system"; + } + + /** @override **/ + get name() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName(ts, { format, locale }) { + return parseZoneInfo(ts, format, locale); + } + + /** @override **/ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/ + offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/ + equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/ + get isValid() { + return true; + } +} + +const dtfCache = new Map(); +function makeDTF(zoneName) { + let dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short", + }); + dtfCache.set(zoneName, dtf); + } + return dtf; +} + +const typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6, +}; + +function hackyOffset(dtf, date) { + const formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; +} + +function partsOffset(dtf, date) { + const formatted = dtf.formatToParts(date); + const filled = []; + for (let i = 0; i < formatted.length; i++) { + const { type, value } = formatted[i]; + const pos = typeToPos[type]; + + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; +} + +const ianaZoneCache = new Map(); +/** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ +class IANAZone extends Zone { + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + static create(name) { + let zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, (zone = new IANAZone(name))); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */ + static isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */ + static isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { timeZone: zone }).format(); + return true; + } catch (e) { + return false; + } + } + + constructor(name) { + super(); + /** @private **/ + this.zoneName = name; + /** @private **/ + this.valid = IANAZone.isValidZone(name); + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + get type() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + get name() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return false; + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, { format, locale }) { + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + if (!this.valid) return NaN; + const date = new Date(ts); + + if (isNaN(date)) return NaN; + + const dtf = makeDTF(this.name); + let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts + ? partsOffset(dtf, date) + : hackyOffset(dtf, date); + + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + const adjustedHour = hour === 24 ? 0 : hour; + + const asUTC = objToLocalTS({ + year, + month, + day, + hour: adjustedHour, + minute, + second, + millisecond: 0, + }); + + let asTS = +date; + const over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */ + get isValid() { + return this.valid; + } +} + +// todo - remap caching + +let intlLFCache = {}; +function getCachedLF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; +} + +const intlDTCache = new Map(); +function getCachedDTF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; +} + +const intlNumCache = new Map(); +function getCachedINF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; +} + +const intlRelCache = new Map(); +function getCachedRTF(locString, opts = {}) { + const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options + const key = JSON.stringify([locString, cacheKeyOpts]); + let inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; +} + +let sysLocaleCache = null; +function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } +} + +const intlResolvedOptionsCache = new Map(); +function getCachedIntResolvedOptions(locString) { + let opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; +} + +const weekInfoCache = new Map(); +function getCachedWeekInfo(locString) { + let data = weekInfoCache.get(locString); + if (!data) { + const locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = { ...fallbackWeekSettings, ...data }; + } + weekInfoCache.set(locString, data); + } + return data; +} + +function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + const xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + + const uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + let options; + let selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + const smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + + const { numberingSystem, calendar } = options; + return [selectedStr, numberingSystem, calendar]; + } +} + +function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + + if (outputCalendar) { + localeStr += `-ca-${outputCalendar}`; + } + + if (numberingSystem) { + localeStr += `-nu-${numberingSystem}`; + } + return localeStr; + } else { + return localeStr; + } +} + +function mapMonths(f) { + const ms = []; + for (let i = 1; i <= 12; i++) { + const dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; +} + +function mapWeekdays(f) { + const ms = []; + for (let i = 1; i <= 7; i++) { + const dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; +} + +function listStuff(loc, length, englishFn, intlFn) { + const mode = loc.listingMode(); + + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } +} + +function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return ( + loc.numberingSystem === "latn" || + !loc.locale || + loc.locale.startsWith("en") || + getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn" + ); + } +} + +/** + * @private + */ + +class PolyNumberFormatter { + constructor(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + + const { padTo, floor, ...otherOpts } = opts; + + if (!forceSimple || Object.keys(otherOpts).length > 0) { + const intlOpts = { useGrouping: false, ...opts }; + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + + format(i) { + if (this.inf) { + const fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + const fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(fixed, this.padTo); + } + } +} + +/** + * @private + */ + +class PolyDateFormatter { + constructor(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + + let z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + const gmtOffset = -1 * (dt.offset / 60); + const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ minutes: dt.offset }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ minutes: dt.offset }); + this.originalZone = dt.zone; + } + + const intlOpts = { ...this.opts }; + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + + format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts() + .map(({ value }) => value) + .join(""); + } + return this.dtf.format(this.dt.toJSDate()); + } + + formatToParts() { + const parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map((part) => { + if (part.type === "timeZoneName") { + const offsetName = this.originalZone.offsetName(this.dt.ts, { + locale: this.dt.locale, + format: this.opts.timeZoneName, + }); + return { + ...part, + value: offsetName, + }; + } else { + return part; + } + }); + } + return parts; + } + + resolvedOptions() { + return this.dtf.resolvedOptions(); + } +} + +/** + * @private + */ +class PolyRelFormatter { + constructor(intl, isEnglish, opts) { + this.opts = { style: "long", ...opts }; + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + + format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + } + + formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + } +} + +const fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7], +}; + +/** + * @private + */ +class Locale { + static fromOpts(opts) { + return Locale.create( + opts.locale, + opts.numberingSystem, + opts.outputCalendar, + opts.weekSettings, + opts.defaultToEN + ); + } + + static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) { + const specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + const localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + } + + static resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + } + + static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) { + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + } + + constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale); + + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + + this.weekdaysCache = { format: {}, standalone: {} }; + this.monthsCache = { format: {}, standalone: {} }; + this.meridiemCache = null; + this.eraCache = {}; + + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + + get fastNumbers() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + + return this.fastNumbersCached; + } + + listingMode() { + const isActuallyEn = this.isEnglish(); + const hasNoWeirdness = + (this.numberingSystem === null || this.numberingSystem === "latn") && + (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + } + + clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create( + alts.locale || this.specifiedLocale, + alts.numberingSystem || this.numberingSystem, + alts.outputCalendar || this.outputCalendar, + validateWeekSettings(alts.weekSettings) || this.weekSettings, + alts.defaultToEN || false + ); + } + } + + redefaultToEN(alts = {}) { + return this.clone({ ...alts, defaultToEN: true }); + } + + redefaultToSystem(alts = {}) { + return this.clone({ ...alts, defaultToEN: false }); + } + + months(length, format = false) { + return listStuff(this, length, months, () => { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + const monthSpecialCase = this.intl === "ja" || this.intl.startsWith("ja-"); + format &= !monthSpecialCase; + const intl = format ? { month: length, day: "numeric" } : { month: length }, + formatStr = format ? "format" : "standalone"; + if (!this.monthsCache[formatStr][length]) { + const mapper = !monthSpecialCase + ? (dt) => this.extract(dt, intl, "month") + : (dt) => this.dtFormatter(dt, intl).format(); + this.monthsCache[formatStr][length] = mapMonths(mapper); + } + return this.monthsCache[formatStr][length]; + }); + } + + weekdays(length, format = false) { + return listStuff(this, length, weekdays, () => { + const intl = format + ? { weekday: length, year: "numeric", month: "long", day: "numeric" } + : { weekday: length }, + formatStr = format ? "format" : "standalone"; + if (!this.weekdaysCache[formatStr][length]) { + this.weekdaysCache[formatStr][length] = mapWeekdays((dt) => + this.extract(dt, intl, "weekday") + ); + } + return this.weekdaysCache[formatStr][length]; + }); + } + + meridiems() { + return listStuff( + this, + undefined, + () => meridiems, + () => { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!this.meridiemCache) { + const intl = { hour: "numeric", hourCycle: "h12" }; + this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map( + (dt) => this.extract(dt, intl, "dayperiod") + ); + } + + return this.meridiemCache; + } + ); + } + + eras(length) { + return listStuff(this, length, eras, () => { + const intl = { era: length }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!this.eraCache[length]) { + this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) => + this.extract(dt, intl, "era") + ); + } + + return this.eraCache[length]; + }); + } + + extract(dt, intlOpts, field) { + const df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find((m) => m.type.toLowerCase() === field); + return matching ? matching.value : null; + } + + numberFormatter(opts = {}) { + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + } + + dtFormatter(dt, intlOpts = {}) { + return new PolyDateFormatter(dt, this.intl, intlOpts); + } + + relFormatter(opts = {}) { + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + } + + listFormatter(opts = {}) { + return getCachedLF(this.intl, opts); + } + + isEnglish() { + return ( + this.locale === "en" || + this.locale.toLowerCase() === "en-us" || + getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us") + ); + } + + getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + } + + getStartOfWeek() { + return this.getWeekSettings().firstDay; + } + + getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + } + + getWeekendDays() { + return this.getWeekSettings().weekend; + } + + equals(other) { + return ( + this.locale === other.locale && + this.numberingSystem === other.numberingSystem && + this.outputCalendar === other.outputCalendar + ); + } + + toString() { + return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`; + } +} + +let singleton = null; + +/** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ +class FixedOffsetZone extends Zone { + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + static get utcInstance() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + static instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */ + static parseSpecifier(s) { + if (s) { + const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + } + + constructor(offset) { + super(); + /** @private **/ + this.fixed = offset; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + get type() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + get name() { + return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`; + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + get ianaName() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return `Etc/GMT${formatOffset(-this.fixed, "narrow")}`; + } + } + + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return true; + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */ + get isValid() { + return true; + } +} + +/** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ +class InvalidZone extends Zone { + constructor(zoneName) { + super(); + /** @private */ + this.zoneName = zoneName; + } + + /** @override **/ + get type() { + return "invalid"; + } + + /** @override **/ + get name() { + return this.zoneName; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName() { + return null; + } + + /** @override **/ + formatOffset() { + return ""; + } + + /** @override **/ + offset() { + return NaN; + } + + /** @override **/ + equals() { + return false; + } + + /** @override **/ + get isValid() { + return false; + } +} + +/** + * @private + */ + +function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + const lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone; + else if (lowered === "local" || lowered === "system") return SystemZone.instance; + else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance; + else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } +} + +const numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d", +}; + +const numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881], +}; + +const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + +function parseDigits(str) { + let value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (let i = 0; i < str.length; i++) { + const code = str.charCodeAt(i); + + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (const key in numberingSystemsUTF16) { + const [min, max] = numberingSystemsUTF16[key]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } +} + +// cache of {numberingSystem: {append: regex}} +const digitRegexCache = new Map(); +function resetDigitRegexCache() { + digitRegexCache.clear(); +} + +function digitRegex({ numberingSystem }, append = "") { + const ns = numberingSystem || "latn"; + + let appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + let regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp(`${numberingSystems[ns]}${append}`); + appendCache.set(append, regex); + } + + return regex; +} + +let now = () => Date.now(), + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + +/** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ +class Settings { + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + static get now() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */ + static set now(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + static set defaultZone(zone) { + defaultZone = zone; + } + + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + static get defaultZone() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultLocale() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultLocale(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultNumberingSystem() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultNumberingSystem(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultOutputCalendar() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultOutputCalendar(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + static get defaultWeekSettings() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */ + static set defaultWeekSettings(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + static get twoDigitCutoffYear() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */ + static set twoDigitCutoffYear(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static get throwOnInvalid() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static set throwOnInvalid(t) { + throwOnInvalid = t; + } + + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + } +} + +class Invalid { + constructor(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + + toMessage() { + if (this.explanation) { + return `${this.reason}: ${this.explanation}`; + } else { + return this.reason; + } + } +} + +const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + +function unitOutOfRange(unit, value) { + return new Invalid( + "unit out of range", + `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid` + ); +} + +function dayOfWeek(year, month, day) { + const d = new Date(Date.UTC(year, month - 1, day)); + + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + + const js = d.getUTCDay(); + + return js === 0 ? 7 : js; +} + +function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; +} + +function uncomputeOrdinal(year, ordinal) { + const table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex((i) => i < ordinal), + day = ordinal - table[month0]; + return { month: month0 + 1, day }; +} + +function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return ((isoWeekday - startOfWeek + 7) % 7) + 1; +} + +/** + * @private + */ + +function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { year, month, day } = gregObj, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + + let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + + return { weekYear, weekNumber, weekday, ...timeObject(gregObj) }; +} + +function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { weekYear, weekNumber, weekday } = weekData, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + + let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + + const { month, day } = uncomputeOrdinal(year, ordinal); + return { year, month, day, ...timeObject(weekData) }; +} + +function gregorianToOrdinal(gregData) { + const { year, month, day } = gregData; + const ordinal = computeOrdinal(year, month, day); + return { year, ordinal, ...timeObject(gregData) }; +} + +function ordinalToGregorian(ordinalData) { + const { year, ordinal } = ordinalData; + const { month, day } = uncomputeOrdinal(year, ordinal); + return { year, month, day, ...timeObject(ordinalData) }; +} + +/** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ +function usesLocalWeekValues(obj, loc) { + const hasLocaleWeekData = + !isUndefined(obj.localWeekday) || + !isUndefined(obj.localWeekNumber) || + !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + const hasIsoWeekData = + !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + + if (hasIsoWeekData) { + throw new ConflictingSpecificationError( + "Cannot mix locale-based week fields with ISO-based week fields" + ); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek(), + }; + } else { + return { minDaysInFirstWeek: 4, startOfWeek: 1 }; + } +} + +function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const validYear = isInteger(obj.weekYear), + validWeek = integerBetween( + obj.weekNumber, + 1, + weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek) + ), + validWeekday = integerBetween(obj.weekday, 1, 7); + + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; +} + +function hasInvalidOrdinalData(obj) { + const validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; +} + +function hasInvalidGregorianData(obj) { + const validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; +} + +function hasInvalidTimeData(obj) { + const { hour, minute, second, millisecond } = obj; + const validHour = + integerBetween(hour, 0, 23) || + (hour === 24 && minute === 0 && second === 0 && millisecond === 0), + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; +} + +/* + This is just a junk drawer, containing anything used across multiple classes. + Because Luxon is small(ish), this should stay small and we won't worry about splitting + it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. +*/ + +/** + * @private + */ + +// TYPES + +function isUndefined(o) { + return typeof o === "undefined"; +} + +function isNumber(o) { + return typeof o === "number"; +} + +function isInteger(o) { + return typeof o === "number" && o % 1 === 0; +} + +function isString(o) { + return typeof o === "string"; +} + +function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; +} + +// CAPABILITIES + +function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } +} + +function hasLocaleWeekInfo() { + try { + return ( + typeof Intl !== "undefined" && + !!Intl.Locale && + ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype) + ); + } catch (e) { + return false; + } +} + +// OBJECTS AND ARRAYS + +function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; +} + +function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce((best, next) => { + const pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; +} + +function pick(obj, keys) { + return keys.reduce((a, k) => { + a[k] = obj[k]; + return a; + }, {}); +} + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if ( + !integerBetween(settings.firstDay, 1, 7) || + !integerBetween(settings.minimalDays, 1, 7) || + !Array.isArray(settings.weekend) || + settings.weekend.some((v) => !integerBetween(v, 1, 7)) + ) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend), + }; + } +} + +// NUMBERS AND STRINGS + +function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; +} + +// x % n but takes the sign of n instead of x +function floorMod(x, n) { + return x - n * Math.floor(x / n); +} + +function padStart(input, n = 2) { + const isNeg = input < 0; + let padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; +} + +function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } +} + +function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } +} + +function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + const f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } +} + +function roundTo(number, digits, rounding = "round") { + const factor = 10 ** digits; + switch (rounding) { + case "expand": + return number > 0 + ? Math.ceil(number * factor) / factor + : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError(`Value rounding ${rounding} is out of range`); + } +} + +// DATE BASICS + +function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} + +function daysInMonth(year, month) { + const modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } +} + +// convert a calendar object to a local timestamp (epoch, but with the offset baked in) +function objToLocalTS(obj) { + let d = Date.UTC( + obj.year, + obj.month - 1, + obj.day, + obj.hour, + obj.minute, + obj.second, + obj.millisecond + ); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; +} + +// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js +function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; +} + +function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) { + const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; +} + +function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; +} + +// PARSING + +function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) { + const date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + }; + + if (timeZone) { + intlOpts.timeZone = timeZone; + } + + const modified = { timeZoneName: offsetFormat, ...intlOpts }; + + const parsed = new Intl.DateTimeFormat(locale, modified) + .formatToParts(date) + .find((m) => m.type.toLowerCase() === "timezonename"); + return parsed ? parsed.value : null; +} + +// signedOffset('-5', '30') -> -330 +function signedOffset(offHourStr, offMinuteStr) { + let offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + + const offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; +} + +// COERCION + +function asNumber(value) { + const numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) + throw new InvalidArgumentError(`Invalid unit value ${value}`); + return numericValue; +} + +function normalizeObject(obj, normalizer) { + const normalized = {}; + for (const u in obj) { + if (hasOwnProperty(obj, u)) { + const v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; +} + +/** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ +function formatOffset(offset, format) { + const hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + + switch (format) { + case "short": + return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`; + case "narrow": + return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`; + case "techie": + return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`; + default: + throw new RangeError(`Value format ${format} is out of range for property format`); + } +} + +function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); +} + +/** + * @private + */ + +const monthsLong = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +const monthsShort = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", +]; + +const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + +function months(length) { + switch (length) { + case "narrow": + return [...monthsNarrow]; + case "short": + return [...monthsShort]; + case "long": + return [...monthsLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } +} + +const weekdaysLong = [ + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", +]; + +const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + +const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + +function weekdays(length) { + switch (length) { + case "narrow": + return [...weekdaysNarrow]; + case "short": + return [...weekdaysShort]; + case "long": + return [...weekdaysLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } +} + +const meridiems = ["AM", "PM"]; + +const erasLong = ["Before Christ", "Anno Domini"]; + +const erasShort = ["BC", "AD"]; + +const erasNarrow = ["B", "A"]; + +function eras(length) { + switch (length) { + case "narrow": + return [...erasNarrow]; + case "short": + return [...erasShort]; + case "long": + return [...erasLong]; + default: + return null; + } +} + +function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; +} + +function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; +} + +function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; +} + +function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; +} + +function formatRelativeTime(unit, count, numeric = "always", narrow = false) { + const units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."], + }; + + const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + + if (numeric === "auto" && lastable) { + const isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : `next ${units[unit][0]}`; + case -1: + return isDay ? "yesterday" : `last ${units[unit][0]}`; + case 0: + return isDay ? "today" : `this ${units[unit][0]}`; + } + } + + const isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow + ? singular + ? lilUnits[1] + : lilUnits[2] || lilUnits[1] + : singular + ? units[unit][0] + : unit; + return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; +} + +function stringifyTokens(splits, tokenToString) { + let s = ""; + for (const token of splits) { + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; +} + +const macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS, +}; + +/** + * @private + */ + +class Formatter { + static create(locale, opts = {}) { + return new Formatter(locale, opts); + } + + static parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + let current = null, + currentFull = "", + bracketed = false; + const splits = []; + for (let i = 0; i < fmt.length; i++) { + const c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull, + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ literal: /^\s+$/.test(currentFull), val: currentFull }); + } + currentFull = c; + current = c; + } + } + + if (currentFull.length > 0) { + splits.push({ literal: bracketed || /^\s+$/.test(currentFull), val: currentFull }); + } + + return splits; + } + + static macroTokenToFormatOpts(token) { + return macroTokenToFormatOpts[token]; + } + + constructor(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + + formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts }); + return df.format(); + } + + dtFormatter(dt, opts = {}) { + return this.loc.dtFormatter(dt, { ...this.opts, ...opts }); + } + + formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + } + + formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + } + + formatInterval(interval, opts) { + const df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + } + + resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + } + + num(n, p = 0, signDisplay = undefined) { + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + + const opts = { ...this.opts }; + + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + + return this.loc.numberFormatter(opts).format(n); + } + + formatDateTimeFromString(dt, fmt) { + const knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = (opts, extract) => this.loc.extract(dt, opts, extract), + formatOffset = (opts) => { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = () => + knownEnglish + ? meridiemForDateTime(dt) + : string({ hour: "numeric", hourCycle: "h12" }, "dayperiod"), + month = (length, standalone) => + knownEnglish + ? monthForDateTime(dt, length) + : string(standalone ? { month: length } : { month: length, day: "numeric" }, "month"), + weekday = (length, standalone) => + knownEnglish + ? weekdayForDateTime(dt, length) + : string( + standalone ? { weekday: length } : { weekday: length, month: "long", day: "numeric" }, + "weekday" + ), + maybeMacro = (token) => { + const formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = (length) => + knownEnglish ? eraForDateTime(dt, length) : string({ era: length }, "era"), + tokenToString = (token) => { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return this.num(dt.millisecond, 3); + // seconds + case "s": + return this.num(dt.second); + case "ss": + return this.num(dt.second, 2); + // fractional seconds + case "uu": + return this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return this.num(dt.minute); + case "mm": + return this.num(dt.minute, 2); + // hours + case "h": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return this.num(dt.hour); + case "HH": + return this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ format: "narrow", allowZ: this.opts.allowZ }); + case "ZZ": + // like +06:00 + return formatOffset({ format: "short", allowZ: this.opts.allowZ }); + case "ZZZ": + // like +0600 + return formatOffset({ format: "techie", allowZ: this.opts.allowZ }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { format: "short", locale: this.loc.locale }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { format: "long", locale: this.loc.locale }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ day: "numeric" }, "day") : this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ day: "2-digit" }, "day") : this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter + ? string({ month: "numeric", day: "numeric" }, "month") + : this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter + ? string({ month: "2-digit", day: "numeric" }, "month") + : this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter + ? string({ month: "numeric" }, "month") + : this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter + ? string({ month: "2-digit" }, "month") + : this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ year: "numeric" }, "year") : this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter + ? string({ year: "2-digit" }, "year") + : this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter + ? string({ year: "numeric" }, "year") + : this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter + ? string({ year: "numeric" }, "year") + : this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return this.num(dt.weekYear, 4); + case "W": + return this.num(dt.weekNumber); + case "WW": + return this.num(dt.weekNumber, 2); + case "n": + return this.num(dt.localWeekNumber); + case "nn": + return this.num(dt.localWeekNumber, 2); + case "ii": + return this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return this.num(dt.localWeekYear, 4); + case "o": + return this.num(dt.ordinal); + case "ooo": + return this.num(dt.ordinal, 3); + case "q": + // like 1 + return this.num(dt.quarter); + case "qq": + // like 01 + return this.num(dt.quarter, 2); + case "X": + return this.num(Math.floor(dt.ts / 1000)); + case "x": + return this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + } + + formatDurationFromString(dur, fmt) { + const invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + const tokenToField = (token) => { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = (lildur, info) => (token) => { + const mapped = tokenToField(token); + if (mapped) { + const inversionFactor = + info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + let signDisplay; + if (this.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (this.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce( + (found, { literal, val }) => (literal ? found : found.concat(val)), + [] + ), + collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0], + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + } +} + +/* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + +const ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; + +function combineRegexes(...regexes) { + const full = regexes.reduce((f, r) => f + r.source, ""); + return RegExp(`^${full}$`); +} + +function combineExtractors(...extractors) { + return (m) => + extractors + .reduce( + ([mergedVals, mergedZone, cursor], ex) => { + const [val, zone, next] = ex(m, cursor); + return [{ ...mergedVals, ...val }, zone || mergedZone, next]; + }, + [{}, null, 1] + ) + .slice(0, 2); +} + +function parse(s, ...patterns) { + if (s == null) { + return [null, null]; + } + + for (const [regex, extractor] of patterns) { + const m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; +} + +function simpleParse(...keys) { + return (match, cursor) => { + const ret = {}; + let i; + + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; +} + +// ISO and SQL parsing +const offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; +const isoExtendedZone = `(?:${offsetRegex.source}?(?:\\[(${ianaRegex.source})\\])?)?`; +const isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; +const isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`); +const isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`); +const isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; +const isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; +const isoOrdinalRegex = /(\d{4})-?(\d{3})/; +const extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); +const extractISOOrdinalData = simpleParse("year", "ordinal"); +const sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one +const sqlTimeRegex = RegExp( + `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?` +); +const sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`); + +function int(match, pos, fallback) { + const m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); +} + +function extractISOYmd(match, cursor) { + const item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1), + }; + + return [item, null, cursor + 3]; +} + +function extractISOTime(match, cursor) { + const item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]), + }; + + return [item, null, cursor + 4]; +} + +function extractISOOffset(match, cursor) { + const local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; +} + +function extractIANAZone(match, cursor) { + const zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; +} + +// ISO time parsing + +const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); + +// ISO duration parsing + +const isoDuration = + /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; + +function extractISODuration(match) { + const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = + match; + + const hasNegativePrefix = s[0] === "-"; + const negativeSeconds = secondStr && secondStr[0] === "-"; + + const maybeNegate = (num, force = false) => + num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num; + + return [ + { + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds), + }, + ]; +} + +// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York +// and not just that we're in -240 *right now*. But since I don't think these are used that often +// I'm just going to ignore that +const obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60, +}; + +function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + const result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr), + }; + + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = + weekdayStr.length > 3 + ? weekdaysLong.indexOf(weekdayStr) + 1 + : weekdaysShort.indexOf(weekdayStr) + 1; + } + + return result; +} + +// RFC 2822/5322 +const rfc2822 = + /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + +function extractRFC2822(match) { + const [ + , + weekdayStr, + dayStr, + monthStr, + yearStr, + hourStr, + minuteStr, + secondStr, + obsOffset, + milOffset, + offHourStr, + offMinuteStr, + ] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + + let offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + + return [result, new FixedOffsetZone(offset)]; +} + +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s + .replace(/\([^()]*\)|[\n\t]/g, " ") + .replace(/(\s\s+)/g, " ") + .trim(); +} + +// http date + +const rfc1123 = + /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = + /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = + /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + +function extractRFC1123Or850(match) { + const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} + +function extractASCII(match) { + const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} + +const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); +const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); +const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); +const isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + +const extractISOYmdTimeAndOffset = combineExtractors( + extractISOYmd, + extractISOTime, + extractISOOffset, + extractIANAZone +); +const extractISOWeekTimeAndOffset = combineExtractors( + extractISOWeekData, + extractISOTime, + extractISOOffset, + extractIANAZone +); +const extractISOOrdinalDateAndTime = combineExtractors( + extractISOOrdinalData, + extractISOTime, + extractISOOffset, + extractIANAZone +); +const extractISOTimeAndOffset = combineExtractors( + extractISOTime, + extractISOOffset, + extractIANAZone +); + +/* + * @private + */ + +function parseISODate(s) { + return parse( + s, + [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], + [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], + [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], + [isoTimeCombinedRegex, extractISOTimeAndOffset] + ); +} + +function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); +} + +function parseHTTPDate(s) { + return parse( + s, + [rfc1123, extractRFC1123Or850], + [rfc850, extractRFC1123Or850], + [ascii, extractASCII] + ); +} + +function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); +} + +const extractISOTimeOnly = combineExtractors(extractISOTime); + +function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); +} + +const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); +const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + +const extractISOTimeOffsetAndIANAZone = combineExtractors( + extractISOTime, + extractISOOffset, + extractIANAZone +); + +function parseSQL(s) { + return parse( + s, + [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], + [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone] + ); +} + +const INVALID$2 = "Invalid Duration"; + +// unit conversion constants +const lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000, + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000, + }, + hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 }, + minutes: { seconds: 60, milliseconds: 60 * 1000 }, + seconds: { milliseconds: 1000 }, + }, + casualMatrix = { + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000, + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000, + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000, + }, + + ...lowOrderMatrix, + }, + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = { + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000, + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: (daysInYearAccurate * 24) / 4, + minutes: (daysInYearAccurate * 24 * 60) / 4, + seconds: (daysInYearAccurate * 24 * 60 * 60) / 4, + milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4, + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000, + }, + ...lowOrderMatrix, + }; + +// units ordered by size +const orderedUnits$1 = [ + "years", + "quarters", + "months", + "weeks", + "days", + "hours", + "minutes", + "seconds", + "milliseconds", +]; + +const reverseUnits = orderedUnits$1.slice(0).reverse(); + +// clone really means "create another instance just like this one, but with these changes" +function clone$1(dur, alts, clear = false) { + // deep merge for vals + const conf = { + values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) }, + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix, + }; + return new Duration(conf); +} + +function durationToMillis(matrix, vals) { + let sum = vals.milliseconds ?? 0; + for (const unit of reverseUnits.slice(1)) { + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; +} + +// NB: mutates parameters +function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + + orderedUnits$1.reduceRight((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const previousVal = vals[previous] * factor; + const conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + const rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); +} + +// Remove all properties with a value of 0 from an object +function removeZeroes(vals) { + const newVals = {}; + for (const [key, value] of Object.entries(vals)) { + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; +} + +/** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ +class Duration { + /** + * @private + */ + constructor(config) { + const accurate = config.conversionAccuracy === "longterm" || false; + let matrix = accurate ? accurateMatrix : casualMatrix; + + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + static fromMillis(count, opts) { + return Duration.fromObject({ milliseconds: count }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */ + static fromObject(obj, opts = {}) { + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError( + `Duration.fromObject: argument expected to be an object, got ${ + obj === null ? "null" : typeof obj + }` + ); + } + + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix, + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */ + static fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError( + `Unknown duration argument ${durationLike} of type ${typeof durationLike}` + ); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */ + static fromISO(text, opts) { + const [parsed] = parseISODuration(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */ + static fromISOTime(text, opts) { + const [parsed] = parseISOTimeOnly(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ invalid }); + } + } + + /** + * @private + */ + static normalizeUnit(unit) { + const normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds", + }[unit ? unit.toLowerCase() : unit]; + + if (!normalized) throw new InvalidUnitError(unit); + + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDuration(o) { + return (o && o.isLuxonDuration) || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + toFormat(fmt, opts = {}) { + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + const fmtOpts = { + ...opts, + floor: opts.round !== false && opts.floor !== false, + }; + return this.isValid + ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) + : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */ + toHuman(opts = {}) { + if (!this.isValid) return INVALID$2; + + const showZeros = opts.showZeros !== false; + + const l = orderedUnits$1 + .map((unit) => { + const val = this.values[unit]; + if (isUndefined(val) || (val === 0 && !showZeros)) { + return null; + } + return this.loc + .numberFormatter({ style: "unit", unitDisplay: "long", ...opts, unit: unit.slice(0, -1) }) + .format(val); + }) + .filter((n) => n); + + return this.loc + .listFormatter({ type: "conjunction", style: opts.listStyle || "narrow", ...opts }) + .format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */ + toObject() { + if (!this.isValid) return {}; + return { ...this.values }; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */ + toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + + let s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) + s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */ + toISOTime(opts = {}) { + if (!this.isValid) return null; + + const millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + + opts = { + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended", + ...opts, + includeOffset: false, + }; + + const dateTime = DateTime.fromMillis(millis, { zone: "UTC" }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */ + toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Duration { values: ${JSON.stringify(this.values)} }`; + } else { + return `Duration { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */ + toMillis() { + if (!this.isValid) return NaN; + + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + plus(duration) { + if (!this.isValid) return this; + + const dur = Duration.fromDurationLike(duration), + result = {}; + + for (const k of orderedUnits$1) { + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + + return clone$1(this, { values: result }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + minus(duration) { + if (!this.isValid) return this; + + const dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */ + mapUnits(fn) { + if (!this.isValid) return this; + const result = {}; + for (const k of Object.keys(this.values)) { + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { values: result }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */ + get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */ + set(values) { + if (!this.isValid) return this; + + const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) }; + return clone$1(this, { values: mixed }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */ + reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) { + const loc = this.loc.clone({ locale, numberingSystem }); + const opts = { loc, matrix, conversionAccuracy }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */ + as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */ + normalize() { + if (!this.isValid) return this; + const vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { values: vals }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */ + rescale() { + if (!this.isValid) return this; + const vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { values: vals }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */ + shiftTo(...units) { + if (!this.isValid) return this; + + if (units.length === 0) { + return this; + } + + units = units.map((u) => Duration.normalizeUnit(u)); + + const built = {}, + accumulated = {}, + vals = this.toObject(); + let lastUnit; + + for (const k of orderedUnits$1) { + if (units.indexOf(k) >= 0) { + lastUnit = k; + + let own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (const ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + const i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (const key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += + key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + + normalizeValues(this.matrix, built); + return clone$1(this, { values: built }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */ + shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo( + "years", + "months", + "weeks", + "days", + "hours", + "minutes", + "seconds", + "milliseconds" + ); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */ + negate() { + if (!this.isValid) return this; + const negated = {}; + for (const k of Object.keys(this.values)) { + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { values: negated }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */ + removeZeros() { + if (!this.isValid) return this; + const vals = removeZeroes(this.values); + return clone$1(this, { values: vals }, true); + } + + /** + * Get the years. + * @type {number} + */ + get years() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + get quarters() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + get months() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + get weeks() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + get days() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + get hours() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + get minutes() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + get seconds() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + get milliseconds() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + + if (!this.loc.equals(other.loc)) { + return false; + } + + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + + for (const u of orderedUnits$1) { + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + } +} + +const INVALID$1 = "Invalid Interval"; + +// checks if the start is equal to or before the end +function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid( + "end before start", + `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}` + ); + } else { + return null; + } +} + +/** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ +class Interval { + /** + * @private + */ + constructor(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ invalid }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */ + static fromDateTimes(start, end) { + const builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + + const validateError = validateStartEnd(builtStart, builtEnd); + + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd, + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static after(start, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static before(end, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */ + static fromISO(text, opts) { + const [s, e] = (text || "").split("/", 2); + if (s && e) { + let start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + + let end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + + if (startIsValid) { + const dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + const dur = Duration.fromISO(s, opts); + if (dur.isValid) { + return Interval.before(end, dur); + } + } + } + return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isInterval(o) { + return (o && o.isLuxonInterval) || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */ + get start() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + get end() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + get lastDateTime() { + return this.isValid ? (this.e ? this.e.minus(1) : null) : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + get isValid() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + length(unit = "milliseconds") { + return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */ + count(unit = "milliseconds", opts) { + if (!this.isValid) return NaN; + const start = this.start.startOf(unit, opts); + let end; + if (opts?.useLocaleWeeks) { + end = this.end.reconfigure({ locale: start.locale }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */ + hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */ + isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */ + set({ start, end } = {}) { + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */ + splitAt(...dateTimes) { + if (!this.isValid) return []; + const sorted = dateTimes + .map(friendlyDateTime) + .filter((d) => this.contains(d)) + .sort((a, b) => a.toMillis() - b.toMillis()), + results = []; + let { s } = this, + i = 0; + + while (s < this.e) { + const added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */ + splitBy(duration) { + const dur = Duration.fromDurationLike(duration); + + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + + let { s } = this, + idx = 1, + next; + + const results = []; + while (s < this.e) { + const added = this.start.plus(dur.mapUnits((x) => x * idx)); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */ + divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */ + overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */ + abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */ + abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */ + engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */ + intersection(other) { + if (!this.isValid) return this; + const s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */ + union(other) { + if (!this.isValid) return this; + const s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */ + static merge(intervals) { + const [found, final] = intervals + .sort((a, b) => a.s - b.s) + .reduce( + ([sofar, current], item) => { + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, + [[], null] + ); + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */ + static xor(intervals) { + let start = null, + currentCount = 0; + const results = [], + ends = intervals.map((i) => [ + { time: i.s, type: "s" }, + { time: i.e, type: "e" }, + ]), + flattened = Array.prototype.concat(...ends), + arr = flattened.sort((a, b) => a.time - b.time); + + for (const i of arr) { + currentCount += i.type === "s" ? 1 : -1; + + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + + start = null; + } + } + + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */ + difference(...intervals) { + return Interval.xor([this].concat(intervals)) + .map((i) => this.intersection(i)) + .filter((i) => i && !i.isEmpty()); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */ + toString() { + if (!this.isValid) return INVALID$1; + return `[${this.s.toISO()} – ${this.e.toISO()})`; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`; + } else { + return `Interval { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid + ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) + : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISO(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`; + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */ + toISODate() { + if (!this.isValid) return INVALID$1; + return `${this.s.toISODate()}/${this.e.toISODate()}`; + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`; + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */ + toFormat(dateFormat, { separator = " – " } = {}) { + if (!this.isValid) return INVALID$1; + return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`; + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */ + toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */ + mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + } +} + +/** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ +class Info { + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + static hasDST(zone = Settings.defaultZone) { + const proto = DateTime.now().setZone(zone).set({ month: 12 }); + + return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */ + static isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */ + static normalizeZone(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */ + static getStartOfWeek({ locale = null, locObj = null } = {}) { + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */ + static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) { + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */ + static getWeekendWeekdays({ locale = null, locObj = null } = {}) { + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */ + static months( + length = "long", + { locale = null, numberingSystem = null, locObj = null, outputCalendar = "gregory" } = {} + ) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */ + static monthsFormat( + length = "long", + { locale = null, numberingSystem = null, locObj = null, outputCalendar = "gregory" } = {} + ) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */ + static weekdays(length = "long", { locale = null, numberingSystem = null, locObj = null } = {}) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */ + static weekdaysFormat( + length = "long", + { locale = null, numberingSystem = null, locObj = null } = {} + ) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */ + static meridiems({ locale = null } = {}) { + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */ + static eras(length = "short", { locale = null } = {}) { + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */ + static features() { + return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() }; + } +} + +function dayDiff(earlier, later) { + const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf("day").valueOf(), + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); +} + +function highOrderDiffs(cursor, later, units) { + const differs = [ + ["years", (a, b) => b.year - a.year], + ["quarters", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4], + ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], + [ + "weeks", + (a, b) => { + const days = dayDiff(a, b); + return (days - (days % 7)) / 7; + }, + ], + ["days", dayDiff], + ]; + + const results = {}; + const earlier = cursor; + let lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (const [unit, differ] of differs) { + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + + return [cursor, results, highWater, lowestOrder]; +} + +function diff (earlier, later, units, opts) { + let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units); + + const remainingMillis = later - cursor; + + const lowerOrderUnits = units.filter( + (u) => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0 + ); + + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + highWater = cursor.plus({ [lowestOrder]: 1 }); + } + + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + + const duration = Duration.fromObject(results, opts); + + if (lowerOrderUnits.length > 0) { + return Duration.fromMillis(remainingMillis, opts) + .shiftTo(...lowerOrderUnits) + .plus(duration); + } else { + return duration; + } +} + +const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + +function intUnit(regex, post = (i) => i) { + return { regex, deser: ([s]) => post(parseDigits(s)) }; +} + +const NBSP = String.fromCharCode(160); +const spaceOrNBSP = `[ ${NBSP}]`; +const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + +function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); +} + +function stripInsensitivities(s) { + return s + .replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); +} + +function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: ([s]) => + strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex, + }; + } +} + +function offset(regex, groups) { + return { regex, deser: ([, h, m]) => signedOffset(h, m), groups }; +} + +function simple(regex) { + return { regex, deser: ([s]) => s }; +} + +function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); +} + +/** + * @param token + * @param {Locale} loc + */ +function unitForToken(token, loc) { + const one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }), + unitate = (t) => { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2); + case "ZZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + + const unit = unitate(token) || { + invalidReason: MISSING_FTP, + }; + + unit.token = token; + + return unit; +} + +const partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy", + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM", + }, + day: { + numeric: "d", + "2-digit": "dd", + }, + weekday: { + short: "EEE", + long: "EEEE", + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh", + }, + hour24: { + numeric: "H", + "2-digit": "HH", + }, + minute: { + numeric: "m", + "2-digit": "mm", + }, + second: { + numeric: "s", + "2-digit": "ss", + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ", + }, +}; + +function tokenForPart(part, formatOpts, resolvedOpts) { + const { type, value } = part; + + if (type === "literal") { + const isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value, + }; + } + + const style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + let actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + let val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + + if (val) { + return { + literal: false, + val, + }; + } + + return undefined; +} + +function buildRegex(units) { + const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, ""); + return [`^${re}$`, units]; +} + +function match(input, regex, handlers) { + const matches = input.match(regex); + + if (matches) { + const all = {}; + let matchIndex = 1; + for (const i in handlers) { + if (hasOwnProperty(handlers, i)) { + const h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } +} + +function dateTimeFromMatches(matches) { + const toField = (token) => { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + + let zone = null; + let specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + + const vals = Object.keys(matches).reduce((r, k) => { + const f = toField(k); + if (f) { + r[f] = matches[k]; + } + + return r; + }, {}); + + return [vals, zone, specificOffset]; +} + +let dummyDateTimeCache = null; + +function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + + return dummyDateTimeCache; +} + +function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + + const formatOpts = Formatter.macroTokenToFormatOpts(token.val); + const tokens = formatOptsToTokens(formatOpts, locale); + + if (tokens == null || tokens.includes(undefined)) { + return token; + } + + return tokens; +} + +function expandMacroTokens(tokens, locale) { + return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale))); +} + +/** + * @private + */ + +class TokenParser { + constructor(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map((t) => unitForToken(t, locale)); + this.disqualifyingUnit = this.units.find((t) => t.invalidReason); + + if (!this.disqualifyingUnit) { + const [regexString, handlers] = buildRegex(this.units); + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + + explainFromTokens(input) { + if (!this.isValid) { + return { input, tokens: this.tokens, invalidReason: this.invalidReason }; + } else { + const [rawMatches, matches] = match(input, this.regex, this.handlers), + [result, zone, specificOffset] = matches + ? dateTimeFromMatches(matches) + : [null, null, undefined]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError( + "Can't include meridiem when specifying 24-hour format" + ); + } + return { + input, + tokens: this.tokens, + regex: this.regex, + rawMatches, + matches, + result, + zone, + specificOffset, + }; + } + } + + get isValid() { + return !this.disqualifyingUnit; + } + + get invalidReason() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } +} + +function explainFromTokens(locale, input, format) { + const parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); +} + +function parseFromTokens(locale, input, format) { + const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format); + return [result, zone, specificOffset, invalidReason]; +} + +function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + + const formatter = Formatter.create(locale, formatOpts); + const df = formatter.dtFormatter(getDummyDateTime()); + const parts = df.formatToParts(); + const resolvedOpts = df.resolvedOptions(); + return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts)); +} + +const INVALID = "Invalid DateTime"; +const MAX_DATE = 8.64e15; + +function unsupportedZone(zone) { + return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`); +} + +// we cache week data on the DT object and this intermediates the cache +/** + * @param {DateTime} dt + */ +function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; +} + +/** + * @param {DateTime} dt + */ +function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek( + dt.c, + dt.loc.getMinDaysInFirstWeek(), + dt.loc.getStartOfWeek() + ); + } + return dt.localWeekData; +} + +// clone really means, "make a new object with these modifications". all "setters" really use this +// to create a new object while only changing some of the properties +function clone(inst, alts) { + const current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid, + }; + return new DateTime({ ...current, ...alts, old: current }); +} + +// find the right offset a given local time. The o input is our guess, which determines which +// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) +function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + let utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + const o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + const o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; +} + +// convert an epoch timestamp into a calendar object with the given offset +function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + + const d = new Date(ts); + + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds(), + }; +} + +// convert a calendar object to a epoch timestamp +function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); +} + +// create a new DT instance by adding a duration, adjusting for DSTs +function adjustTime(inst, dur) { + const oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = { + ...inst.c, + year, + month, + day: + Math.min(inst.c.day, daysInMonth(year, month)) + + Math.trunc(dur.days) + + Math.trunc(dur.weeks) * 7, + }, + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds, + }).as("milliseconds"), + localTS = objToLocalTS(c); + + let [ts, o] = fixOffset(localTS, oPre, inst.zone); + + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + + return { ts, o }; +} + +// helper useful in turning the results of parsing into real dates +// by handling the zone options +function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + const { setZone, zone } = opts; + if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) { + const interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, { + ...opts, + zone: interpretationZone, + specificOffset, + }); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid( + new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`) + ); + } +} + +// if you want to output a technical format (e.g. RFC 2822), this helper +// helps handle the details +function toTechFormat(dt, format, allowZ = true) { + return dt.isValid + ? Formatter.create(Locale.create("en-US"), { + allowZ, + forceSimple: true, + }).formatDateTimeFromString(dt, format) + : null; +} + +function toISODate(o, extended, precision) { + const longFormat = o.c.year > 9999 || o.c.year < 0; + let c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; +} + +function toISOTime( + o, + extended, + suppressSeconds, + suppressMilliseconds, + includeOffset, + extendedZone, + precision +) { + let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; +} + +// defaults for unspecified units in the supported calendars +const defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + }; + +// Units in the supported calendars, sorted by bigness +const orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = [ + "weekYear", + "weekNumber", + "weekday", + "hour", + "minute", + "second", + "millisecond", + ], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + +// standardize case and plurality in units +function normalizeUnit(unit) { + const normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal", + }[unit.toLowerCase()]; + + if (!normalized) throw new InvalidUnitError(unit); + + return normalized; +} + +function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } +} + +// cache offsets for zones based on the current timestamp when this function is +// first called. When we are handling a datetime from components like (year, +// month, day, hour) in a time zone, we need a guess about what the timezone +// offset is so that we can convert into a UTC timestamp. One way is to find the +// offset of now in the zone. The actual date may have a different offset (for +// example, if we handle a date in June while we're in December in a zone that +// observes DST), but we can check and adjust that. +// +// When handling many dates, calculating the offset for now every time is +// expensive. It's just a guess, so we can cache the offset to use even if we +// are right on a time change boundary (we'll just correct in the other +// direction). Using a timestamp from first read is a slight optimization for +// handling dates close to the current date, since those dates will usually be +// in the same offset (we could set the timestamp statically, instead). We use a +// single timestamp for all zones to make things a bit more predictable. +// +// This is safe for quickDT (used by local() and utc()) because we don't fill in +// higher-order units from tsNow (as we do in fromObject, this requires that +// offset is calculated from tsNow). +/** + * @param {Zone} zone + * @return {number} + */ +function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + const zoneName = zone.name; + let offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; +} + +// this is a dumbed down version of fromObject() that runs about 60% faster +// but doesn't do any validation, makes a bunch of assumptions about what units +// are present, and so on. +function quickDT(obj, opts) { + const zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + + const loc = Locale.fromObject(opts); + + let ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (const u of orderedUnits) { + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + + const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + + const offsetProvis = guessOffsetForZone(zone); + [ts, o] = objToTS(obj, offsetProvis, zone); + } else { + ts = Settings.now(); + } + + return new DateTime({ ts, zone, loc, o }); +} + +function diffRelative(start, end, opts) { + const round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = (c, unit) => { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + const formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = (unit) => { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + + for (const unit of opts.units) { + const count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); +} + +function lastOpts(argList) { + let opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; +} + +/** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ +let zoneOffsetTs; +/** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ +const zoneOffsetGuessCache = new Map(); + +/** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ +class DateTime { + /** + * @access private + */ + constructor(config) { + const zone = config.zone || Settings.defaultZone; + + let invalid = + config.invalid || + (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || + (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + + let c = null, + o = null; + if (!invalid) { + const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + + if (unchanged) { + [c, o] = [config.old.c, config.old.o]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + static now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */ + static local() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + return quickDT({ year, month, day, hour, minute, second, millisecond }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */ + static utc() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ year, month, day, hour, minute, second, millisecond }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */ + static fromJSDate(date, options = {}) { + const ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + + const zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options), + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromMillis(milliseconds, options = {}) { + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError( + `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}` + ); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options), + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromSeconds(seconds, options = {}) { + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options), + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */ + static fromObject(obj, opts = {}) { + obj = obj || {}; + const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + + const loc = Locale.fromObject(opts); + const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc); + + const tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) + ? opts.specificOffset + : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError( + "Can't mix weekYear/weekNumber units with year/month/day or ordinals" + ); + } + + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + + const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor); + + // configure ourselves to deal with gregorian dates or week stuff + let units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + let foundFirst = false; + for (const u of units) { + const v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + const higherOrderInvalid = useWeekData + ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) + : containsOrdinal + ? hasInvalidOrdinalData(normalized) + : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + const gregorian = useWeekData + ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) + : containsOrdinal + ? ordinalToGregorian(normalized) + : normalized, + [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse), + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc, + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid( + "mismatched weekday", + `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}` + ); + } + + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */ + static fromISO(text, opts = {}) { + const [vals, parsedZone] = parseISODate(text); + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */ + static fromRFC2822(text, opts = {}) { + const [vals, parsedZone] = parseRFC2822Date(text); + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */ + static fromHTTP(text, opts = {}) { + const [vals, parsedZone] = parseHTTPDate(text); + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromFormat(text, fmt, opts = {}) { + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + + const { locale = null, numberingSystem = null } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }), + [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt); + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */ + static fromString(text, fmt, opts = {}) { + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */ + static fromSQL(text, opts = {}) { + const [vals, parsedZone] = parseSQL(text); + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ invalid }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDateTime(o) { + return (o && o.isLuxonDateTime) || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */ + static parseFormatForOpts(formatOpts, localeOpts = {}) { + const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */ + static expandFormat(fmt, localeOpts = {}) { + const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map((t) => t.val).join(""); + } + + static resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */ + get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + get outputCalendar() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + get zone() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + get zoneName() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + get year() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + get quarter() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + get month() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + get day() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + get hour() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + get minute() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + get second() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + get millisecond() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + get weekYear() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + get weekNumber() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + get weekday() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + get isWeekend() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + get localWeekday() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + get localWeekNumber() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + get localWeekYear() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + get ordinal() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + get monthShort() { + return this.isValid ? Info.months("short", { locObj: this.loc })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + get monthLong() { + return this.isValid ? Info.months("long", { locObj: this.loc })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + get weekdayShort() { + return this.isValid ? Info.weekdays("short", { locObj: this.loc })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + get weekdayLong() { + return this.isValid ? Info.weekdays("long", { locObj: this.loc })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + get offset() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameShort() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale, + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameLong() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale, + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + get isOffsetFixed() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + get isInDST() { + if (this.isOffsetFixed) { + return false; + } else { + return ( + this.offset > this.set({ month: 1, day: 1 }).offset || + this.offset > this.set({ month: 5 }).offset + ); + } + } + + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + const dayMs = 86400000; + const minuteMs = 60000; + const localTS = objToLocalTS(this.c); + const oEarlier = this.zone.offset(localTS - dayMs); + const oLater = this.zone.offset(localTS + dayMs); + + const o1 = this.zone.offset(localTS - oEarlier * minuteMs); + const o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + const ts1 = localTS - o1 * minuteMs; + const ts2 = localTS - o2 * minuteMs; + const c1 = tsToObj(ts1, o1); + const c2 = tsToObj(ts2, o2); + if ( + c1.hour === c2.hour && + c1.minute === c2.minute && + c1.second === c2.second && + c1.millisecond === c2.millisecond + ) { + return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */ + get isInLeapYear() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + get daysInMonth() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + get daysInYear() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + get weeksInWeekYear() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + get weeksInLocalWeekYear() { + return this.isValid + ? weeksInWeekYear( + this.localWeekYear, + this.loc.getMinDaysInFirstWeek(), + this.loc.getStartOfWeek() + ) + : NaN; + } + + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + resolvedLocaleOptions(opts = {}) { + const { locale, numberingSystem, calendar } = Formatter.create( + this.loc.clone(opts), + opts + ).resolvedOptions(this); + return { locale, numberingSystem, outputCalendar: calendar }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */ + toUTC(offset = 0, opts = {}) { + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */ + toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */ + setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) { + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + let newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + const offsetGuess = zone.offset(this.ts); + const asObj = this.toObject(); + [newTS] = objToTS(asObj, offsetGuess, zone); + } + return clone(this, { ts: newTS, zone }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */ + reconfigure({ locale, numberingSystem, outputCalendar } = {}) { + const loc = this.loc.clone({ locale, numberingSystem, outputCalendar }); + return clone(this, { loc }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */ + setLocale(locale) { + return this.reconfigure({ locale }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */ + set(values) { + if (!this.isValid) return this; + + const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc); + + const settingWeekStuff = + !isUndefined(normalized.weekYear) || + !isUndefined(normalized.weekNumber) || + !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError( + "Can't mix weekYear/weekNumber units with year/month/day or ordinals" + ); + } + + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + + let mixed; + if (settingWeekStuff) { + mixed = weekToGregorian( + { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized }, + minDaysInFirstWeek, + startOfWeek + ); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized }); + } else { + mixed = { ...this.toObject(), ...normalized }; + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + + const [ts, o] = objToTS(mixed, this.o, this.zone); + return clone(this, { ts, o }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */ + plus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */ + minus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */ + startOf(unit, { useLocaleWeeks = false } = {}) { + if (!this.isValid) return this; + + const o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + const startOfWeek = this.loc.getStartOfWeek(); + const { weekday } = this; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + + if (normalizedUnit === "quarters") { + const q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */ + endOf(unit, opts) { + return this.isValid + ? this.plus({ [unit]: 1 }) + .startOf(unit, opts) + .minus(1) + : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */ + toFormat(fmt, opts = {}) { + return this.isValid + ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) + : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid + ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) + : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */ + toLocaleParts(opts = {}) { + return this.isValid + ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) + : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */ + toISO({ + format = "extended", + suppressSeconds = false, + suppressMilliseconds = false, + includeOffset = true, + extendedZone = false, + precision = "milliseconds", + } = {}) { + if (!this.isValid) { + return null; + } + + precision = normalizeUnit(precision); + const ext = format === "extended"; + + let c = toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += toISOTime( + this, + ext, + suppressSeconds, + suppressMilliseconds, + includeOffset, + extendedZone, + precision + ); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */ + toISODate({ format = "extended", precision = "day" } = {}) { + if (!this.isValid) { + return null; + } + return toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */ + toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */ + toISOTime({ + suppressMilliseconds = false, + suppressSeconds = false, + includeOffset = true, + includePrefix = false, + extendedZone = false, + format = "extended", + precision = "milliseconds", + } = {}) { + if (!this.isValid) { + return null; + } + + precision = normalizeUnit(precision); + let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return ( + c + + toISOTime( + this, + format === "extended", + suppressSeconds, + suppressMilliseconds, + includeOffset, + extendedZone, + precision + ) + ); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */ + toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */ + toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */ + toSQLDate() { + if (!this.isValid) { + return null; + } + return toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */ + toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) { + let fmt = "HH:mm:ss.SSS"; + + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */ + toSQL(opts = {}) { + if (!this.isValid) { + return null; + } + + return `${this.toSQLDate()} ${this.toSQLTime(opts)}`; + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */ + toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`; + } else { + return `DateTime { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */ + toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */ + toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */ + toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */ + toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */ + toObject(opts = {}) { + if (!this.isValid) return {}; + + const base = { ...this.c }; + + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */ + toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */ + diff(otherDateTime, unit = "milliseconds", opts = {}) { + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + + const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts }; + + const units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = diff(earlier, later, units, durOpts); + + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + diffNow(unit = "milliseconds", opts = {}) { + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */ + until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */ + hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + + const inputMs = otherDateTime.valueOf(); + const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true }); + return ( + adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts) + ); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */ + equals(other) { + return ( + this.isValid && + other.isValid && + this.valueOf() === other.valueOf() && + this.zone.equals(other.zone) && + this.loc.equals(other.loc) + ); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */ + toRelative(options = {}) { + if (!this.isValid) return null; + const base = options.base || DateTime.fromObject({}, { zone: this.zone }), + padding = options.padding ? (this < base ? -options.padding : options.padding) : 0; + let units = ["years", "months", "days", "hours", "minutes", "seconds"]; + let unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), { + ...options, + numeric: "always", + units, + unit, + }); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */ + toRelativeCalendar(options = {}) { + if (!this.isValid) return null; + + return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, { + ...options, + numeric: "auto", + units: ["years", "months", "days"], + calendary: true, + }); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */ + static min(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, (i) => i.valueOf(), Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */ + static max(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, (i) => i.valueOf(), Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */ + static fromFormatExplain(text, fmt, options = {}) { + const { locale = null, numberingSystem = null } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */ + static fromStringExplain(text, fmt, options = {}) { + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */ + static buildFormatParser(fmt, options = {}) { + const { locale = null, numberingSystem = null } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */ + static fromFormatParser(text, formatParser, opts = {}) { + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError( + "fromFormatParser requires an input string and a format parser" + ); + } + const { locale = null, numberingSystem = null } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true, + }); + + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError( + `fromFormatParser called with a locale of ${localeToUse}, ` + + `but the format parser was created for ${formatParser.locale}` + ); + } + + const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text); + + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime( + result, + zone, + opts, + `format ${formatParser.format}`, + text, + specificOffset + ); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */ + static get DATE_SHORT() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED_WITH_WEEKDAY() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + static get DATE_FULL() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + static get DATE_HUGE() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_SIMPLE() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SECONDS() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SHORT_OFFSET() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_LONG_OFFSET() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + static get TIME_24_SIMPLE() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SECONDS() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SHORT_OFFSET() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_LONG_OFFSET() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT_WITH_SECONDS() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_SECONDS() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_WEEKDAY() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL_WITH_SECONDS() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE_WITH_SECONDS() { + return DATETIME_HUGE_WITH_SECONDS; + } +} + +/** + * @private + */ +function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError( + `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}` + ); + } +} + +const VERSION = "3.7.2"; + +export { DateTime, Duration, FixedOffsetZone, IANAZone, Info, Interval, InvalidZone, Settings, SystemZone, VERSION, Zone }; +//# sourceMappingURL=luxon.mjs.map diff --git a/node_modules/luxon/build/es6/luxon.mjs.map b/node_modules/luxon/build/es6/luxon.mjs.map new file mode 100644 index 0000000..68f1cf7 --- /dev/null +++ b/node_modules/luxon/build/es6/luxon.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.mjs","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["singleton","English.formatRelativeTime","English.months","English.weekdays","English.meridiems","English.eras","Formats.DATE_SHORT","Formats.DATE_MED","Formats.DATE_FULL","Formats.DATE_HUGE","Formats.TIME_SIMPLE","Formats.TIME_WITH_SECONDS","Formats.TIME_WITH_SHORT_OFFSET","Formats.TIME_WITH_LONG_OFFSET","Formats.TIME_24_SIMPLE","Formats.TIME_24_WITH_SECONDS","Formats.TIME_24_WITH_SHORT_OFFSET","Formats.TIME_24_WITH_LONG_OFFSET","Formats.DATETIME_SHORT","Formats.DATETIME_MED","Formats.DATETIME_FULL","Formats.DATETIME_HUGE","Formats.DATETIME_SHORT_WITH_SECONDS","Formats.DATETIME_MED_WITH_SECONDS","Formats.DATETIME_FULL_WITH_SECONDS","Formats.DATETIME_HUGE_WITH_SECONDS","English.meridiemForDateTime","English.monthForDateTime","English.weekdayForDateTime","English.eraForDateTime","English.monthsShort","English.weekdaysLong","English.weekdaysShort","INVALID","orderedUnits","clone","Formats.DATE_MED_WITH_WEEKDAY","Formats.DATETIME_MED_WITH_WEEKDAY"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/global/luxon.js b/node_modules/luxon/build/global/luxon.js new file mode 100644 index 0000000..7d059e1 --- /dev/null +++ b/node_modules/luxon/build/global/luxon.js @@ -0,0 +1,8744 @@ +var luxon = (function (exports) { + 'use strict'; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false + }); + return Constructor; + } + function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); + } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _toPrimitive(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== undefined) { + var res = prim.call(input, hint || "default"); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + function _toPropertyKey(arg) { + var key = _toPrimitive(arg, "string"); + return typeof key === "symbol" ? key : String(key); + } + + // these aren't really private, but nor are they really useful to document + /** + * @private + */ + var LuxonError = /*#__PURE__*/function (_Error) { + _inheritsLoose(LuxonError, _Error); + function LuxonError() { + return _Error.apply(this, arguments) || this; + } + return LuxonError; + }( /*#__PURE__*/_wrapNativeSuper(Error)); + /** + * @private + */ + var InvalidDateTimeError = /*#__PURE__*/function (_LuxonError) { + _inheritsLoose(InvalidDateTimeError, _LuxonError); + function InvalidDateTimeError(reason) { + return _LuxonError.call(this, "Invalid DateTime: " + reason.toMessage()) || this; + } + return InvalidDateTimeError; + }(LuxonError); + + /** + * @private + */ + var InvalidIntervalError = /*#__PURE__*/function (_LuxonError2) { + _inheritsLoose(InvalidIntervalError, _LuxonError2); + function InvalidIntervalError(reason) { + return _LuxonError2.call(this, "Invalid Interval: " + reason.toMessage()) || this; + } + return InvalidIntervalError; + }(LuxonError); + + /** + * @private + */ + var InvalidDurationError = /*#__PURE__*/function (_LuxonError3) { + _inheritsLoose(InvalidDurationError, _LuxonError3); + function InvalidDurationError(reason) { + return _LuxonError3.call(this, "Invalid Duration: " + reason.toMessage()) || this; + } + return InvalidDurationError; + }(LuxonError); + + /** + * @private + */ + var ConflictingSpecificationError = /*#__PURE__*/function (_LuxonError4) { + _inheritsLoose(ConflictingSpecificationError, _LuxonError4); + function ConflictingSpecificationError() { + return _LuxonError4.apply(this, arguments) || this; + } + return ConflictingSpecificationError; + }(LuxonError); + + /** + * @private + */ + var InvalidUnitError = /*#__PURE__*/function (_LuxonError5) { + _inheritsLoose(InvalidUnitError, _LuxonError5); + function InvalidUnitError(unit) { + return _LuxonError5.call(this, "Invalid unit " + unit) || this; + } + return InvalidUnitError; + }(LuxonError); + + /** + * @private + */ + var InvalidArgumentError = /*#__PURE__*/function (_LuxonError6) { + _inheritsLoose(InvalidArgumentError, _LuxonError6); + function InvalidArgumentError() { + return _LuxonError6.apply(this, arguments) || this; + } + return InvalidArgumentError; + }(LuxonError); + + /** + * @private + */ + var ZoneIsAbstractError = /*#__PURE__*/function (_LuxonError7) { + _inheritsLoose(ZoneIsAbstractError, _LuxonError7); + function ZoneIsAbstractError() { + return _LuxonError7.call(this, "Zone is an abstract class") || this; + } + return ZoneIsAbstractError; + }(LuxonError); + + /** + * @private + */ + + var n = "numeric", + s = "short", + l = "long"; + var DATE_SHORT = { + year: n, + month: n, + day: n + }; + var DATE_MED = { + year: n, + month: s, + day: n + }; + var DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s + }; + var DATE_FULL = { + year: n, + month: l, + day: n + }; + var DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l + }; + var TIME_SIMPLE = { + hour: n, + minute: n + }; + var TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n + }; + var TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + var TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" + }; + var TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s + }; + var TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l + }; + var DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n + }; + var DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n + }; + var DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n + }; + var DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n + }; + var DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s + }; + var DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s + }; + var DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l + }; + var DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l + }; + + /** + * @interface + */ + var Zone = /*#__PURE__*/function () { + function Zone() {} + var _proto = Zone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */; + _createClass(Zone, [{ + key: "type", + get: + /** + * The type of zone + * @abstract + * @type {string} + */ + function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + }, { + key: "name", + get: function get() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + throw new ZoneIsAbstractError(); + } + }, { + key: "isValid", + get: function get() { + throw new ZoneIsAbstractError(); + } + }]); + return Zone; + }(); + + var singleton$1 = null; + + /** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ + var SystemZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(SystemZone, _Zone); + function SystemZone() { + return _Zone.apply(this, arguments) || this; + } + var _proto = SystemZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale); + } + + /** @override **/; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/; + _proto.offset = function offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/; + _proto.equals = function equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/; + _createClass(SystemZone, [{ + key: "type", + get: /** @override **/ + function get() { + return "system"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "instance", + get: + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + function get() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + }]); + return SystemZone; + }(Zone); + + var dtfCache = new Map(); + function makeDTF(zoneName) { + var dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; + } + var typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 + }; + function hackyOffset(dtf, date) { + var formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + fMonth = parsed[1], + fDay = parsed[2], + fYear = parsed[3], + fadOrBc = parsed[4], + fHour = parsed[5], + fMinute = parsed[6], + fSecond = parsed[7]; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; + } + function partsOffset(dtf, date) { + var formatted = dtf.formatToParts(date); + var filled = []; + for (var i = 0; i < formatted.length; i++) { + var _formatted$i = formatted[i], + type = _formatted$i.type, + value = _formatted$i.value; + var pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; + } + var ianaZoneCache = new Map(); + /** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ + var IANAZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(IANAZone, _Zone); + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + IANAZone.create = function create(name) { + var zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */; + IANAZone.resetCache = function resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */; + IANAZone.isValidSpecifier = function isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */; + IANAZone.isValidZone = function isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + }; + function IANAZone(name) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.zoneName = name; + /** @private **/ + _this.valid = IANAZone.isValidZone(name); + return _this; + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + var _proto = IANAZone.prototype; + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + _proto.offsetName = function offsetName(ts, _ref) { + var format = _ref.format, + locale = _ref.locale; + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */; + _proto.offset = function offset(ts) { + if (!this.valid) return NaN; + var date = new Date(ts); + if (isNaN(date)) return NaN; + var dtf = makeDTF(this.name); + var _ref2 = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date), + year = _ref2[0], + month = _ref2[1], + day = _ref2[2], + adOrBc = _ref2[3], + hour = _ref2[4], + minute = _ref2[5], + second = _ref2[6]; + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + var adjustedHour = hour === 24 ? 0 : hour; + var asUTC = objToLocalTS({ + year: year, + month: month, + day: day, + hour: adjustedHour, + minute: minute, + second: second, + millisecond: 0 + }); + var asTS = +date; + var over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */; + _createClass(IANAZone, [{ + key: "type", + get: function get() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return this.valid; + } + }]); + return IANAZone; + }(Zone); + + var _excluded = ["base"], + _excluded2 = ["padTo", "floor"]; + + // todo - remap caching + + var intlLFCache = {}; + function getCachedLF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; + } + var intlDTCache = new Map(); + function getCachedDTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; + } + var intlNumCache = new Map(); + function getCachedINF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var key = JSON.stringify([locString, opts]); + var inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; + } + var intlRelCache = new Map(); + function getCachedRTF(locString, opts) { + if (opts === void 0) { + opts = {}; + } + var _opts = opts; + _opts.base; + var cacheKeyOpts = _objectWithoutPropertiesLoose(_opts, _excluded); // exclude `base` from the options + var key = JSON.stringify([locString, cacheKeyOpts]); + var inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; + } + var sysLocaleCache = null; + function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } + } + var intlResolvedOptionsCache = new Map(); + function getCachedIntResolvedOptions(locString) { + var opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; + } + var weekInfoCache = new Map(); + function getCachedWeekInfo(locString) { + var data = weekInfoCache.get(locString); + if (!data) { + var locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = _extends({}, fallbackWeekSettings, data); + } + weekInfoCache.set(locString, data); + } + return data; + } + function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + var xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + var uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + var options; + var selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + var smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + var _options = options, + numberingSystem = _options.numberingSystem, + calendar = _options.calendar; + return [selectedStr, numberingSystem, calendar]; + } + } + function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += "-ca-" + outputCalendar; + } + if (numberingSystem) { + localeStr += "-nu-" + numberingSystem; + } + return localeStr; + } else { + return localeStr; + } + } + function mapMonths(f) { + var ms = []; + for (var i = 1; i <= 12; i++) { + var dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; + } + function mapWeekdays(f) { + var ms = []; + for (var i = 1; i <= 7; i++) { + var dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; + } + function listStuff(loc, length, englishFn, intlFn) { + var mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } + } + function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } + } + + /** + * @private + */ + var PolyNumberFormatter = /*#__PURE__*/function () { + function PolyNumberFormatter(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + opts.padTo; + opts.floor; + var otherOpts = _objectWithoutPropertiesLoose(opts, _excluded2); + if (!forceSimple || Object.keys(otherOpts).length > 0) { + var intlOpts = _extends({ + useGrouping: false + }, opts); + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + var _proto = PolyNumberFormatter.prototype; + _proto.format = function format(i) { + if (this.inf) { + var fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + var _fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(_fixed, this.padTo); + } + }; + return PolyNumberFormatter; + }(); + /** + * @private + */ + var PolyDateFormatter = /*#__PURE__*/function () { + function PolyDateFormatter(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + var z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + var gmtOffset = -1 * (dt.offset / 60); + var offsetZ = gmtOffset >= 0 ? "Etc/GMT+" + gmtOffset : "Etc/GMT" + gmtOffset; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + var intlOpts = _extends({}, this.opts); + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + var _proto2 = PolyDateFormatter.prototype; + _proto2.format = function format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(function (_ref) { + var value = _ref.value; + return value; + }).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + }; + _proto2.formatToParts = function formatToParts() { + var _this = this; + var parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(function (part) { + if (part.type === "timeZoneName") { + var offsetName = _this.originalZone.offsetName(_this.dt.ts, { + locale: _this.dt.locale, + format: _this.opts.timeZoneName + }); + return _extends({}, part, { + value: offsetName + }); + } else { + return part; + } + }); + } + return parts; + }; + _proto2.resolvedOptions = function resolvedOptions() { + return this.dtf.resolvedOptions(); + }; + return PolyDateFormatter; + }(); + /** + * @private + */ + var PolyRelFormatter = /*#__PURE__*/function () { + function PolyRelFormatter(intl, isEnglish, opts) { + this.opts = _extends({ + style: "long" + }, opts); + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + var _proto3 = PolyRelFormatter.prototype; + _proto3.format = function format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + }; + _proto3.formatToParts = function formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + }; + return PolyRelFormatter; + }(); + var fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] + }; + + /** + * @private + */ + var Locale = /*#__PURE__*/function () { + Locale.fromOpts = function fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + }; + Locale.create = function create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN) { + if (defaultToEN === void 0) { + defaultToEN = false; + } + var specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + var localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + var numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + var outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + var weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + }; + Locale.resetCache = function resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + }; + Locale.fromObject = function fromObject(_temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + locale = _ref2.locale, + numberingSystem = _ref2.numberingSystem, + outputCalendar = _ref2.outputCalendar, + weekSettings = _ref2.weekSettings; + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + }; + function Locale(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + var _parseLocaleString = parseLocaleString(locale), + parsedLocale = _parseLocaleString[0], + parsedNumberingSystem = _parseLocaleString[1], + parsedOutputCalendar = _parseLocaleString[2]; + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + var _proto4 = Locale.prototype; + _proto4.listingMode = function listingMode() { + var isActuallyEn = this.isEnglish(); + var hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + }; + _proto4.clone = function clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + }; + _proto4.redefaultToEN = function redefaultToEN(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: true + })); + }; + _proto4.redefaultToSystem = function redefaultToSystem(alts) { + if (alts === void 0) { + alts = {}; + } + return this.clone(_extends({}, alts, { + defaultToEN: false + })); + }; + _proto4.months = function months$1(length, format) { + var _this2 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, months, function () { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + var monthSpecialCase = _this2.intl === "ja" || _this2.intl.startsWith("ja-"); + format &= !monthSpecialCase; + var intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this2.monthsCache[formatStr][length]) { + var mapper = !monthSpecialCase ? function (dt) { + return _this2.extract(dt, intl, "month"); + } : function (dt) { + return _this2.dtFormatter(dt, intl).format(); + }; + _this2.monthsCache[formatStr][length] = mapMonths(mapper); + } + return _this2.monthsCache[formatStr][length]; + }); + }; + _proto4.weekdays = function weekdays$1(length, format) { + var _this3 = this; + if (format === void 0) { + format = false; + } + return listStuff(this, length, weekdays, function () { + var intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!_this3.weekdaysCache[formatStr][length]) { + _this3.weekdaysCache[formatStr][length] = mapWeekdays(function (dt) { + return _this3.extract(dt, intl, "weekday"); + }); + } + return _this3.weekdaysCache[formatStr][length]; + }); + }; + _proto4.meridiems = function meridiems$1() { + var _this4 = this; + return listStuff(this, undefined, function () { + return meridiems; + }, function () { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!_this4.meridiemCache) { + var intl = { + hour: "numeric", + hourCycle: "h12" + }; + _this4.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(function (dt) { + return _this4.extract(dt, intl, "dayperiod"); + }); + } + return _this4.meridiemCache; + }); + }; + _proto4.eras = function eras$1(length) { + var _this5 = this; + return listStuff(this, length, eras, function () { + var intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!_this5.eraCache[length]) { + _this5.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(function (dt) { + return _this5.extract(dt, intl, "era"); + }); + } + return _this5.eraCache[length]; + }); + }; + _proto4.extract = function extract(dt, intlOpts, field) { + var df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(function (m) { + return m.type.toLowerCase() === field; + }); + return matching ? matching.value : null; + }; + _proto4.numberFormatter = function numberFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + }; + _proto4.dtFormatter = function dtFormatter(dt, intlOpts) { + if (intlOpts === void 0) { + intlOpts = {}; + } + return new PolyDateFormatter(dt, this.intl, intlOpts); + }; + _proto4.relFormatter = function relFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + }; + _proto4.listFormatter = function listFormatter(opts) { + if (opts === void 0) { + opts = {}; + } + return getCachedLF(this.intl, opts); + }; + _proto4.isEnglish = function isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + }; + _proto4.getWeekSettings = function getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + }; + _proto4.getStartOfWeek = function getStartOfWeek() { + return this.getWeekSettings().firstDay; + }; + _proto4.getMinDaysInFirstWeek = function getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + }; + _proto4.getWeekendDays = function getWeekendDays() { + return this.getWeekSettings().weekend; + }; + _proto4.equals = function equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + }; + _proto4.toString = function toString() { + return "Locale(" + this.locale + ", " + this.numberingSystem + ", " + this.outputCalendar + ")"; + }; + _createClass(Locale, [{ + key: "fastNumbers", + get: function get() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + }]); + return Locale; + }(); + + var singleton = null; + + /** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ + var FixedOffsetZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(FixedOffsetZone, _Zone); + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + FixedOffsetZone.instance = function instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */; + FixedOffsetZone.parseSpecifier = function parseSpecifier(s) { + if (s) { + var r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + }; + function FixedOffsetZone(offset) { + var _this; + _this = _Zone.call(this) || this; + /** @private **/ + _this.fixed = offset; + return _this; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + var _proto = FixedOffsetZone.prototype; + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + _proto.offsetName = function offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */; + _proto.formatOffset = function formatOffset$1(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */; + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + _proto.offset = function offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */; + _proto.equals = function equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */; + _createClass(FixedOffsetZone, [{ + key: "type", + get: function get() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + }, { + key: "name", + get: function get() { + return this.fixed === 0 ? "UTC" : "UTC" + formatOffset(this.fixed, "narrow"); + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + }, { + key: "ianaName", + get: function get() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return "Etc/GMT" + formatOffset(-this.fixed, "narrow"); + } + } + }, { + key: "isUniversal", + get: function get() { + return true; + } + }, { + key: "isValid", + get: function get() { + return true; + } + }], [{ + key: "utcInstance", + get: + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + function get() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + }]); + return FixedOffsetZone; + }(Zone); + + /** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ + var InvalidZone = /*#__PURE__*/function (_Zone) { + _inheritsLoose(InvalidZone, _Zone); + function InvalidZone(zoneName) { + var _this; + _this = _Zone.call(this) || this; + /** @private */ + _this.zoneName = zoneName; + return _this; + } + + /** @override **/ + var _proto = InvalidZone.prototype; + /** @override **/ + _proto.offsetName = function offsetName() { + return null; + } + + /** @override **/; + _proto.formatOffset = function formatOffset() { + return ""; + } + + /** @override **/; + _proto.offset = function offset() { + return NaN; + } + + /** @override **/; + _proto.equals = function equals() { + return false; + } + + /** @override **/; + _createClass(InvalidZone, [{ + key: "type", + get: function get() { + return "invalid"; + } + + /** @override **/ + }, { + key: "name", + get: function get() { + return this.zoneName; + } + + /** @override **/ + }, { + key: "isUniversal", + get: function get() { + return false; + } + }, { + key: "isValid", + get: function get() { + return false; + } + }]); + return InvalidZone; + }(Zone); + + /** + * @private + */ + function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + var lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } + } + + var numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" + }; + var numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] + }; + var hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); + function parseDigits(str) { + var value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (var key in numberingSystemsUTF16) { + var _numberingSystemsUTF = numberingSystemsUTF16[key], + min = _numberingSystemsUTF[0], + max = _numberingSystemsUTF[1]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } + } + + // cache of {numberingSystem: {append: regex}} + var digitRegexCache = new Map(); + function resetDigitRegexCache() { + digitRegexCache.clear(); + } + function digitRegex(_ref, append) { + var numberingSystem = _ref.numberingSystem; + if (append === void 0) { + append = ""; + } + var ns = numberingSystem || "latn"; + var appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + var regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp("" + numberingSystems[ns] + append); + appendCache.set(append, regex); + } + return regex; + } + + var now = function now() { + return Date.now(); + }, + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + + /** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ + var Settings = /*#__PURE__*/function () { + function Settings() {} + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + Settings.resetCaches = function resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + }; + _createClass(Settings, null, [{ + key: "now", + get: + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + function get() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */, + set: function set(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + }, { + key: "defaultZone", + get: + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + function get() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(zone) { + defaultZone = zone; + } + }, { + key: "defaultLocale", + get: function get() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultNumberingSystem", + get: function get() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + }, { + key: "defaultOutputCalendar", + get: function get() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */, + set: function set(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + }, { + key: "defaultWeekSettings", + get: function get() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */, + set: function set(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + }, { + key: "twoDigitCutoffYear", + get: function get() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */, + set: function set(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + }, { + key: "throwOnInvalid", + get: function get() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */, + set: function set(t) { + throwOnInvalid = t; + } + }]); + return Settings; + }(); + + var Invalid = /*#__PURE__*/function () { + function Invalid(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + var _proto = Invalid.prototype; + _proto.toMessage = function toMessage() { + if (this.explanation) { + return this.reason + ": " + this.explanation; + } else { + return this.reason; + } + }; + return Invalid; + }(); + + var nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; + function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", "you specified " + value + " (of type " + typeof value + ") as a " + unit + ", which is invalid"); + } + function dayOfWeek(year, month, day) { + var d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + var js = d.getUTCDay(); + return js === 0 ? 7 : js; + } + function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; + } + function uncomputeOrdinal(year, ordinal) { + var table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(function (i) { + return i < ordinal; + }), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day: day + }; + } + function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; + } + + /** + * @private + */ + + function gregorianToWeek(gregObj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var year = gregObj.year, + month = gregObj.month, + day = gregObj.day, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + var weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return _extends({ + weekYear: weekYear, + weekNumber: weekNumber, + weekday: weekday + }, timeObject(gregObj)); + } + function weekToGregorian(weekData, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekYear = weekData.weekYear, + weekNumber = weekData.weekNumber, + weekday = weekData.weekday, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + var ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + var _uncomputeOrdinal = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal.month, + day = _uncomputeOrdinal.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(weekData)); + } + function gregorianToOrdinal(gregData) { + var year = gregData.year, + month = gregData.month, + day = gregData.day; + var ordinal = computeOrdinal(year, month, day); + return _extends({ + year: year, + ordinal: ordinal + }, timeObject(gregData)); + } + function ordinalToGregorian(ordinalData) { + var year = ordinalData.year, + ordinal = ordinalData.ordinal; + var _uncomputeOrdinal2 = uncomputeOrdinal(year, ordinal), + month = _uncomputeOrdinal2.month, + day = _uncomputeOrdinal2.day; + return _extends({ + year: year, + month: month, + day: day + }, timeObject(ordinalData)); + } + + /** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ + function usesLocalWeekValues(obj, loc) { + var hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + var hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } + } + function hasInvalidWeekData(obj, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; + } + function hasInvalidOrdinalData(obj) { + var validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; + } + function hasInvalidGregorianData(obj) { + var validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; + } + function hasInvalidTimeData(obj) { + var hour = obj.hour, + minute = obj.minute, + second = obj.second, + millisecond = obj.millisecond; + var validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; + } + + /** + * @private + */ + + // TYPES + + function isUndefined(o) { + return typeof o === "undefined"; + } + function isNumber(o) { + return typeof o === "number"; + } + function isInteger(o) { + return typeof o === "number" && o % 1 === 0; + } + function isString(o) { + return typeof o === "string"; + } + function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; + } + + // CAPABILITIES + + function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } + } + function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } + } + + // OBJECTS AND ARRAYS + + function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; + } + function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce(function (best, next) { + var pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; + } + function pick(obj, keys) { + return keys.reduce(function (a, k) { + a[k] = obj[k]; + return a; + }, {}); + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(function (v) { + return !integerBetween(v, 1, 7); + })) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } + } + + // NUMBERS AND STRINGS + + function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; + } + + // x % n but takes the sign of n instead of x + function floorMod(x, n) { + return x - n * Math.floor(x / n); + } + function padStart(input, n) { + if (n === void 0) { + n = 2; + } + var isNeg = input < 0; + var padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; + } + function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } + } + function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } + } + function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + var f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } + } + function roundTo(number, digits, rounding) { + if (rounding === void 0) { + rounding = "round"; + } + var factor = Math.pow(10, digits); + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError("Value rounding " + rounding + " is out of range"); + } + } + + // DATE BASICS + + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + function daysInMonth(year, month) { + var modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } + } + + // convert a calendar object to a local timestamp (epoch, but with the offset baked in) + function objToLocalTS(obj) { + var d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; + } + + // adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js + function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + var fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; + } + function weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek) { + if (minDaysInFirstWeek === void 0) { + minDaysInFirstWeek = 4; + } + if (startOfWeek === void 0) { + startOfWeek = 1; + } + var weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + var weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; + } + function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; + } + + // PARSING + + function parseZoneInfo(ts, offsetFormat, locale, timeZone) { + if (timeZone === void 0) { + timeZone = null; + } + var date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + var modified = _extends({ + timeZoneName: offsetFormat + }, intlOpts); + var parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(function (m) { + return m.type.toLowerCase() === "timezonename"; + }); + return parsed ? parsed.value : null; + } + + // signedOffset('-5', '30') -> -330 + function signedOffset(offHourStr, offMinuteStr) { + var offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + var offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; + } + + // COERCION + + function asNumber(value) { + var numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError("Invalid unit value " + value); + return numericValue; + } + function normalizeObject(obj, normalizer) { + var normalized = {}; + for (var u in obj) { + if (hasOwnProperty(obj, u)) { + var v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; + } + + /** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + function formatOffset(offset, format) { + var hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return "" + sign + padStart(hours, 2) + ":" + padStart(minutes, 2); + case "narrow": + return "" + sign + hours + (minutes > 0 ? ":" + minutes : ""); + case "techie": + return "" + sign + padStart(hours, 2) + padStart(minutes, 2); + default: + throw new RangeError("Value format " + format + " is out of range for property format"); + } + } + function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); + } + + /** + * @private + */ + + var monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; + function months(length) { + switch (length) { + case "narrow": + return [].concat(monthsNarrow); + case "short": + return [].concat(monthsShort); + case "long": + return [].concat(monthsLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } + } + var weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + var weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + var weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; + function weekdays(length) { + switch (length) { + case "narrow": + return [].concat(weekdaysNarrow); + case "short": + return [].concat(weekdaysShort); + case "long": + return [].concat(weekdaysLong); + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } + } + var meridiems = ["AM", "PM"]; + var erasLong = ["Before Christ", "Anno Domini"]; + var erasShort = ["BC", "AD"]; + var erasNarrow = ["B", "A"]; + function eras(length) { + switch (length) { + case "narrow": + return [].concat(erasNarrow); + case "short": + return [].concat(erasShort); + case "long": + return [].concat(erasLong); + default: + return null; + } + } + function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; + } + function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; + } + function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; + } + function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; + } + function formatRelativeTime(unit, count, numeric, narrow) { + if (numeric === void 0) { + numeric = "always"; + } + if (narrow === void 0) { + narrow = false; + } + var units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + var lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + var isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : "next " + units[unit][0]; + case -1: + return isDay ? "yesterday" : "last " + units[unit][0]; + case 0: + return isDay ? "today" : "this " + units[unit][0]; + } + } + + var isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? fmtValue + " " + fmtUnit + " ago" : "in " + fmtValue + " " + fmtUnit; + } + + function stringifyTokens(splits, tokenToString) { + var s = ""; + for (var _iterator = _createForOfIteratorHelperLoose(splits), _step; !(_step = _iterator()).done;) { + var token = _step.value; + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; + } + var _macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS + }; + + /** + * @private + */ + var Formatter = /*#__PURE__*/function () { + Formatter.create = function create(locale, opts) { + if (opts === void 0) { + opts = {}; + } + return new Formatter(locale, opts); + }; + Formatter.parseFormat = function parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + var current = null, + currentFull = "", + bracketed = false; + var splits = []; + for (var i = 0; i < fmt.length; i++) { + var c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + }; + Formatter.macroTokenToFormatOpts = function macroTokenToFormatOpts(token) { + return _macroTokenToFormatOpts[token]; + }; + function Formatter(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + var _proto = Formatter.prototype; + _proto.formatWithSystemDefault = function formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + var df = this.systemLoc.dtFormatter(dt, _extends({}, this.opts, opts)); + return df.format(); + }; + _proto.dtFormatter = function dtFormatter(dt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.loc.dtFormatter(dt, _extends({}, this.opts, opts)); + }; + _proto.formatDateTime = function formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + }; + _proto.formatDateTimeParts = function formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + }; + _proto.formatInterval = function formatInterval(interval, opts) { + var df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + }; + _proto.resolvedOptions = function resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + }; + _proto.num = function num(n, p, signDisplay) { + if (p === void 0) { + p = 0; + } + if (signDisplay === void 0) { + signDisplay = undefined; + } + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + var opts = _extends({}, this.opts); + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + }; + _proto.formatDateTimeFromString = function formatDateTimeFromString(dt, fmt) { + var _this = this; + var knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = function string(opts, extract) { + return _this.loc.extract(dt, opts, extract); + }, + formatOffset = function formatOffset(opts) { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = function meridiem() { + return knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"); + }, + month = function month(length, standalone) { + return knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"); + }, + weekday = function weekday(length, standalone) { + return knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"); + }, + maybeMacro = function maybeMacro(token) { + var formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return _this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = function era(length) { + return knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"); + }, + tokenToString = function tokenToString(token) { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return _this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return _this.num(dt.millisecond, 3); + // seconds + case "s": + return _this.num(dt.second); + case "ss": + return _this.num(dt.second, 2); + // fractional seconds + case "uu": + return _this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return _this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return _this.num(dt.minute); + case "mm": + return _this.num(dt.minute, 2); + // hours + case "h": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return _this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return _this.num(dt.hour); + case "HH": + return _this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: _this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: _this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: _this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: _this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: _this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : _this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : _this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return _this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return _this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : _this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : _this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : _this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : _this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : _this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : _this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return _this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return _this.num(dt.weekYear, 4); + case "W": + return _this.num(dt.weekNumber); + case "WW": + return _this.num(dt.weekNumber, 2); + case "n": + return _this.num(dt.localWeekNumber); + case "nn": + return _this.num(dt.localWeekNumber, 2); + case "ii": + return _this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return _this.num(dt.localWeekYear, 4); + case "o": + return _this.num(dt.ordinal); + case "ooo": + return _this.num(dt.ordinal, 3); + case "q": + // like 1 + return _this.num(dt.quarter); + case "qq": + // like 01 + return _this.num(dt.quarter, 2); + case "X": + return _this.num(Math.floor(dt.ts / 1000)); + case "x": + return _this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + }; + _proto.formatDurationFromString = function formatDurationFromString(dur, fmt) { + var _this2 = this; + var invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + var tokenToField = function tokenToField(token) { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = function tokenToString(lildur, info) { + return function (token) { + var mapped = tokenToField(token); + if (mapped) { + var inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + var signDisplay; + if (_this2.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (_this2.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return _this2.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }; + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce(function (found, _ref) { + var literal = _ref.literal, + val = _ref.val; + return literal ? found : found.concat(val); + }, []), + collapsed = dur.shiftTo.apply(dur, realTokens.map(tokenToField).filter(function (t) { + return t; + })), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + }; + return Formatter; + }(); + + /* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + + var ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; + function combineRegexes() { + for (var _len = arguments.length, regexes = new Array(_len), _key = 0; _key < _len; _key++) { + regexes[_key] = arguments[_key]; + } + var full = regexes.reduce(function (f, r) { + return f + r.source; + }, ""); + return RegExp("^" + full + "$"); + } + function combineExtractors() { + for (var _len2 = arguments.length, extractors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + extractors[_key2] = arguments[_key2]; + } + return function (m) { + return extractors.reduce(function (_ref, ex) { + var mergedVals = _ref[0], + mergedZone = _ref[1], + cursor = _ref[2]; + var _ex = ex(m, cursor), + val = _ex[0], + zone = _ex[1], + next = _ex[2]; + return [_extends({}, mergedVals, val), zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); + }; + } + function parse(s) { + if (s == null) { + return [null, null]; + } + for (var _len3 = arguments.length, patterns = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + patterns[_key3 - 1] = arguments[_key3]; + } + for (var _i = 0, _patterns = patterns; _i < _patterns.length; _i++) { + var _patterns$_i = _patterns[_i], + regex = _patterns$_i[0], + extractor = _patterns$_i[1]; + var m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; + } + function simpleParse() { + for (var _len4 = arguments.length, keys = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + keys[_key4] = arguments[_key4]; + } + return function (match, cursor) { + var ret = {}; + var i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; + } + + // ISO and SQL parsing + var offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; + var isoExtendedZone = "(?:" + offsetRegex.source + "?(?:\\[(" + ianaRegex.source + ")\\])?)?"; + var isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; + var isoTimeRegex = RegExp("" + isoTimeBaseRegex.source + isoExtendedZone); + var isoTimeExtensionRegex = RegExp("(?:[Tt]" + isoTimeRegex.source + ")?"); + var isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; + var isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; + var isoOrdinalRegex = /(\d{4})-?(\d{3})/; + var extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); + var extractISOOrdinalData = simpleParse("year", "ordinal"); + var sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one + var sqlTimeRegex = RegExp(isoTimeBaseRegex.source + " ?(?:" + offsetRegex.source + "|(" + ianaRegex.source + "))?"); + var sqlTimeExtensionRegex = RegExp("(?: " + sqlTimeRegex.source + ")?"); + function int(match, pos, fallback) { + var m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); + } + function extractISOYmd(match, cursor) { + var item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; + } + function extractISOTime(match, cursor) { + var item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; + } + function extractISOOffset(match, cursor) { + var local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; + } + function extractIANAZone(match, cursor) { + var zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; + } + + // ISO time parsing + + var isoTimeOnly = RegExp("^T?" + isoTimeBaseRegex.source + "$"); + + // ISO duration parsing + + var isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; + function extractISODuration(match) { + var s = match[0], + yearStr = match[1], + monthStr = match[2], + weekStr = match[3], + dayStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + millisecondsStr = match[8]; + var hasNegativePrefix = s[0] === "-"; + var negativeSeconds = secondStr && secondStr[0] === "-"; + var maybeNegate = function maybeNegate(num, force) { + if (force === void 0) { + force = false; + } + return num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + }; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; + } + + // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York + // and not just that we're in -240 *right now*. But since I don't think these are used that often + // I'm just going to ignore that + var obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; + } + + // RFC 2822/5322 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; + function extractRFC2822(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + obsOffset = match[8], + milOffset = match[9], + offHourStr = match[10], + offMinuteStr = match[11], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + var offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; + } + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); + } + + // http date + + var rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; + function extractRFC1123Or850(match) { + var weekdayStr = match[1], + dayStr = match[2], + monthStr = match[3], + yearStr = match[4], + hourStr = match[5], + minuteStr = match[6], + secondStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + function extractASCII(match) { + var weekdayStr = match[1], + monthStr = match[2], + dayStr = match[3], + hourStr = match[4], + minuteStr = match[5], + secondStr = match[6], + yearStr = match[7], + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; + } + var isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); + var isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); + var isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); + var isoTimeCombinedRegex = combineRegexes(isoTimeRegex); + var extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); + var extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + + /* + * @private + */ + + function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); + } + function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); + } + function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); + } + function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); + } + var extractISOTimeOnly = combineExtractors(extractISOTime); + function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); + } + var sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); + var sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); + var extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); + } + + var INVALID$2 = "Invalid Duration"; + + // unit conversion constants + var lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix), + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = _extends({ + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + } + }, lowOrderMatrix); + + // units ordered by size + var orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; + var reverseUnits = orderedUnits$1.slice(0).reverse(); + + // clone really means "create another instance just like this one, but with these changes" + function clone$1(dur, alts, clear) { + if (clear === void 0) { + clear = false; + } + // deep merge for vals + var conf = { + values: clear ? alts.values : _extends({}, dur.values, alts.values || {}), + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); + } + function durationToMillis(matrix, vals) { + var _vals$milliseconds; + var sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (var _iterator = _createForOfIteratorHelperLoose(reverseUnits.slice(1)), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; + } + + // NB: mutates parameters + function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + var factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var previousVal = vals[previous] * factor; + var conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + var rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce(function (previous, current) { + if (!isUndefined(vals[current])) { + if (previous) { + var fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); + } + + // Remove all properties with a value of 0 from an object + function removeZeroes(vals) { + var newVals = {}; + for (var _i = 0, _Object$entries = Object.entries(vals); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; + } + + /** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ + var Duration = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Duration(config) { + var accurate = config.conversionAccuracy === "longterm" || false; + var matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + Duration.fromMillis = function fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */; + Duration.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError("Duration.fromObject: argument expected to be an object, got " + (obj === null ? "null" : typeof obj)); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */; + Duration.fromDurationLike = function fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError("Unknown duration argument " + durationLike + " of type " + typeof durationLike); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */; + Duration.fromISO = function fromISO(text, opts) { + var _parseISODuration = parseISODuration(text), + parsed = _parseISODuration[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */; + Duration.fromISOTime = function fromISOTime(text, opts) { + var _parseISOTimeOnly = parseISOTimeOnly(text), + parsed = _parseISOTimeOnly[0]; + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */; + Duration.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid: invalid + }); + } + } + + /** + * @private + */; + Duration.normalizeUnit = function normalizeUnit(unit) { + var normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Duration.isDuration = function isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */; + var _proto = Duration.prototype; + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + var fmtOpts = _extends({}, opts, { + floor: opts.round !== false && opts.floor !== false + }); + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */; + _proto.toHuman = function toHuman(opts) { + var _this = this; + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return INVALID$2; + var showZeros = opts.showZeros !== false; + var l = orderedUnits$1.map(function (unit) { + var val = _this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return _this.loc.numberFormatter(_extends({ + style: "unit", + unitDisplay: "long" + }, opts, { + unit: unit.slice(0, -1) + })).format(val); + }).filter(function (n) { + return n; + }); + return this.loc.listFormatter(_extends({ + type: "conjunction", + style: opts.listStyle || "narrow" + }, opts)).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */; + _proto.toObject = function toObject() { + if (!this.isValid) return {}; + return _extends({}, this.values); + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */; + _proto.toISO = function toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + var s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return null; + var millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = _extends({ + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended" + }, opts, { + includeOffset: false + }); + var dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */; + _proto.toString = function toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Duration { values: " + JSON.stringify(this.values) + " }"; + } else { + return "Duration { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */; + _proto.toMillis = function toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration), + result = {}; + for (var _i2 = 0, _orderedUnits = orderedUnits$1; _i2 < _orderedUnits.length; _i2++) { + var k = _orderedUnits[_i2]; + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */; + _proto.mapUnits = function mapUnits(fn) { + if (!this.isValid) return this; + var result = {}; + for (var _i3 = 0, _Object$keys = Object.keys(this.values); _i3 < _Object$keys.length; _i3++) { + var k = _Object$keys[_i3]; + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */; + _proto.get = function get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var mixed = _extends({}, this.values, normalizeObject(values, Duration.normalizeUnit)); + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */; + _proto.reconfigure = function reconfigure(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + locale = _ref.locale, + numberingSystem = _ref.numberingSystem, + conversionAccuracy = _ref.conversionAccuracy, + matrix = _ref.matrix; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem + }); + var opts = { + loc: loc, + matrix: matrix, + conversionAccuracy: conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */; + _proto.as = function as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */; + _proto.normalize = function normalize() { + if (!this.isValid) return this; + var vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */; + _proto.rescale = function rescale() { + if (!this.isValid) return this; + var vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */; + _proto.shiftTo = function shiftTo() { + for (var _len = arguments.length, units = new Array(_len), _key = 0; _key < _len; _key++) { + units[_key] = arguments[_key]; + } + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(function (u) { + return Duration.normalizeUnit(u); + }); + var built = {}, + accumulated = {}, + vals = this.toObject(); + var lastUnit; + for (var _i4 = 0, _orderedUnits2 = orderedUnits$1; _i4 < _orderedUnits2.length; _i4++) { + var k = _orderedUnits2[_i4]; + if (units.indexOf(k) >= 0) { + lastUnit = k; + var own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (var ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + var i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (var key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */; + _proto.shiftToAll = function shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */; + _proto.negate = function negate() { + if (!this.isValid) return this; + var negated = {}; + for (var _i5 = 0, _Object$keys2 = Object.keys(this.values); _i5 < _Object$keys2.length; _i5++) { + var k = _Object$keys2[_i5]; + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */; + _proto.removeZeros = function removeZeros() { + if (!this.isValid) return this; + var vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */; + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (var _i6 = 0, _orderedUnits3 = orderedUnits$1; _i6 < _orderedUnits3.length; _i6++) { + var u = _orderedUnits3[_i6]; + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + }; + _createClass(Duration, [{ + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + }, { + key: "years", + get: function get() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + }, { + key: "quarters", + get: function get() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + }, { + key: "months", + get: function get() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + }, { + key: "weeks", + get: function get() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + }, { + key: "days", + get: function get() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + }, { + key: "hours", + get: function get() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + }, { + key: "minutes", + get: function get() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + }, { + key: "seconds", + get: function get() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + }, { + key: "milliseconds", + get: function get() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Duration; + }(Symbol.for("nodejs.util.inspect.custom")); + + var INVALID$1 = "Invalid Interval"; + + // checks if the start is equal to or before the end + function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", "The end of an interval must be after its start, but you had start=" + start.toISO() + " and end=" + end.toISO()); + } else { + return null; + } + } + + /** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ + var Interval = /*#__PURE__*/function (_Symbol$for) { + /** + * @private + */ + function Interval(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + Interval.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid: invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */; + Interval.fromDateTimes = function fromDateTimes(start, end) { + var builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + var validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.after = function after(start, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */; + Interval.before = function before(end, duration) { + var dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */; + Interval.fromISO = function fromISO(text, opts) { + var _split = (text || "").split("/", 2), + s = _split[0], + e = _split[1]; + if (s && e) { + var start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + var end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + var dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + var _dur = Duration.fromISO(s, opts); + if (_dur.isValid) { + return Interval.before(end, _dur); + } + } + } + return Interval.invalid("unparsable", "the input \"" + text + "\" can't be parsed as ISO 8601"); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + Interval.isInterval = function isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */; + var _proto = Interval.prototype; + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + _proto.length = function length(unit) { + if (unit === void 0) { + unit = "milliseconds"; + } + return this.isValid ? this.toDuration.apply(this, [unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */; + _proto.count = function count(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (!this.isValid) return NaN; + var start = this.start.startOf(unit, opts); + var end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */; + _proto.hasSame = function hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */; + _proto.isEmpty = function isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isAfter = function isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.isBefore = function isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */; + _proto.contains = function contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */; + _proto.set = function set(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + start = _ref.start, + end = _ref.end; + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */; + _proto.splitAt = function splitAt() { + var _this = this; + if (!this.isValid) return []; + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + var sorted = dateTimes.map(friendlyDateTime).filter(function (d) { + return _this.contains(d); + }).sort(function (a, b) { + return a.toMillis() - b.toMillis(); + }), + results = []; + var s = this.s, + i = 0; + while (s < this.e) { + var added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */; + _proto.splitBy = function splitBy(duration) { + var dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + var s = this.s, + idx = 1, + next; + var results = []; + while (s < this.e) { + var added = this.start.plus(dur.mapUnits(function (x) { + return x * idx; + })); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */; + _proto.divideEqually = function divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */; + _proto.overlaps = function overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsStart = function abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */; + _proto.abutsEnd = function abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */; + _proto.engulfs = function engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */; + _proto.equals = function equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */; + _proto.intersection = function intersection(other) { + if (!this.isValid) return this; + var s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */; + _proto.union = function union(other) { + if (!this.isValid) return this; + var s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */; + Interval.merge = function merge(intervals) { + var _intervals$sort$reduc = intervals.sort(function (a, b) { + return a.s - b.s; + }).reduce(function (_ref2, item) { + var sofar = _ref2[0], + current = _ref2[1]; + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]), + found = _intervals$sort$reduc[0], + final = _intervals$sort$reduc[1]; + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */; + Interval.xor = function xor(intervals) { + var _Array$prototype; + var start = null, + currentCount = 0; + var results = [], + ends = intervals.map(function (i) { + return [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]; + }), + flattened = (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, ends), + arr = flattened.sort(function (a, b) { + return a.time - b.time; + }); + for (var _iterator = _createForOfIteratorHelperLoose(arr), _step; !(_step = _iterator()).done;) { + var i = _step.value; + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */; + _proto.difference = function difference() { + var _this2 = this; + for (var _len2 = arguments.length, intervals = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + intervals[_key2] = arguments[_key2]; + } + return Interval.xor([this].concat(intervals)).map(function (i) { + return _this2.intersection(i); + }).filter(function (i) { + return i && !i.isEmpty(); + }); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */; + _proto.toString = function toString() { + if (!this.isValid) return INVALID$1; + return "[" + this.s.toISO() + " \u2013 " + this.e.toISO() + ")"; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "Interval { start: " + this.s.toISO() + ", end: " + this.e.toISO() + " }"; + } else { + return "Interval { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISO = function toISO(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISO(opts) + "/" + this.e.toISO(opts); + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */; + _proto.toISODate = function toISODate() { + if (!this.isValid) return INVALID$1; + return this.s.toISODate() + "/" + this.e.toISODate(); + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */; + _proto.toISOTime = function toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return this.s.toISOTime(opts) + "/" + this.e.toISOTime(opts); + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */; + _proto.toFormat = function toFormat(dateFormat, _temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + _ref3$separator = _ref3.separator, + separator = _ref3$separator === void 0 ? " – " : _ref3$separator; + if (!this.isValid) return INVALID$1; + return "" + this.s.toFormat(dateFormat) + separator + this.e.toFormat(dateFormat); + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */; + _proto.toDuration = function toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */; + _proto.mapEndpoints = function mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + }; + _createClass(Interval, [{ + key: "start", + get: function get() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + }, { + key: "end", + get: function get() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + }, { + key: "lastDateTime", + get: function get() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + }, { + key: "isValid", + get: function get() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + }]); + return Interval; + }(Symbol.for("nodejs.util.inspect.custom")); + + /** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ + var Info = /*#__PURE__*/function () { + function Info() {} + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + Info.hasDST = function hasDST(zone) { + if (zone === void 0) { + zone = Settings.defaultZone; + } + var proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */; + Info.isValidIANAZone = function isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */; + Info.normalizeZone = function normalizeZone$1(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */; + Info.getStartOfWeek = function getStartOfWeek(_temp) { + var _ref = _temp === void 0 ? {} : _temp, + _ref$locale = _ref.locale, + locale = _ref$locale === void 0 ? null : _ref$locale, + _ref$locObj = _ref.locObj, + locObj = _ref$locObj === void 0 ? null : _ref$locObj; + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */; + Info.getMinimumDaysInFirstWeek = function getMinimumDaysInFirstWeek(_temp2) { + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$locale = _ref2.locale, + locale = _ref2$locale === void 0 ? null : _ref2$locale, + _ref2$locObj = _ref2.locObj, + locObj = _ref2$locObj === void 0 ? null : _ref2$locObj; + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */; + Info.getWeekendWeekdays = function getWeekendWeekdays(_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + _ref3$locale = _ref3.locale, + locale = _ref3$locale === void 0 ? null : _ref3$locale, + _ref3$locObj = _ref3.locObj, + locObj = _ref3$locObj === void 0 ? null : _ref3$locObj; + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */; + Info.months = function months(length, _temp4) { + if (length === void 0) { + length = "long"; + } + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$locale = _ref4.locale, + locale = _ref4$locale === void 0 ? null : _ref4$locale, + _ref4$numberingSystem = _ref4.numberingSystem, + numberingSystem = _ref4$numberingSystem === void 0 ? null : _ref4$numberingSystem, + _ref4$locObj = _ref4.locObj, + locObj = _ref4$locObj === void 0 ? null : _ref4$locObj, + _ref4$outputCalendar = _ref4.outputCalendar, + outputCalendar = _ref4$outputCalendar === void 0 ? "gregory" : _ref4$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */; + Info.monthsFormat = function monthsFormat(length, _temp5) { + if (length === void 0) { + length = "long"; + } + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$locale = _ref5.locale, + locale = _ref5$locale === void 0 ? null : _ref5$locale, + _ref5$numberingSystem = _ref5.numberingSystem, + numberingSystem = _ref5$numberingSystem === void 0 ? null : _ref5$numberingSystem, + _ref5$locObj = _ref5.locObj, + locObj = _ref5$locObj === void 0 ? null : _ref5$locObj, + _ref5$outputCalendar = _ref5.outputCalendar, + outputCalendar = _ref5$outputCalendar === void 0 ? "gregory" : _ref5$outputCalendar; + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */; + Info.weekdays = function weekdays(length, _temp6) { + if (length === void 0) { + length = "long"; + } + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$locale = _ref6.locale, + locale = _ref6$locale === void 0 ? null : _ref6$locale, + _ref6$numberingSystem = _ref6.numberingSystem, + numberingSystem = _ref6$numberingSystem === void 0 ? null : _ref6$numberingSystem, + _ref6$locObj = _ref6.locObj, + locObj = _ref6$locObj === void 0 ? null : _ref6$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */; + Info.weekdaysFormat = function weekdaysFormat(length, _temp7) { + if (length === void 0) { + length = "long"; + } + var _ref7 = _temp7 === void 0 ? {} : _temp7, + _ref7$locale = _ref7.locale, + locale = _ref7$locale === void 0 ? null : _ref7$locale, + _ref7$numberingSystem = _ref7.numberingSystem, + numberingSystem = _ref7$numberingSystem === void 0 ? null : _ref7$numberingSystem, + _ref7$locObj = _ref7.locObj, + locObj = _ref7$locObj === void 0 ? null : _ref7$locObj; + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */; + Info.meridiems = function meridiems(_temp8) { + var _ref8 = _temp8 === void 0 ? {} : _temp8, + _ref8$locale = _ref8.locale, + locale = _ref8$locale === void 0 ? null : _ref8$locale; + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */; + Info.eras = function eras(length, _temp9) { + if (length === void 0) { + length = "short"; + } + var _ref9 = _temp9 === void 0 ? {} : _temp9, + _ref9$locale = _ref9.locale, + locale = _ref9$locale === void 0 ? null : _ref9$locale; + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */; + Info.features = function features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + }; + return Info; + }(); + + function dayDiff(earlier, later) { + var utcDayStart = function utcDayStart(dt) { + return dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(); + }, + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); + } + function highOrderDiffs(cursor, later, units) { + var differs = [["years", function (a, b) { + return b.year - a.year; + }], ["quarters", function (a, b) { + return b.quarter - a.quarter + (b.year - a.year) * 4; + }], ["months", function (a, b) { + return b.month - a.month + (b.year - a.year) * 12; + }], ["weeks", function (a, b) { + var days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + var results = {}; + var earlier = cursor; + var lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (var _i = 0, _differs = differs; _i < _differs.length; _i++) { + var _differs$_i = _differs[_i], + unit = _differs$_i[0], + differ = _differs$_i[1]; + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; + } + function _diff (earlier, later, units, opts) { + var _highOrderDiffs = highOrderDiffs(earlier, later, units), + cursor = _highOrderDiffs[0], + results = _highOrderDiffs[1], + highWater = _highOrderDiffs[2], + lowestOrder = _highOrderDiffs[3]; + var remainingMillis = later - cursor; + var lowerOrderUnits = units.filter(function (u) { + return ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0; + }); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + var _cursor$plus; + highWater = cursor.plus((_cursor$plus = {}, _cursor$plus[lowestOrder] = 1, _cursor$plus)); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + var duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + var _Duration$fromMillis; + return (_Duration$fromMillis = Duration.fromMillis(remainingMillis, opts)).shiftTo.apply(_Duration$fromMillis, lowerOrderUnits).plus(duration); + } else { + return duration; + } + } + + var MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; + function intUnit(regex, post) { + if (post === void 0) { + post = function post(i) { + return i; + }; + } + return { + regex: regex, + deser: function deser(_ref) { + var s = _ref[0]; + return post(parseDigits(s)); + } + }; + } + var NBSP = String.fromCharCode(160); + var spaceOrNBSP = "[ " + NBSP + "]"; + var spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); + function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); + } + function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); + } + function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: function deser(_ref2) { + var s = _ref2[0]; + return strings.findIndex(function (i) { + return stripInsensitivities(s) === stripInsensitivities(i); + }) + startIndex; + } + }; + } + } + function offset(regex, groups) { + return { + regex: regex, + deser: function deser(_ref3) { + var h = _ref3[1], + m = _ref3[2]; + return signedOffset(h, m); + }, + groups: groups + }; + } + function simple(regex) { + return { + regex: regex, + deser: function deser(_ref4) { + var s = _ref4[0]; + return s; + } + }; + } + function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + + /** + * @param token + * @param {Locale} loc + */ + function unitForToken(token, loc) { + var one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = function literal(t) { + return { + regex: RegExp(escapeToken(t.val)), + deser: function deser(_ref5) { + var s = _ref5[0]; + return s; + }, + literal: true + }; + }, + unitate = function unitate(t) { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(?::(" + two.source + "))?"), 2); + case "ZZZ": + return offset(new RegExp("([+-]" + oneOrTwo.source + ")(" + two.source + ")?"), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + var unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; + } + var partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } + }; + function tokenForPart(part, formatOpts, resolvedOpts) { + var type = part.type, + value = part.value; + if (type === "literal") { + var isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + var style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + var actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + var val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val: val + }; + } + return undefined; + } + function buildRegex(units) { + var re = units.map(function (u) { + return u.regex; + }).reduce(function (f, r) { + return f + "(" + r.source + ")"; + }, ""); + return ["^" + re + "$", units]; + } + function match(input, regex, handlers) { + var matches = input.match(regex); + if (matches) { + var all = {}; + var matchIndex = 1; + for (var i in handlers) { + if (hasOwnProperty(handlers, i)) { + var h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } + } + function dateTimeFromMatches(matches) { + var toField = function toField(token) { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + var zone = null; + var specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + var vals = Object.keys(matches).reduce(function (r, k) { + var f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; + } + var dummyDateTimeCache = null; + function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; + } + function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + var formatOpts = Formatter.macroTokenToFormatOpts(token.val); + var tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; + } + function expandMacroTokens(tokens, locale) { + var _Array$prototype; + return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, tokens.map(function (t) { + return maybeExpandMacroToken(t, locale); + })); + } + + /** + * @private + */ + + var TokenParser = /*#__PURE__*/function () { + function TokenParser(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(function (t) { + return unitForToken(t, locale); + }); + this.disqualifyingUnit = this.units.find(function (t) { + return t.invalidReason; + }); + if (!this.disqualifyingUnit) { + var _buildRegex = buildRegex(this.units), + regexString = _buildRegex[0], + handlers = _buildRegex[1]; + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + var _proto = TokenParser.prototype; + _proto.explainFromTokens = function explainFromTokens(input) { + if (!this.isValid) { + return { + input: input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + var _match = match(input, this.regex, this.handlers), + rawMatches = _match[0], + matches = _match[1], + _ref6 = matches ? dateTimeFromMatches(matches) : [null, null, undefined], + result = _ref6[0], + zone = _ref6[1], + specificOffset = _ref6[2]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input: input, + tokens: this.tokens, + regex: this.regex, + rawMatches: rawMatches, + matches: matches, + result: result, + zone: zone, + specificOffset: specificOffset + }; + } + }; + _createClass(TokenParser, [{ + key: "isValid", + get: function get() { + return !this.disqualifyingUnit; + } + }, { + key: "invalidReason", + get: function get() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } + }]); + return TokenParser; + }(); + function explainFromTokens(locale, input, format) { + var parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); + } + function parseFromTokens(locale, input, format) { + var _explainFromTokens = explainFromTokens(locale, input, format), + result = _explainFromTokens.result, + zone = _explainFromTokens.zone, + specificOffset = _explainFromTokens.specificOffset, + invalidReason = _explainFromTokens.invalidReason; + return [result, zone, specificOffset, invalidReason]; + } + function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + var formatter = Formatter.create(locale, formatOpts); + var df = formatter.dtFormatter(getDummyDateTime()); + var parts = df.formatToParts(); + var resolvedOpts = df.resolvedOptions(); + return parts.map(function (p) { + return tokenForPart(p, formatOpts, resolvedOpts); + }); + } + + var INVALID = "Invalid DateTime"; + var MAX_DATE = 8.64e15; + function unsupportedZone(zone) { + return new Invalid("unsupported zone", "the zone \"" + zone.name + "\" is not supported"); + } + + // we cache week data on the DT object and this intermediates the cache + /** + * @param {DateTime} dt + */ + function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; + } + + /** + * @param {DateTime} dt + */ + function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; + } + + // clone really means, "make a new object with these modifications". all "setters" really use this + // to create a new object while only changing some of the properties + function clone(inst, alts) { + var current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime(_extends({}, current, alts, { + old: current + })); + } + + // find the right offset a given local time. The o input is our guess, which determines which + // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) + function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + var utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + var o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + var o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; + } + + // convert an epoch timestamp into a calendar object with the given offset + function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + var d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; + } + + // convert a calendar object to a epoch timestamp + function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); + } + + // create a new DT instance by adding a duration, adjusting for DSTs + function adjustTime(inst, dur) { + var oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = _extends({}, inst.c, { + year: year, + month: month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }), + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + var _fixOffset = fixOffset(localTS, oPre, inst.zone), + ts = _fixOffset[0], + o = _fixOffset[1]; + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts: ts, + o: o + }; + } + + // helper useful in turning the results of parsing into real dates + // by handling the zone options + function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + var setZone = opts.setZone, + zone = opts.zone; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + var interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, _extends({}, opts, { + zone: interpretationZone, + specificOffset: specificOffset + })); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", "the input \"" + text + "\" can't be parsed as " + format)); + } + } + + // if you want to output a technical format (e.g. RFC 2822), this helper + // helps handle the details + function toTechFormat(dt, format, allowZ) { + if (allowZ === void 0) { + allowZ = true; + } + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ: allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; + } + function _toISODate(o, extended, precision) { + var longFormat = o.c.year > 9999 || o.c.year < 0; + var c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; + } + function _toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + var showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; + } + + // defaults for unspecified units in the supported calendars + var defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + + // Units in the supported calendars, sorted by bigness + var orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + + // standardize case and plurality in units + function normalizeUnit(unit) { + var normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } + } + + // cache offsets for zones based on the current timestamp when this function is + // first called. When we are handling a datetime from components like (year, + // month, day, hour) in a time zone, we need a guess about what the timezone + // offset is so that we can convert into a UTC timestamp. One way is to find the + // offset of now in the zone. The actual date may have a different offset (for + // example, if we handle a date in June while we're in December in a zone that + // observes DST), but we can check and adjust that. + // + // When handling many dates, calculating the offset for now every time is + // expensive. It's just a guess, so we can cache the offset to use even if we + // are right on a time change boundary (we'll just correct in the other + // direction). Using a timestamp from first read is a slight optimization for + // handling dates close to the current date, since those dates will usually be + // in the same offset (we could set the timestamp statically, instead). We use a + // single timestamp for all zones to make things a bit more predictable. + // + // This is safe for quickDT (used by local() and utc()) because we don't fill in + // higher-order units from tsNow (as we do in fromObject, this requires that + // offset is calculated from tsNow). + /** + * @param {Zone} zone + * @return {number} + */ + function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + var zoneName = zone.name; + var offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; + } + + // this is a dumbed down version of fromObject() that runs about 60% faster + // but doesn't do any validation, makes a bunch of assumptions about what units + // are present, and so on. + function quickDT(obj, opts) { + var zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + var loc = Locale.fromObject(opts); + var ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (var _i = 0, _orderedUnits = orderedUnits; _i < _orderedUnits.length; _i++) { + var u = _orderedUnits[_i]; + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + var invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + var offsetProvis = guessOffsetForZone(zone); + var _objToTS = objToTS(obj, offsetProvis, zone); + ts = _objToTS[0]; + o = _objToTS[1]; + } else { + ts = Settings.now(); + } + return new DateTime({ + ts: ts, + zone: zone, + loc: loc, + o: o + }); + } + function diffRelative(start, end, opts) { + var round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = function format(c, unit) { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + var formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = function differ(unit) { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (var _iterator = _createForOfIteratorHelperLoose(opts.units), _step; !(_step = _iterator()).done;) { + var unit = _step.value; + var count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); + } + function lastOpts(argList) { + var opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; + } + + /** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ + var zoneOffsetTs; + /** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ + var zoneOffsetGuessCache = new Map(); + + /** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ + var DateTime = /*#__PURE__*/function (_Symbol$for) { + /** + * @access private + */ + function DateTime(config) { + var zone = config.zone || Settings.defaultZone; + var invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + var c = null, + o = null; + if (!invalid) { + var unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + var _ref = [config.old.c, config.old.o]; + c = _ref[0]; + o = _ref[1]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + var ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + DateTime.now = function now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */; + DateTime.local = function local() { + var _lastOpts = lastOpts(arguments), + opts = _lastOpts[0], + args = _lastOpts[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */; + DateTime.utc = function utc() { + var _lastOpts2 = lastOpts(arguments), + opts = _lastOpts2[0], + args = _lastOpts2[1], + year = args[0], + month = args[1], + day = args[2], + hour = args[3], + minute = args[4], + second = args[5], + millisecond = args[6]; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year: year, + month: month, + day: day, + hour: hour, + minute: minute, + second: second, + millisecond: millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */; + DateTime.fromJSDate = function fromJSDate(date, options) { + if (options === void 0) { + options = {}; + } + var ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + var zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromMillis = function fromMillis(milliseconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError("fromMillis requires a numerical input, but received a " + typeof milliseconds + " with value " + milliseconds); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromSeconds = function fromSeconds(seconds, options) { + if (options === void 0) { + options = {}; + } + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */; + DateTime.fromObject = function fromObject(obj, opts) { + if (opts === void 0) { + opts = {}; + } + obj = obj || {}; + var zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + var loc = Locale.fromObject(opts); + var normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues = usesLocalWeekValues(normalized, loc), + minDaysInFirstWeek = _usesLocalWeekValues.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues.startOfWeek; + var tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + var units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + var foundFirst = false; + for (var _iterator2 = _createForOfIteratorHelperLoose(units), _step2; !(_step2 = _iterator2()).done;) { + var u = _step2.value; + var v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + var higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + var gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + _objToTS2 = objToTS(gregorian, offsetProvis, zoneToUse), + tsFinal = _objToTS2[0], + offsetFinal = _objToTS2[1], + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc: loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", "you can't specify both a weekday of " + normalized.weekday + " and a date of " + inst.toISO()); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */; + DateTime.fromISO = function fromISO(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseISODate = parseISODate(text), + vals = _parseISODate[0], + parsedZone = _parseISODate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */; + DateTime.fromRFC2822 = function fromRFC2822(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseRFC2822Date = parseRFC2822Date(text), + vals = _parseRFC2822Date[0], + parsedZone = _parseRFC2822Date[1]; + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */; + DateTime.fromHTTP = function fromHTTP(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseHTTPDate = parseHTTPDate(text), + vals = _parseHTTPDate[0], + parsedZone = _parseHTTPDate[1]; + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */; + DateTime.fromFormat = function fromFormat(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + var _opts = opts, + _opts$locale = _opts.locale, + locale = _opts$locale === void 0 ? null : _opts$locale, + _opts$numberingSystem = _opts.numberingSystem, + numberingSystem = _opts$numberingSystem === void 0 ? null : _opts$numberingSystem, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }), + _parseFromTokens = parseFromTokens(localeToUse, text, fmt), + vals = _parseFromTokens[0], + parsedZone = _parseFromTokens[1], + specificOffset = _parseFromTokens[2], + invalid = _parseFromTokens[3]; + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, "format " + fmt, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */; + DateTime.fromString = function fromString(text, fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */; + DateTime.fromSQL = function fromSQL(text, opts) { + if (opts === void 0) { + opts = {}; + } + var _parseSQL = parseSQL(text), + vals = _parseSQL[0], + parsedZone = _parseSQL[1]; + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */; + DateTime.invalid = function invalid(reason, explanation) { + if (explanation === void 0) { + explanation = null; + } + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + var invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid: invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */; + DateTime.isDateTime = function isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */; + DateTime.parseFormatForOpts = function parseFormatForOpts(formatOpts, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(function (t) { + return t ? t.val : null; + }).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */; + DateTime.expandFormat = function expandFormat(fmt, localeOpts) { + if (localeOpts === void 0) { + localeOpts = {}; + } + var expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(function (t) { + return t.val; + }).join(""); + }; + DateTime.resetCache = function resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */; + var _proto = DateTime.prototype; + _proto.get = function get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */; + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + _proto.getPossibleOffsets = function getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + var dayMs = 86400000; + var minuteMs = 60000; + var localTS = objToLocalTS(this.c); + var oEarlier = this.zone.offset(localTS - dayMs); + var oLater = this.zone.offset(localTS + dayMs); + var o1 = this.zone.offset(localTS - oEarlier * minuteMs); + var o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + var ts1 = localTS - o1 * minuteMs; + var ts2 = localTS - o2 * minuteMs; + var c1 = tsToObj(ts1, o1); + var c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */; + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + _proto.resolvedLocaleOptions = function resolvedLocaleOptions(opts) { + if (opts === void 0) { + opts = {}; + } + var _Formatter$create$res = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this), + locale = _Formatter$create$res.locale, + numberingSystem = _Formatter$create$res.numberingSystem, + calendar = _Formatter$create$res.calendar; + return { + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */; + _proto.toUTC = function toUTC(offset, opts) { + if (offset === void 0) { + offset = 0; + } + if (opts === void 0) { + opts = {}; + } + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */; + _proto.toLocal = function toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */; + _proto.setZone = function setZone(zone, _temp) { + var _ref2 = _temp === void 0 ? {} : _temp, + _ref2$keepLocalTime = _ref2.keepLocalTime, + keepLocalTime = _ref2$keepLocalTime === void 0 ? false : _ref2$keepLocalTime, + _ref2$keepCalendarTim = _ref2.keepCalendarTime, + keepCalendarTime = _ref2$keepCalendarTim === void 0 ? false : _ref2$keepCalendarTim; + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + var newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + var offsetGuess = zone.offset(this.ts); + var asObj = this.toObject(); + var _objToTS3 = objToTS(asObj, offsetGuess, zone); + newTS = _objToTS3[0]; + } + return clone(this, { + ts: newTS, + zone: zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */; + _proto.reconfigure = function reconfigure(_temp2) { + var _ref3 = _temp2 === void 0 ? {} : _temp2, + locale = _ref3.locale, + numberingSystem = _ref3.numberingSystem, + outputCalendar = _ref3.outputCalendar; + var loc = this.loc.clone({ + locale: locale, + numberingSystem: numberingSystem, + outputCalendar: outputCalendar + }); + return clone(this, { + loc: loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */; + _proto.setLocale = function setLocale(locale) { + return this.reconfigure({ + locale: locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */; + _proto.set = function set(values) { + if (!this.isValid) return this; + var normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + var _usesLocalWeekValues2 = usesLocalWeekValues(normalized, this.loc), + minDaysInFirstWeek = _usesLocalWeekValues2.minDaysInFirstWeek, + startOfWeek = _usesLocalWeekValues2.startOfWeek; + var settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + var mixed; + if (settingWeekStuff) { + mixed = weekToGregorian(_extends({}, gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), normalized), minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian(_extends({}, gregorianToOrdinal(this.c), normalized)); + } else { + mixed = _extends({}, this.toObject(), normalized); + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + var _objToTS4 = objToTS(mixed, this.o, this.zone), + ts = _objToTS4[0], + o = _objToTS4[1]; + return clone(this, { + ts: ts, + o: o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */; + _proto.plus = function plus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */; + _proto.minus = function minus(duration) { + if (!this.isValid) return this; + var dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */; + _proto.startOf = function startOf(unit, _temp3) { + var _ref4 = _temp3 === void 0 ? {} : _temp3, + _ref4$useLocaleWeeks = _ref4.useLocaleWeeks, + useLocaleWeeks = _ref4$useLocaleWeeks === void 0 ? false : _ref4$useLocaleWeeks; + if (!this.isValid) return this; + var o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + var startOfWeek = this.loc.getStartOfWeek(); + var weekday = this.weekday; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + var q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */; + _proto.endOf = function endOf(unit, opts) { + var _this$plus; + return this.isValid ? this.plus((_this$plus = {}, _this$plus[unit] = 1, _this$plus)).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */; + _proto.toFormat = function toFormat(fmt, opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */; + _proto.toLocaleString = function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */; + _proto.toLocaleParts = function toLocaleParts(opts) { + if (opts === void 0) { + opts = {}; + } + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */; + _proto.toISO = function toISO(_temp4) { + var _ref5 = _temp4 === void 0 ? {} : _temp4, + _ref5$format = _ref5.format, + format = _ref5$format === void 0 ? "extended" : _ref5$format, + _ref5$suppressSeconds = _ref5.suppressSeconds, + suppressSeconds = _ref5$suppressSeconds === void 0 ? false : _ref5$suppressSeconds, + _ref5$suppressMillise = _ref5.suppressMilliseconds, + suppressMilliseconds = _ref5$suppressMillise === void 0 ? false : _ref5$suppressMillise, + _ref5$includeOffset = _ref5.includeOffset, + includeOffset = _ref5$includeOffset === void 0 ? true : _ref5$includeOffset, + _ref5$extendedZone = _ref5.extendedZone, + extendedZone = _ref5$extendedZone === void 0 ? false : _ref5$extendedZone, + _ref5$precision = _ref5.precision, + precision = _ref5$precision === void 0 ? "milliseconds" : _ref5$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var ext = format === "extended"; + var c = _toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += _toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */; + _proto.toISODate = function toISODate(_temp5) { + var _ref6 = _temp5 === void 0 ? {} : _temp5, + _ref6$format = _ref6.format, + format = _ref6$format === void 0 ? "extended" : _ref6$format, + _ref6$precision = _ref6.precision, + precision = _ref6$precision === void 0 ? "day" : _ref6$precision; + if (!this.isValid) { + return null; + } + return _toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */; + _proto.toISOWeekDate = function toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */; + _proto.toISOTime = function toISOTime(_temp6) { + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressMillise = _ref7.suppressMilliseconds, + suppressMilliseconds = _ref7$suppressMillise === void 0 ? false : _ref7$suppressMillise, + _ref7$suppressSeconds = _ref7.suppressSeconds, + suppressSeconds = _ref7$suppressSeconds === void 0 ? false : _ref7$suppressSeconds, + _ref7$includeOffset = _ref7.includeOffset, + includeOffset = _ref7$includeOffset === void 0 ? true : _ref7$includeOffset, + _ref7$includePrefix = _ref7.includePrefix, + includePrefix = _ref7$includePrefix === void 0 ? false : _ref7$includePrefix, + _ref7$extendedZone = _ref7.extendedZone, + extendedZone = _ref7$extendedZone === void 0 ? false : _ref7$extendedZone, + _ref7$format = _ref7.format, + format = _ref7$format === void 0 ? "extended" : _ref7$format, + _ref7$precision = _ref7.precision, + precision = _ref7$precision === void 0 ? "milliseconds" : _ref7$precision; + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + var c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + _toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */; + _proto.toRFC2822 = function toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */; + _proto.toHTTP = function toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */; + _proto.toSQLDate = function toSQLDate() { + if (!this.isValid) { + return null; + } + return _toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */; + _proto.toSQLTime = function toSQLTime(_temp7) { + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$includeOffset = _ref8.includeOffset, + includeOffset = _ref8$includeOffset === void 0 ? true : _ref8$includeOffset, + _ref8$includeZone = _ref8.includeZone, + includeZone = _ref8$includeZone === void 0 ? false : _ref8$includeZone, + _ref8$includeOffsetSp = _ref8.includeOffsetSpace, + includeOffsetSpace = _ref8$includeOffsetSp === void 0 ? true : _ref8$includeOffsetSp; + var fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */; + _proto.toSQL = function toSQL(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) { + return null; + } + return this.toSQLDate() + " " + this.toSQLTime(opts); + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */; + _proto.toString = function toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */; + _proto[_Symbol$for] = function () { + if (this.isValid) { + return "DateTime { ts: " + this.toISO() + ", zone: " + this.zone.name + ", locale: " + this.locale + " }"; + } else { + return "DateTime { Invalid, reason: " + this.invalidReason + " }"; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */; + _proto.valueOf = function valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */; + _proto.toMillis = function toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */; + _proto.toSeconds = function toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */; + _proto.toUnixInteger = function toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */; + _proto.toJSON = function toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */; + _proto.toBSON = function toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */; + _proto.toObject = function toObject(opts) { + if (opts === void 0) { + opts = {}; + } + if (!this.isValid) return {}; + var base = _extends({}, this.c); + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */; + _proto.toJSDate = function toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */; + _proto.diff = function diff(otherDateTime, unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + var durOpts = _extends({ + locale: this.locale, + numberingSystem: this.numberingSystem + }, opts); + var units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = _diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */; + _proto.diffNow = function diffNow(unit, opts) { + if (unit === void 0) { + unit = "milliseconds"; + } + if (opts === void 0) { + opts = {}; + } + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */; + _proto.until = function until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */; + _proto.hasSame = function hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + var inputMs = otherDateTime.valueOf(); + var adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */; + _proto.equals = function equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */; + _proto.toRelative = function toRelative(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + var base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + var units = ["years", "months", "days", "hours", "minutes", "seconds"]; + var unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), _extends({}, options, { + numeric: "always", + units: units, + unit: unit + })); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */; + _proto.toRelativeCalendar = function toRelativeCalendar(options) { + if (options === void 0) { + options = {}; + } + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, _extends({}, options, { + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + })); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */; + DateTime.min = function min() { + for (var _len = arguments.length, dateTimes = new Array(_len), _key = 0; _key < _len; _key++) { + dateTimes[_key] = arguments[_key]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */; + DateTime.max = function max() { + for (var _len2 = arguments.length, dateTimes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + dateTimes[_key2] = arguments[_key2]; + } + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, function (i) { + return i.valueOf(); + }, Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */; + DateTime.fromFormatExplain = function fromFormatExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + var _options = options, + _options$locale = _options.locale, + locale = _options$locale === void 0 ? null : _options$locale, + _options$numberingSys = _options.numberingSystem, + numberingSystem = _options$numberingSys === void 0 ? null : _options$numberingSys, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */; + DateTime.fromStringExplain = function fromStringExplain(text, fmt, options) { + if (options === void 0) { + options = {}; + } + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */; + DateTime.buildFormatParser = function buildFormatParser(fmt, options) { + if (options === void 0) { + options = {}; + } + var _options2 = options, + _options2$locale = _options2.locale, + locale = _options2$locale === void 0 ? null : _options2$locale, + _options2$numberingSy = _options2.numberingSystem, + numberingSystem = _options2$numberingSy === void 0 ? null : _options2$numberingSy, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */; + DateTime.fromFormatParser = function fromFormatParser(text, formatParser, opts) { + if (opts === void 0) { + opts = {}; + } + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + var _opts2 = opts, + _opts2$locale = _opts2.locale, + locale = _opts2$locale === void 0 ? null : _opts2$locale, + _opts2$numberingSyste = _opts2.numberingSystem, + numberingSystem = _opts2$numberingSyste === void 0 ? null : _opts2$numberingSyste, + localeToUse = Locale.fromOpts({ + locale: locale, + numberingSystem: numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError("fromFormatParser called with a locale of " + localeToUse + ", " + ("but the format parser was created for " + formatParser.locale)); + } + var _formatParser$explain = formatParser.explainFromTokens(text), + result = _formatParser$explain.result, + zone = _formatParser$explain.zone, + specificOffset = _formatParser$explain.specificOffset, + invalidReason = _formatParser$explain.invalidReason; + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, "format " + formatParser.format, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */; + _createClass(DateTime, [{ + key: "isValid", + get: function get() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidReason", + get: function get() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + }, { + key: "invalidExplanation", + get: function get() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "locale", + get: function get() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "numberingSystem", + get: function get() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + }, { + key: "outputCalendar", + get: function get() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + }, { + key: "zone", + get: function get() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + }, { + key: "zoneName", + get: function get() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + }, { + key: "year", + get: function get() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + }, { + key: "quarter", + get: function get() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + }, { + key: "month", + get: function get() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + }, { + key: "day", + get: function get() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + }, { + key: "hour", + get: function get() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + }, { + key: "minute", + get: function get() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + }, { + key: "second", + get: function get() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + }, { + key: "millisecond", + get: function get() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + }, { + key: "weekYear", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + }, { + key: "weekNumber", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + }, { + key: "weekday", + get: function get() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + }, { + key: "isWeekend", + get: function get() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + }, { + key: "localWeekday", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + }, { + key: "localWeekNumber", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + }, { + key: "localWeekYear", + get: function get() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + }, { + key: "ordinal", + get: function get() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + }, { + key: "monthShort", + get: function get() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + }, { + key: "monthLong", + get: function get() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + }, { + key: "weekdayShort", + get: function get() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + }, { + key: "weekdayLong", + get: function get() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + }, { + key: "offset", + get: function get() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameShort", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + }, { + key: "offsetNameLong", + get: function get() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + }, { + key: "isOffsetFixed", + get: function get() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + }, { + key: "isInDST", + get: function get() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + }, { + key: "isInLeapYear", + get: function get() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + }, { + key: "daysInMonth", + get: function get() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + }, { + key: "daysInYear", + get: function get() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + }, { + key: "weeksInWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + }, { + key: "weeksInLocalWeekYear", + get: function get() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + }], [{ + key: "DATE_SHORT", + get: function get() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED", + get: function get() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_MED_WITH_WEEKDAY", + get: function get() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_FULL", + get: function get() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + }, { + key: "DATE_HUGE", + get: function get() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_SIMPLE", + get: function get() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SECONDS", + get: function get() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_SHORT_OFFSET", + get: function get() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "TIME_WITH_LONG_OFFSET", + get: function get() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_SIMPLE", + get: function get() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SECONDS", + get: function get() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_SHORT_OFFSET", + get: function get() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + }, { + key: "TIME_24_WITH_LONG_OFFSET", + get: function get() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT", + get: function get() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_SHORT_WITH_SECONDS", + get: function get() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED", + get: function get() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_SECONDS", + get: function get() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_MED_WITH_WEEKDAY", + get: function get() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL", + get: function get() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_FULL_WITH_SECONDS", + get: function get() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE", + get: function get() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + }, { + key: "DATETIME_HUGE_WITH_SECONDS", + get: function get() { + return DATETIME_HUGE_WITH_SECONDS; + } + }]); + return DateTime; + }(Symbol.for("nodejs.util.inspect.custom")); + function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError("Unknown datetime argument: " + dateTimeish + ", of type " + typeof dateTimeish); + } + } + + var VERSION = "3.7.2"; + + exports.DateTime = DateTime; + exports.Duration = Duration; + exports.FixedOffsetZone = FixedOffsetZone; + exports.IANAZone = IANAZone; + exports.Info = Info; + exports.Interval = Interval; + exports.InvalidZone = InvalidZone; + exports.Settings = Settings; + exports.SystemZone = SystemZone; + exports.VERSION = VERSION; + exports.Zone = Zone; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}); +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/global/luxon.js.map b/node_modules/luxon/build/global/luxon.js.map new file mode 100644 index 0000000..a7bbf8d --- /dev/null +++ b/node_modules/luxon/build/global/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","_Error","_inheritsLoose","apply","arguments","_wrapNativeSuper","Error","InvalidDateTimeError","_LuxonError","reason","call","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","prototype","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","_createClass","key","get","name","singleton","SystemZone","_Zone","_ref","locale","parseZoneInfo","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","Map","makeDTF","zoneName","dtf","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","_formatted$i","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","_this","valid","NaN","isNaN","_ref2","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","_opts","base","cacheKeyOpts","_objectWithoutPropertiesLoose","_excluded","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","_extends","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","_options","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","_excluded2","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_proto3","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","_temp","numbering","_parseLocaleString","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","_this2","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","_this3","meridiems","_this4","eras","_this5","field","df","results","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","instance","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","_iterator","_createForOfIteratorHelperLoose","_step","done","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","_len","regexes","_key","full","source","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","_parseISODuration","fromISOTime","_parseISOTimeOnly","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","invalidReason","valueOf","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","_i4","_orderedUnits2","own","ak","negated","_i5","_Object$keys2","removeZeros","eq","v1","v2","_i6","_orderedUnits3","Symbol","for","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","_split","startIsValid","endIsValid","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","sofar","final","xor","_Array$prototype","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8","_ref8$locale","_temp9","_ref9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","_differs","_differs$_i","differ","_highOrderDiffs","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","_buildRegex","regexString","explainFromTokens","_match","rawMatches","parser","parseFromTokens","_explainFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","ianaName","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","_objToTS","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","_iterator2","_step2","higherOrderInvalid","gregorian","_objToTS2","tsFinal","offsetFinal","_parseISODate","fromRFC2822","_parseRFC2822Date","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","resolvedLocaleOptions","_Formatter$create$res","toLocal","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","newTS","asObj","_objToTS3","setLocale","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/global/luxon.min.js b/node_modules/luxon/build/global/luxon.min.js new file mode 100644 index 0000000..9b01303 --- /dev/null +++ b/node_modules/luxon/build/global/luxon.min.js @@ -0,0 +1 @@ +var luxon=function(e){"use strict";function L(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[n++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var t=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(q(Error)),P=function(t){function e(e){return t.call(this,"Invalid DateTime: "+e.toMessage())||this}return o(e,t),e}(t),Y=function(t){function e(e){return t.call(this,"Invalid Interval: "+e.toMessage())||this}return o(e,t),e}(t),H=function(t){function e(e){return t.call(this,"Invalid Duration: "+e.toMessage())||this}return o(e,t),e}(t),w=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(t),J=function(t){function e(e){return t.call(this,"Invalid unit "+e)||this}return o(e,t),e}(t),u=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(t),n=function(e){function t(){return e.call(this,"Zone is an abstract class")||this}return o(t,e),t}(t),t="numeric",r="short",a="long",G={year:t,month:t,day:t},$={year:t,month:r,day:t},B={year:t,month:r,day:t,weekday:r},Q={year:t,month:a,day:t},K={year:t,month:a,day:t,weekday:a},X={hour:t,minute:t},ee={hour:t,minute:t,second:t},te={hour:t,minute:t,second:t,timeZoneName:r},ne={hour:t,minute:t,second:t,timeZoneName:a},re={hour:t,minute:t,hourCycle:"h23"},ie={hour:t,minute:t,second:t,hourCycle:"h23"},oe={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:r},ae={hour:t,minute:t,second:t,hourCycle:"h23",timeZoneName:a},se={year:t,month:t,day:t,hour:t,minute:t},ue={year:t,month:t,day:t,hour:t,minute:t,second:t},le={year:t,month:r,day:t,hour:t,minute:t},ce={year:t,month:r,day:t,hour:t,minute:t,second:t},fe={year:t,month:r,day:t,weekday:r,hour:t,minute:t},de={year:t,month:a,day:t,hour:t,minute:t,timeZoneName:r},he={year:t,month:a,day:t,hour:t,minute:t,second:t,timeZoneName:r},me={year:t,month:a,day:t,weekday:a,hour:t,minute:t,timeZoneName:a},ye={year:t,month:a,day:t,weekday:a,hour:t,minute:t,second:t,timeZoneName:a},s=function(){function e(){}var t=e.prototype;return t.offsetName=function(e,t){throw new n},t.formatOffset=function(e,t){throw new n},t.offset=function(e){throw new n},t.equals=function(e){throw new n},i(e,[{key:"type",get:function(){throw new n}},{key:"name",get:function(){throw new n}},{key:"ianaName",get:function(){return this.name}},{key:"isUniversal",get:function(){throw new n}},{key:"isValid",get:function(){throw new n}}]),e}(),ve=null,ge=function(e){function t(){return e.apply(this,arguments)||this}o(t,e);var n=t.prototype;return n.offsetName=function(e,t){return Ot(e,t.format,t.locale)},n.formatOffset=function(e,t){return Dt(this.offset(e),t)},n.offset=function(e){return-new Date(e).getTimezoneOffset()},n.equals=function(e){return"system"===e.type},i(t,[{key:"type",get:function(){return"system"}},{key:"name",get:function(){return(new Intl.DateTimeFormat).resolvedOptions().timeZone}},{key:"isUniversal",get:function(){return!1}},{key:"isValid",get:function(){return!0}}],[{key:"instance",get:function(){return ve=null===ve?new t:ve}}]),t}(s),pe=new Map;var ke={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};var we=new Map,c=function(n){function r(e){var t=n.call(this)||this;return t.zoneName=e,t.valid=r.isValidZone(e),t}o(r,n),r.create=function(e){var t=we.get(e);return void 0===t&&we.set(e,t=new r(e)),t},r.resetCache=function(){we.clear(),pe.clear()},r.isValidSpecifier=function(e){return this.isValidZone(e)},r.isValidZone=function(e){if(!e)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(),!0}catch(e){return!1}};var e=r.prototype;return e.offsetName=function(e,t){return Ot(e,t.format,t.locale,this.name)},e.formatOffset=function(e,t){return Dt(this.offset(e),t)},e.offset=function(e){var t,n,r,i,o,a,s,u;return!this.valid||(e=new Date(e),isNaN(e))?NaN:(i=this.name,void 0===(o=pe.get(i))&&(o=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:i,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),pe.set(i,o)),a=(i=(i=o).formatToParts?function(e,t){for(var n=e.formatToParts(t),r=[],i=0;ibt(i,t,n)?(r=i+1,a=1):r=i,l({weekYear:r,weekNumber:a,weekday:o},It(e))}function it(e,t,n){void 0===n&&(n=1);var r,i=e.weekYear,o=e.weekNumber,a=e.weekday,n=nt(Xe(i,1,t=void 0===t?4:t),n),s=D(i),o=7*o+a-n-7+t,a=(o<1?o+=D(r=i-1):sO.twoDigitCutoffYear?1900+e:2e3+e}function Ot(e,t,n,r){void 0===r&&(r=null);var e=new Date(e),i={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"},r=(r&&(i.timeZone=r),l({timeZoneName:t},i)),t=new Intl.DateTimeFormat(n,r).formatToParts(e).find(function(e){return"timezonename"===e.type.toLowerCase()});return t?t.value:null}function Tt(e,t){e=parseInt(e,10),Number.isNaN(e)&&(e=0),t=parseInt(t,10)||0;return 60*e+(e<0||Object.is(e,-0)?-t:t)}function Nt(e){var t=Number(e);if("boolean"!=typeof e&&""!==e&&Number.isFinite(t))return t;throw new u("Invalid unit value "+e)}function Mt(e,t){var n,r,i={};for(n in e)h(e,n)&&null!=(r=e[n])&&(i[t(n)]=Nt(r));return i}function Dt(e,t){var n=Math.trunc(Math.abs(e/60)),r=Math.trunc(Math.abs(e%60)),i=0<=e?"+":"-";switch(t){case"short":return i+m(n,2)+":"+m(r,2);case"narrow":return i+n+(0e},t.isBefore=function(e){return!!this.isValid&&this.e<=e},t.contains=function(e){return!!this.isValid&&this.s<=e&&this.e>e},t.set=function(e){var e=void 0===e?{}:e,t=e.start,e=e.end;return this.isValid?l.fromDateTimes(t||this.s,e||this.e):this},t.splitAt=function(){var t=this;if(!this.isValid)return[];for(var e=arguments.length,n=new Array(e),r=0;r+this.e?this.e:u;o.push(l.fromDateTimes(a,u)),a=u,s+=1}return o},t.splitBy=function(e){var t=x.fromDurationLike(e);if(!this.isValid||!t.isValid||0===t.as("milliseconds"))return[];for(var n=this.s,r=1,i=[];n+this.e?this.e:o;i.push(l.fromDateTimes(n,o)),n=o,r+=1}return i},t.divideEqually=function(e){return this.isValid?this.splitBy(this.length()/e).slice(0,e):[]},t.overlaps=function(e){return this.e>e.s&&this.s=e.e},t.equals=function(e){return!(!this.isValid||!e.isValid)&&this.s.equals(e.s)&&this.e.equals(e.e)},t.intersection=function(e){var t;return this.isValid?(t=(this.s>e.s?this:e).s,(e=(this.ee.e?this:e).e,l.fromDateTimes(t,e)):this},l.merge=function(e){var e=e.sort(function(e,t){return e.s-t.s}).reduce(function(e,t){var n=e[0],e=e[1];return e?e.overlaps(t)||e.abutsStart(t)?[n,e.union(t)]:[n.concat([e]),t]:[n,t]},[[],null]),t=e[0],e=e[1];return e&&t.push(e),t},l.xor=function(e){for(var t,n=null,r=0,i=[],e=e.map(function(e){return[{time:e.s,type:"s"},{time:e.e,type:"e"}]}),o=R((t=Array.prototype).concat.apply(t,e).sort(function(e,t){return e.time-t.time}));!(a=o()).done;)var a=a.value,n=1===(r+="s"===a.type?1:-1)?a.time:(n&&+n!=+a.time&&i.push(l.fromDateTimes(n,a.time)),null);return l.merge(i)},t.difference=function(){for(var t=this,e=arguments.length,n=new Array(e),r=0;rthis.valueOf())?this:e,r?e:this,t,n),r?e.negate():e):x.invalid("created by diffing an invalid DateTime")},t.diffNow=function(e,t){return void 0===e&&(e="milliseconds"),void 0===t&&(t={}),this.diff(k.now(),e,t)},t.until=function(e){return this.isValid?Zn.fromDateTimes(this,e):this},t.hasSame=function(e,t,n){var r;return!!this.isValid&&(r=e.valueOf(),(e=this.setZone(e.zone,{keepLocalTime:!0})).startOf(t,n)<=r)&&r<=e.endOf(t,n)},t.equals=function(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)},t.toRelative=function(e){var t,n,r,i;return this.isValid?(t=(e=void 0===e?{}:e).base||k.fromObject({},{zone:this.zone}),n=e.padding?thisthis.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}},{key:"isInLeapYear",get:function(){return gt(this.year)}},{key:"daysInMonth",get:function(){return pt(this.year,this.month)}},{key:"daysInYear",get:function(){return this.isValid?D(this.year):NaN}},{key:"weeksInWeekYear",get:function(){return this.isValid?bt(this.weekYear):NaN}},{key:"weeksInLocalWeekYear",get:function(){return this.isValid?bt(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}}],[{key:"DATE_SHORT",get:function(){return G}},{key:"DATE_MED",get:function(){return $}},{key:"DATE_MED_WITH_WEEKDAY",get:function(){return B}},{key:"DATE_FULL",get:function(){return Q}},{key:"DATE_HUGE",get:function(){return K}},{key:"TIME_SIMPLE",get:function(){return X}},{key:"TIME_WITH_SECONDS",get:function(){return ee}},{key:"TIME_WITH_SHORT_OFFSET",get:function(){return te}},{key:"TIME_WITH_LONG_OFFSET",get:function(){return ne}},{key:"TIME_24_SIMPLE",get:function(){return re}},{key:"TIME_24_WITH_SECONDS",get:function(){return ie}},{key:"TIME_24_WITH_SHORT_OFFSET",get:function(){return oe}},{key:"TIME_24_WITH_LONG_OFFSET",get:function(){return ae}},{key:"DATETIME_SHORT",get:function(){return se}},{key:"DATETIME_SHORT_WITH_SECONDS",get:function(){return ue}},{key:"DATETIME_MED",get:function(){return le}},{key:"DATETIME_MED_WITH_SECONDS",get:function(){return ce}},{key:"DATETIME_MED_WITH_WEEKDAY",get:function(){return fe}},{key:"DATETIME_FULL",get:function(){return de}},{key:"DATETIME_FULL_WITH_SECONDS",get:function(){return he}},{key:"DATETIME_HUGE",get:function(){return me}},{key:"DATETIME_HUGE_WITH_SECONDS",get:function(){return ye}}]),k}(Symbol.for("nodejs.util.inspect.custom"));function Or(e){if(W.isDateTime(e))return e;if(e&&e.valueOf&&v(e.valueOf()))return W.fromJSDate(e);if(e&&"object"==typeof e)return W.fromObject(e);throw new u("Unknown datetime argument: "+e+", of type "+typeof e)}return e.DateTime=W,e.Duration=x,e.FixedOffsetZone=f,e.IANAZone=c,e.Info=Wn,e.Interval=Zn,e.InvalidZone=ze,e.Settings=O,e.SystemZone=ge,e.VERSION="3.7.2",e.Zone=s,Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file diff --git a/node_modules/luxon/build/global/luxon.min.js.map b/node_modules/luxon/build/global/luxon.min.js.map new file mode 100644 index 0000000..64d99aa --- /dev/null +++ b/node_modules/luxon/build/global/luxon.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"build/global/luxon.js","sources":["0"],"names":["luxon","exports","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","arg","key","input","hint","prim","Symbol","toPrimitive","undefined","String","Number","res","call","TypeError","_createClass","Constructor","protoProps","staticProps","prototype","_extends","assign","bind","arguments","source","hasOwnProperty","apply","this","_inheritsLoose","subClass","superClass","create","_setPrototypeOf","constructor","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","p","_construct","Parent","args","Class","Reflect","construct","sham","Proxy","Boolean","valueOf","e","a","push","instance","Function","_wrapNativeSuper","_cache","Map","toString","indexOf","has","get","set","Wrapper","value","_objectWithoutPropertiesLoose","excluded","sourceKeys","keys","_arrayLikeToArray","arr","len","arr2","Array","_createForOfIteratorHelperLoose","allowArrayLike","it","iterator","next","isArray","minLen","n","slice","name","from","test","done","LuxonError","_Error","Error","InvalidDateTimeError","_LuxonError","reason","toMessage","InvalidIntervalError","_LuxonError2","InvalidDurationError","_LuxonError3","ConflictingSpecificationError","_LuxonError4","InvalidUnitError","_LuxonError5","unit","InvalidArgumentError","_LuxonError6","ZoneIsAbstractError","_LuxonError7","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","_proto","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","singleton$1","SystemZone","_Zone","_ref","parseZoneInfo","locale","Date","getTimezoneOffset","type","Intl","DateTimeFormat","resolvedOptions","timeZone","dtfCache","typeToPos","era","ianaZoneCache","IANAZone","_this","zoneName","valid","isValidZone","zone","resetCache","clear","isValidSpecifier","adOrBc","dtf","date","fDay","adjustedHour","over","isNaN","NaN","hour12","_ref2","formatToParts","formatted","filled","_formatted$i","pos","isUndefined","parseInt","replace","fMonth","parsed","exec","asTS","objToLocalTS","Math","abs","millisecond","_excluded","_excluded2","intlLFCache","intlDTCache","getCachedDTF","locString","JSON","stringify","intlNumCache","intlRelCache","sysLocaleCache","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","listStuff","loc","englishFn","intlFn","mode","listingMode","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","intlOpts","useGrouping","minimumIntegerDigits","inf","NumberFormat","fixed","padStart","roundTo","PolyDateFormatter","dt","z","originalZone","offsetZ","gmtOffset","setZone","plus","minutes","_proto2","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","_opts","base","cacheKeyOpts","RelativeTimeFormat","_proto3","count","formatRelativeTime","numeric","narrow","units","years","quarters","months","weeks","days","hours","seconds","lastable","isDay","isInPast","is","singular","fmtValue","lilUnits","fmtUnit","fallbackWeekSettings","firstDay","minimalDays","weekend","Locale","numbering","outputCalendar","weekSettings","specifiedLocale","_parseLocaleString","localeStr","xIndex","uIndex","substring","options","selectedStr","smaller","_options","numberingSystem","calendar","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","includes","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","fromOpts","defaultToEN","Settings","defaultLocale","defaultNumberingSystem","defaultOutputCalendar","validateWeekSettings","defaultWeekSettings","fromObject","_temp","_proto4","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","_this2","monthSpecialCase","startsWith","formatStr","f","ms","DateTime","utc","dtFormatter","extract","weekdays","_this3","meridiems","_this4","eras","_this5","field","matching","find","m","toLowerCase","numberFormatter","fastNumbers","relFormatter","listFormatter","ListFormat","getWeekSettings","hasLocaleWeekInfo","data","getWeekInfo","weekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","singleton","FixedOffsetZone","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","defaultZone","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","digitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","throwOnInvalid","now","twoDigitCutoffYear","resetCaches","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekYear","weekNumber","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","_uncomputeOrdinal","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","_uncomputeOrdinal2","usesLocalWeekValues","obj","localWeekday","localWeekNumber","localWeekYear","hasInvalidGregorianData","validYear","isInteger","validMonth","integerBetween","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","bestBy","by","compare","reduce","best","pair","prop","settings","some","v","thing","bottom","top","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","pow","ceil","trunc","round","RangeError","modMonth","x","firstWeekOffset","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","offMin","asNumber","numericValue","isFinite","normalizeObject","normalizer","u","normalized","sign","k","monthsLong","monthsShort","monthsNarrow","concat","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","stringifyTokens","splits","tokenToString","_iterator","_step","token","literal","val","_macroTokenToFormatOpts","D","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","formatOpts","systemLoc","parseFormat","fmt","current","currentFull","bracketed","c","charAt","macroTokenToFormatOpts","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","isValid","meridiem","maybeMacro","quarter","formatDurationFromString","dur","lildur","info","invertLargest","signMode","tokenToField","tokens","realTokens","found","collapsed","shiftTo","filter","durationInfo","isNegativeDuration","largestUnit","values","inversionFactor","mapped","ianaRegex","combineRegexes","_len","regexes","_key","full","combineExtractors","_len2","extractors","_key2","ex","mergedVals","mergedZone","cursor","_ex","parse","_len3","patterns","_key3","_i","_patterns","_patterns$_i","extractor","simpleParse","_len4","_key4","ret","offsetRegex","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","extractISOWeekData","extractISOOrdinalData","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","maybeNegate","force","hasNegativePrefix","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","negativeSeconds","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","extractISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","INVALID$2","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits$1","reverseUnits","reverse","clone$1","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","conv","rollUp","previousVal","removeZeroes","newVals","_Object$entries","entries","_Object$entries$_i","_Symbol$for","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","fromISOTime","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","toJSON","invalidReason","duration","_i2","_orderedUnits","minus","negate","mapUnits","fn","_i3","_Object$keys","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","_i4","_orderedUnits2","ak","lastUnit","own","negated","_i5","_Object$keys2","removeZeros","v1","_i6","_orderedUnits3","v2","for","INVALID$1","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","endIsValid","_split","startIsValid","_dur","isInterval","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","dateTime","isBefore","contains","splitAt","dateTimes","sorted","sort","b","results","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","_intervals$sort$reduc","item","sofar","final","xor","_Array$prototype","currentCount","ends","time","difference","toLocaleString","toISODate","dateFormat","_temp2","_ref3$separator","separator","mapEndpoints","mapFn","Info","hasDST","proto","isUniversal","isValidIANAZone","_ref$locale","_ref$locObj","locObj","getMinimumDaysInFirstWeek","_ref2$locale","_ref2$locObj","getWeekendWeekdays","_temp3","_ref3","_ref3$locale","_ref3$locObj","_temp4","_ref4","_ref4$locale","_ref4$numberingSystem","_ref4$locObj","_ref4$outputCalendar","monthsFormat","_temp5","_ref5","_ref5$locale","_ref5$numberingSystem","_ref5$locObj","_ref5$outputCalendar","_temp6","_ref6","_ref6$locale","_ref6$numberingSystem","_ref6$locObj","weekdaysFormat","_temp7","_ref7","_ref7$locale","_ref7$numberingSystem","_ref7$locObj","_temp8","_ref8$locale","_temp9","_ref9$locale","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","_diff","_highOrderDiffs","lowestOrder","highWater","_differs","_differs$_i","differ","remainingMillis","lowerOrderUnits","_cursor$plus","_Duration$fromMillis","MISSING_FTP","intUnit","post","deser","str","code","charCodeAt","search","_numberingSystemsUTF","min","max","spaceOrNBSP","fromCharCode","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","simple","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","partTypeStyleToTokenVal","2-digit","short","long","dayperiod","dayPeriod","hour24","dummyDateTimeCache","expandMacroTokens","formatOptsToTokens","TokenParser","handlers","disqualifyingUnit","_buildRegex","explainFromTokens","_match","matches","h","all","matchIndex","rawMatches","Z","specificOffset","q","M","G","y","S","resolvedOpts","df","isSpace","actualType","INVALID","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","_fixOffset","parseDataToDateTime","parsedZone","toTechFormat","_toISODate","extended","precision","longFormat","_toISOTime","extendedZone","showSeconds","ianaName","zoneOffsetTs","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedUnits","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","quickDT","offsetGuess","_objToTS","zoneOffsetGuessCache","diffRelative","calendary","lastOpts","argList","ot","_zone","isLuxonDateTime","_lastOpts","_lastOpts2","fromJSDate","zoneToUse","fromSeconds","_usesLocalWeekValues","tsNow","offsetProvis","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","defaultValues","useWeekData","objNow","foundFirst","_iterator2","_step2","validWeek","validWeekday","validOrdinal","_objToTS2","_parseISODate","fromRFC2822","_parseRFC2822Date","trim","fromHTTP","_parseHTTPDate","fromFormat","_opts$locale","_opts$numberingSystem","localeToUse","_parseFromTokens","_explainFromTokens","fromString","fromSQL","_parseSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","getPossibleOffsets","ts1","ts2","c1","c2","oEarlier","oLater","o1","resolvedLocaleOptions","_Formatter$create$res","toLocal","newTS","_ref2$keepLocalTime","_ref2$keepCalendarTim","keepCalendarTime","setLocale","mixed","_usesLocalWeekValues2","settingWeekStuff","_objToTS4","_ref4$useLocaleWeeks","normalizedUnit","endOf","_this$plus","toLocaleParts","_ref5$format","_ref5$suppressSeconds","_ref5$suppressMillise","_ref5$includeOffset","_ref5$extendedZone","_ref5$precision","ext","_ref6$format","_ref6$precision","toISOWeekDate","_ref7$suppressMillise","_ref7$suppressSeconds","_ref7$includeOffset","_ref7$includePrefix","_ref7$extendedZone","_ref7$format","_ref7$precision","toRFC2822","toHTTP","toSQLDate","toSQLTime","_ref8","_ref8$includeOffset","_ref8$includeZone","includeZone","_ref8$includeOffsetSp","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","otherIsLater","durOpts","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","_options$locale","_options$numberingSys","fromStringExplain","buildFormatParser","_options2","_options2$locale","_options2$numberingSy","fromFormatParser","formatParser","_opts2","_opts2$locale","_opts2$numberingSyste","_formatParser$explain","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/build/node/luxon.js b/node_modules/luxon/build/node/luxon.js new file mode 100644 index 0000000..a8ee891 --- /dev/null +++ b/node_modules/luxon/build/node/luxon.js @@ -0,0 +1,7792 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +// these aren't really private, but nor are they really useful to document + +/** + * @private + */ +class LuxonError extends Error {} + +/** + * @private + */ +class InvalidDateTimeError extends LuxonError { + constructor(reason) { + super(`Invalid DateTime: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidIntervalError extends LuxonError { + constructor(reason) { + super(`Invalid Interval: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class InvalidDurationError extends LuxonError { + constructor(reason) { + super(`Invalid Duration: ${reason.toMessage()}`); + } +} + +/** + * @private + */ +class ConflictingSpecificationError extends LuxonError {} + +/** + * @private + */ +class InvalidUnitError extends LuxonError { + constructor(unit) { + super(`Invalid unit ${unit}`); + } +} + +/** + * @private + */ +class InvalidArgumentError extends LuxonError {} + +/** + * @private + */ +class ZoneIsAbstractError extends LuxonError { + constructor() { + super("Zone is an abstract class"); + } +} + +/** + * @private + */ + +const n = "numeric", + s = "short", + l = "long"; +const DATE_SHORT = { + year: n, + month: n, + day: n +}; +const DATE_MED = { + year: n, + month: s, + day: n +}; +const DATE_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s +}; +const DATE_FULL = { + year: n, + month: l, + day: n +}; +const DATE_HUGE = { + year: n, + month: l, + day: n, + weekday: l +}; +const TIME_SIMPLE = { + hour: n, + minute: n +}; +const TIME_WITH_SECONDS = { + hour: n, + minute: n, + second: n +}; +const TIME_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +const TIME_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + timeZoneName: l +}; +const TIME_24_SIMPLE = { + hour: n, + minute: n, + hourCycle: "h23" +}; +const TIME_24_WITH_SECONDS = { + hour: n, + minute: n, + second: n, + hourCycle: "h23" +}; +const TIME_24_WITH_SHORT_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: s +}; +const TIME_24_WITH_LONG_OFFSET = { + hour: n, + minute: n, + second: n, + hourCycle: "h23", + timeZoneName: l +}; +const DATETIME_SHORT = { + year: n, + month: n, + day: n, + hour: n, + minute: n +}; +const DATETIME_SHORT_WITH_SECONDS = { + year: n, + month: n, + day: n, + hour: n, + minute: n, + second: n +}; +const DATETIME_MED = { + year: n, + month: s, + day: n, + hour: n, + minute: n +}; +const DATETIME_MED_WITH_SECONDS = { + year: n, + month: s, + day: n, + hour: n, + minute: n, + second: n +}; +const DATETIME_MED_WITH_WEEKDAY = { + year: n, + month: s, + day: n, + weekday: s, + hour: n, + minute: n +}; +const DATETIME_FULL = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + timeZoneName: s +}; +const DATETIME_FULL_WITH_SECONDS = { + year: n, + month: l, + day: n, + hour: n, + minute: n, + second: n, + timeZoneName: s +}; +const DATETIME_HUGE = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + timeZoneName: l +}; +const DATETIME_HUGE_WITH_SECONDS = { + year: n, + month: l, + day: n, + weekday: l, + hour: n, + minute: n, + second: n, + timeZoneName: l +}; + +/** + * @interface + */ +class Zone { + /** + * The type of zone + * @abstract + * @type {string} + */ + get type() { + throw new ZoneIsAbstractError(); + } + + /** + * The name of this zone. + * @abstract + * @type {string} + */ + get name() { + throw new ZoneIsAbstractError(); + } + + /** + * The IANA name of this zone. + * Defaults to `name` if not overwritten by a subclass. + * @abstract + * @type {string} + */ + get ianaName() { + return this.name; + } + + /** + * Returns whether the offset is known to be fixed for the whole year. + * @abstract + * @type {boolean} + */ + get isUniversal() { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, opts) { + throw new ZoneIsAbstractError(); + } + + /** + * Returns the offset's value as a string + * @abstract + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + throw new ZoneIsAbstractError(); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @abstract + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is equal to another zone + * @abstract + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + throw new ZoneIsAbstractError(); + } + + /** + * Return whether this Zone is valid. + * @abstract + * @type {boolean} + */ + get isValid() { + throw new ZoneIsAbstractError(); + } +} + +let singleton$1 = null; + +/** + * Represents the local zone for this JavaScript environment. + * @implements {Zone} + */ +class SystemZone extends Zone { + /** + * Get a singleton instance of the local zone + * @return {SystemZone} + */ + static get instance() { + if (singleton$1 === null) { + singleton$1 = new SystemZone(); + } + return singleton$1; + } + + /** @override **/ + get type() { + return "system"; + } + + /** @override **/ + get name() { + return new Intl.DateTimeFormat().resolvedOptions().timeZone; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName(ts, { + format, + locale + }) { + return parseZoneInfo(ts, format, locale); + } + + /** @override **/ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** @override **/ + offset(ts) { + return -new Date(ts).getTimezoneOffset(); + } + + /** @override **/ + equals(otherZone) { + return otherZone.type === "system"; + } + + /** @override **/ + get isValid() { + return true; + } +} + +const dtfCache = new Map(); +function makeDTF(zoneName) { + let dtf = dtfCache.get(zoneName); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat("en-US", { + hour12: false, + timeZone: zoneName, + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + era: "short" + }); + dtfCache.set(zoneName, dtf); + } + return dtf; +} +const typeToPos = { + year: 0, + month: 1, + day: 2, + era: 3, + hour: 4, + minute: 5, + second: 6 +}; +function hackyOffset(dtf, date) { + const formatted = dtf.format(date).replace(/\u200E/g, ""), + parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), + [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed; + return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; +} +function partsOffset(dtf, date) { + const formatted = dtf.formatToParts(date); + const filled = []; + for (let i = 0; i < formatted.length; i++) { + const { + type, + value + } = formatted[i]; + const pos = typeToPos[type]; + if (type === "era") { + filled[pos] = value; + } else if (!isUndefined(pos)) { + filled[pos] = parseInt(value, 10); + } + } + return filled; +} +const ianaZoneCache = new Map(); +/** + * A zone identified by an IANA identifier, like America/New_York + * @implements {Zone} + */ +class IANAZone extends Zone { + /** + * @param {string} name - Zone name + * @return {IANAZone} + */ + static create(name) { + let zone = ianaZoneCache.get(name); + if (zone === undefined) { + ianaZoneCache.set(name, zone = new IANAZone(name)); + } + return zone; + } + + /** + * Reset local caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCache() { + ianaZoneCache.clear(); + dtfCache.clear(); + } + + /** + * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. + * @param {string} s - The string to check validity on + * @example IANAZone.isValidSpecifier("America/New_York") //=> true + * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false + * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. + * @return {boolean} + */ + static isValidSpecifier(s) { + return this.isValidZone(s); + } + + /** + * Returns whether the provided string identifies a real zone + * @param {string} zone - The string to check + * @example IANAZone.isValidZone("America/New_York") //=> true + * @example IANAZone.isValidZone("Fantasia/Castle") //=> false + * @example IANAZone.isValidZone("Sport~~blorp") //=> false + * @return {boolean} + */ + static isValidZone(zone) { + if (!zone) { + return false; + } + try { + new Intl.DateTimeFormat("en-US", { + timeZone: zone + }).format(); + return true; + } catch (e) { + return false; + } + } + constructor(name) { + super(); + /** @private **/ + this.zoneName = name; + /** @private **/ + this.valid = IANAZone.isValidZone(name); + } + + /** + * The type of zone. `iana` for all instances of `IANAZone`. + * @override + * @type {string} + */ + get type() { + return "iana"; + } + + /** + * The name of this zone (i.e. the IANA zone name). + * @override + * @type {string} + */ + get name() { + return this.zoneName; + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns false for all IANA zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return false; + } + + /** + * Returns the offset's common name (such as EST) at the specified timestamp + * @override + * @param {number} ts - Epoch milliseconds for which to get the name + * @param {Object} opts - Options to affect the format + * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. + * @param {string} opts.locale - What locale to return the offset name in. + * @return {string} + */ + offsetName(ts, { + format, + locale + }) { + return parseZoneInfo(ts, format, locale, this.name); + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.offset(ts), format); + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * @override + * @param {number} ts - Epoch milliseconds for which to compute the offset + * @return {number} + */ + offset(ts) { + if (!this.valid) return NaN; + const date = new Date(ts); + if (isNaN(date)) return NaN; + const dtf = makeDTF(this.name); + let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date); + if (adOrBc === "BC") { + year = -Math.abs(year) + 1; + } + + // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat + const adjustedHour = hour === 24 ? 0 : hour; + const asUTC = objToLocalTS({ + year, + month, + day, + hour: adjustedHour, + minute, + second, + millisecond: 0 + }); + let asTS = +date; + const over = asTS % 1000; + asTS -= over >= 0 ? over : 1000 + over; + return (asUTC - asTS) / (60 * 1000); + } + + /** + * Return whether this Zone is equal to another zone + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "iana" && otherZone.name === this.name; + } + + /** + * Return whether this Zone is valid. + * @override + * @type {boolean} + */ + get isValid() { + return this.valid; + } +} + +// todo - remap caching + +let intlLFCache = {}; +function getCachedLF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlLFCache[key]; + if (!dtf) { + dtf = new Intl.ListFormat(locString, opts); + intlLFCache[key] = dtf; + } + return dtf; +} +const intlDTCache = new Map(); +function getCachedDTF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let dtf = intlDTCache.get(key); + if (dtf === undefined) { + dtf = new Intl.DateTimeFormat(locString, opts); + intlDTCache.set(key, dtf); + } + return dtf; +} +const intlNumCache = new Map(); +function getCachedINF(locString, opts = {}) { + const key = JSON.stringify([locString, opts]); + let inf = intlNumCache.get(key); + if (inf === undefined) { + inf = new Intl.NumberFormat(locString, opts); + intlNumCache.set(key, inf); + } + return inf; +} +const intlRelCache = new Map(); +function getCachedRTF(locString, opts = {}) { + const { + base, + ...cacheKeyOpts + } = opts; // exclude `base` from the options + const key = JSON.stringify([locString, cacheKeyOpts]); + let inf = intlRelCache.get(key); + if (inf === undefined) { + inf = new Intl.RelativeTimeFormat(locString, opts); + intlRelCache.set(key, inf); + } + return inf; +} +let sysLocaleCache = null; +function systemLocale() { + if (sysLocaleCache) { + return sysLocaleCache; + } else { + sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; + return sysLocaleCache; + } +} +const intlResolvedOptionsCache = new Map(); +function getCachedIntResolvedOptions(locString) { + let opts = intlResolvedOptionsCache.get(locString); + if (opts === undefined) { + opts = new Intl.DateTimeFormat(locString).resolvedOptions(); + intlResolvedOptionsCache.set(locString, opts); + } + return opts; +} +const weekInfoCache = new Map(); +function getCachedWeekInfo(locString) { + let data = weekInfoCache.get(locString); + if (!data) { + const locale = new Intl.Locale(locString); + // browsers currently implement this as a property, but spec says it should be a getter function + data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; + // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 + if (!("minimalDays" in data)) { + data = { + ...fallbackWeekSettings, + ...data + }; + } + weekInfoCache.set(locString, data); + } + return data; +} +function parseLocaleString(localeStr) { + // I really want to avoid writing a BCP 47 parser + // see, e.g. https://github.com/wooorm/bcp-47 + // Instead, we'll do this: + + // a) if the string has no -u extensions, just leave it alone + // b) if it does, use Intl to resolve everything + // c) if Intl fails, try again without the -u + + // private subtags and unicode subtags have ordering requirements, + // and we're not properly parsing this, so just strip out the + // private ones if they exist. + const xIndex = localeStr.indexOf("-x-"); + if (xIndex !== -1) { + localeStr = localeStr.substring(0, xIndex); + } + const uIndex = localeStr.indexOf("-u-"); + if (uIndex === -1) { + return [localeStr]; + } else { + let options; + let selectedStr; + try { + options = getCachedDTF(localeStr).resolvedOptions(); + selectedStr = localeStr; + } catch (e) { + const smaller = localeStr.substring(0, uIndex); + options = getCachedDTF(smaller).resolvedOptions(); + selectedStr = smaller; + } + const { + numberingSystem, + calendar + } = options; + return [selectedStr, numberingSystem, calendar]; + } +} +function intlConfigString(localeStr, numberingSystem, outputCalendar) { + if (outputCalendar || numberingSystem) { + if (!localeStr.includes("-u-")) { + localeStr += "-u"; + } + if (outputCalendar) { + localeStr += `-ca-${outputCalendar}`; + } + if (numberingSystem) { + localeStr += `-nu-${numberingSystem}`; + } + return localeStr; + } else { + return localeStr; + } +} +function mapMonths(f) { + const ms = []; + for (let i = 1; i <= 12; i++) { + const dt = DateTime.utc(2009, i, 1); + ms.push(f(dt)); + } + return ms; +} +function mapWeekdays(f) { + const ms = []; + for (let i = 1; i <= 7; i++) { + const dt = DateTime.utc(2016, 11, 13 + i); + ms.push(f(dt)); + } + return ms; +} +function listStuff(loc, length, englishFn, intlFn) { + const mode = loc.listingMode(); + if (mode === "error") { + return null; + } else if (mode === "en") { + return englishFn(length); + } else { + return intlFn(length); + } +} +function supportsFastNumbers(loc) { + if (loc.numberingSystem && loc.numberingSystem !== "latn") { + return false; + } else { + return loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn"; + } +} + +/** + * @private + */ + +class PolyNumberFormatter { + constructor(intl, forceSimple, opts) { + this.padTo = opts.padTo || 0; + this.floor = opts.floor || false; + const { + padTo, + floor, + ...otherOpts + } = opts; + if (!forceSimple || Object.keys(otherOpts).length > 0) { + const intlOpts = { + useGrouping: false, + ...opts + }; + if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; + this.inf = getCachedINF(intl, intlOpts); + } + } + format(i) { + if (this.inf) { + const fixed = this.floor ? Math.floor(i) : i; + return this.inf.format(fixed); + } else { + // to match the browser's numberformatter defaults + const fixed = this.floor ? Math.floor(i) : roundTo(i, 3); + return padStart(fixed, this.padTo); + } + } +} + +/** + * @private + */ + +class PolyDateFormatter { + constructor(dt, intl, opts) { + this.opts = opts; + this.originalZone = undefined; + let z = undefined; + if (this.opts.timeZone) { + // Don't apply any workarounds if a timeZone is explicitly provided in opts + this.dt = dt; + } else if (dt.zone.type === "fixed") { + // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. + // That is why fixed-offset TZ is set to that unless it is: + // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. + // 2. Unsupported by the browser: + // - some do not support Etc/ + // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata + const gmtOffset = -1 * (dt.offset / 60); + const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`; + if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { + z = offsetZ; + this.dt = dt; + } else { + // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so + // we manually apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + } else if (dt.zone.type === "system") { + this.dt = dt; + } else if (dt.zone.type === "iana") { + this.dt = dt; + z = dt.zone.name; + } else { + // Custom zones can have any offset / offsetName so we just manually + // apply the offset and substitute the zone as needed. + z = "UTC"; + this.dt = dt.setZone("UTC").plus({ + minutes: dt.offset + }); + this.originalZone = dt.zone; + } + const intlOpts = { + ...this.opts + }; + intlOpts.timeZone = intlOpts.timeZone || z; + this.dtf = getCachedDTF(intl, intlOpts); + } + format() { + if (this.originalZone) { + // If we have to substitute in the actual zone name, we have to use + // formatToParts so that the timezone can be replaced. + return this.formatToParts().map(({ + value + }) => value).join(""); + } + return this.dtf.format(this.dt.toJSDate()); + } + formatToParts() { + const parts = this.dtf.formatToParts(this.dt.toJSDate()); + if (this.originalZone) { + return parts.map(part => { + if (part.type === "timeZoneName") { + const offsetName = this.originalZone.offsetName(this.dt.ts, { + locale: this.dt.locale, + format: this.opts.timeZoneName + }); + return { + ...part, + value: offsetName + }; + } else { + return part; + } + }); + } + return parts; + } + resolvedOptions() { + return this.dtf.resolvedOptions(); + } +} + +/** + * @private + */ +class PolyRelFormatter { + constructor(intl, isEnglish, opts) { + this.opts = { + style: "long", + ...opts + }; + if (!isEnglish && hasRelative()) { + this.rtf = getCachedRTF(intl, opts); + } + } + format(count, unit) { + if (this.rtf) { + return this.rtf.format(count, unit); + } else { + return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); + } + } + formatToParts(count, unit) { + if (this.rtf) { + return this.rtf.formatToParts(count, unit); + } else { + return []; + } + } +} +const fallbackWeekSettings = { + firstDay: 1, + minimalDays: 4, + weekend: [6, 7] +}; + +/** + * @private + */ +class Locale { + static fromOpts(opts) { + return Locale.create(opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN); + } + static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) { + const specifiedLocale = locale || Settings.defaultLocale; + // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats + const localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); + const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; + const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; + const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; + return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); + } + static resetCache() { + sysLocaleCache = null; + intlDTCache.clear(); + intlNumCache.clear(); + intlRelCache.clear(); + intlResolvedOptionsCache.clear(); + weekInfoCache.clear(); + } + static fromObject({ + locale, + numberingSystem, + outputCalendar, + weekSettings + } = {}) { + return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); + } + constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { + const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale); + this.locale = parsedLocale; + this.numberingSystem = numbering || parsedNumberingSystem || null; + this.outputCalendar = outputCalendar || parsedOutputCalendar || null; + this.weekSettings = weekSettings; + this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); + this.weekdaysCache = { + format: {}, + standalone: {} + }; + this.monthsCache = { + format: {}, + standalone: {} + }; + this.meridiemCache = null; + this.eraCache = {}; + this.specifiedLocale = specifiedLocale; + this.fastNumbersCached = null; + } + get fastNumbers() { + if (this.fastNumbersCached == null) { + this.fastNumbersCached = supportsFastNumbers(this); + } + return this.fastNumbersCached; + } + listingMode() { + const isActuallyEn = this.isEnglish(); + const hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); + return isActuallyEn && hasNoWeirdness ? "en" : "intl"; + } + clone(alts) { + if (!alts || Object.getOwnPropertyNames(alts).length === 0) { + return this; + } else { + return Locale.create(alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false); + } + } + redefaultToEN(alts = {}) { + return this.clone({ + ...alts, + defaultToEN: true + }); + } + redefaultToSystem(alts = {}) { + return this.clone({ + ...alts, + defaultToEN: false + }); + } + months(length, format = false) { + return listStuff(this, length, months, () => { + // Workaround for "ja" locale: formatToParts does not label all parts of the month + // as "month" and for this locale there is no difference between "format" and "non-format". + // As such, just use format() instead of formatToParts() and take the whole string + const monthSpecialCase = this.intl === "ja" || this.intl.startsWith("ja-"); + format &= !monthSpecialCase; + const intl = format ? { + month: length, + day: "numeric" + } : { + month: length + }, + formatStr = format ? "format" : "standalone"; + if (!this.monthsCache[formatStr][length]) { + const mapper = !monthSpecialCase ? dt => this.extract(dt, intl, "month") : dt => this.dtFormatter(dt, intl).format(); + this.monthsCache[formatStr][length] = mapMonths(mapper); + } + return this.monthsCache[formatStr][length]; + }); + } + weekdays(length, format = false) { + return listStuff(this, length, weekdays, () => { + const intl = format ? { + weekday: length, + year: "numeric", + month: "long", + day: "numeric" + } : { + weekday: length + }, + formatStr = format ? "format" : "standalone"; + if (!this.weekdaysCache[formatStr][length]) { + this.weekdaysCache[formatStr][length] = mapWeekdays(dt => this.extract(dt, intl, "weekday")); + } + return this.weekdaysCache[formatStr][length]; + }); + } + meridiems() { + return listStuff(this, undefined, () => meridiems, () => { + // In theory there could be aribitrary day periods. We're gonna assume there are exactly two + // for AM and PM. This is probably wrong, but it's makes parsing way easier. + if (!this.meridiemCache) { + const intl = { + hour: "numeric", + hourCycle: "h12" + }; + this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(dt => this.extract(dt, intl, "dayperiod")); + } + return this.meridiemCache; + }); + } + eras(length) { + return listStuff(this, length, eras, () => { + const intl = { + era: length + }; + + // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates + // to definitely enumerate them. + if (!this.eraCache[length]) { + this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map(dt => this.extract(dt, intl, "era")); + } + return this.eraCache[length]; + }); + } + extract(dt, intlOpts, field) { + const df = this.dtFormatter(dt, intlOpts), + results = df.formatToParts(), + matching = results.find(m => m.type.toLowerCase() === field); + return matching ? matching.value : null; + } + numberFormatter(opts = {}) { + // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) + // (in contrast, the rest of the condition is used heavily) + return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); + } + dtFormatter(dt, intlOpts = {}) { + return new PolyDateFormatter(dt, this.intl, intlOpts); + } + relFormatter(opts = {}) { + return new PolyRelFormatter(this.intl, this.isEnglish(), opts); + } + listFormatter(opts = {}) { + return getCachedLF(this.intl, opts); + } + isEnglish() { + return this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us"); + } + getWeekSettings() { + if (this.weekSettings) { + return this.weekSettings; + } else if (!hasLocaleWeekInfo()) { + return fallbackWeekSettings; + } else { + return getCachedWeekInfo(this.locale); + } + } + getStartOfWeek() { + return this.getWeekSettings().firstDay; + } + getMinDaysInFirstWeek() { + return this.getWeekSettings().minimalDays; + } + getWeekendDays() { + return this.getWeekSettings().weekend; + } + equals(other) { + return this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar; + } + toString() { + return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`; + } +} + +let singleton = null; + +/** + * A zone with a fixed offset (meaning no DST) + * @implements {Zone} + */ +class FixedOffsetZone extends Zone { + /** + * Get a singleton instance of UTC + * @return {FixedOffsetZone} + */ + static get utcInstance() { + if (singleton === null) { + singleton = new FixedOffsetZone(0); + } + return singleton; + } + + /** + * Get an instance with a specified offset + * @param {number} offset - The offset in minutes + * @return {FixedOffsetZone} + */ + static instance(offset) { + return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); + } + + /** + * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" + * @param {string} s - The offset string to parse + * @example FixedOffsetZone.parseSpecifier("UTC+6") + * @example FixedOffsetZone.parseSpecifier("UTC+06") + * @example FixedOffsetZone.parseSpecifier("UTC-6:00") + * @return {FixedOffsetZone} + */ + static parseSpecifier(s) { + if (s) { + const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); + if (r) { + return new FixedOffsetZone(signedOffset(r[1], r[2])); + } + } + return null; + } + constructor(offset) { + super(); + /** @private **/ + this.fixed = offset; + } + + /** + * The type of zone. `fixed` for all instances of `FixedOffsetZone`. + * @override + * @type {string} + */ + get type() { + return "fixed"; + } + + /** + * The name of this zone. + * All fixed zones' names always start with "UTC" (plus optional offset) + * @override + * @type {string} + */ + get name() { + return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`; + } + + /** + * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` + * + * @override + * @type {string} + */ + get ianaName() { + if (this.fixed === 0) { + return "Etc/UTC"; + } else { + return `Etc/GMT${formatOffset(-this.fixed, "narrow")}`; + } + } + + /** + * Returns the offset's common name at the specified timestamp. + * + * For fixed offset zones this equals to the zone name. + * @override + */ + offsetName() { + return this.name; + } + + /** + * Returns the offset's value as a string + * @override + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ + formatOffset(ts, format) { + return formatOffset(this.fixed, format); + } + + /** + * Returns whether the offset is known to be fixed for the whole year: + * Always returns true for all fixed offset zones. + * @override + * @type {boolean} + */ + get isUniversal() { + return true; + } + + /** + * Return the offset in minutes for this zone at the specified timestamp. + * + * For fixed offset zones, this is constant and does not depend on a timestamp. + * @override + * @return {number} + */ + offset() { + return this.fixed; + } + + /** + * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) + * @override + * @param {Zone} otherZone - the zone to compare + * @return {boolean} + */ + equals(otherZone) { + return otherZone.type === "fixed" && otherZone.fixed === this.fixed; + } + + /** + * Return whether this Zone is valid: + * All fixed offset zones are valid. + * @override + * @type {boolean} + */ + get isValid() { + return true; + } +} + +/** + * A zone that failed to parse. You should never need to instantiate this. + * @implements {Zone} + */ +class InvalidZone extends Zone { + constructor(zoneName) { + super(); + /** @private */ + this.zoneName = zoneName; + } + + /** @override **/ + get type() { + return "invalid"; + } + + /** @override **/ + get name() { + return this.zoneName; + } + + /** @override **/ + get isUniversal() { + return false; + } + + /** @override **/ + offsetName() { + return null; + } + + /** @override **/ + formatOffset() { + return ""; + } + + /** @override **/ + offset() { + return NaN; + } + + /** @override **/ + equals() { + return false; + } + + /** @override **/ + get isValid() { + return false; + } +} + +/** + * @private + */ +function normalizeZone(input, defaultZone) { + if (isUndefined(input) || input === null) { + return defaultZone; + } else if (input instanceof Zone) { + return input; + } else if (isString(input)) { + const lowered = input.toLowerCase(); + if (lowered === "default") return defaultZone;else if (lowered === "local" || lowered === "system") return SystemZone.instance;else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance;else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); + } else if (isNumber(input)) { + return FixedOffsetZone.instance(input); + } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { + // This is dumb, but the instanceof check above doesn't seem to really work + // so we're duck checking it + return input; + } else { + return new InvalidZone(input); + } +} + +const numberingSystems = { + arab: "[\u0660-\u0669]", + arabext: "[\u06F0-\u06F9]", + bali: "[\u1B50-\u1B59]", + beng: "[\u09E6-\u09EF]", + deva: "[\u0966-\u096F]", + fullwide: "[\uFF10-\uFF19]", + gujr: "[\u0AE6-\u0AEF]", + hanidec: "[〇|一|二|三|四|五|六|七|八|九]", + khmr: "[\u17E0-\u17E9]", + knda: "[\u0CE6-\u0CEF]", + laoo: "[\u0ED0-\u0ED9]", + limb: "[\u1946-\u194F]", + mlym: "[\u0D66-\u0D6F]", + mong: "[\u1810-\u1819]", + mymr: "[\u1040-\u1049]", + orya: "[\u0B66-\u0B6F]", + tamldec: "[\u0BE6-\u0BEF]", + telu: "[\u0C66-\u0C6F]", + thai: "[\u0E50-\u0E59]", + tibt: "[\u0F20-\u0F29]", + latn: "\\d" +}; +const numberingSystemsUTF16 = { + arab: [1632, 1641], + arabext: [1776, 1785], + bali: [6992, 7001], + beng: [2534, 2543], + deva: [2406, 2415], + fullwide: [65296, 65303], + gujr: [2790, 2799], + khmr: [6112, 6121], + knda: [3302, 3311], + laoo: [3792, 3801], + limb: [6470, 6479], + mlym: [3430, 3439], + mong: [6160, 6169], + mymr: [4160, 4169], + orya: [2918, 2927], + tamldec: [3046, 3055], + telu: [3174, 3183], + thai: [3664, 3673], + tibt: [3872, 3881] +}; +const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); +function parseDigits(str) { + let value = parseInt(str, 10); + if (isNaN(value)) { + value = ""; + for (let i = 0; i < str.length; i++) { + const code = str.charCodeAt(i); + if (str[i].search(numberingSystems.hanidec) !== -1) { + value += hanidecChars.indexOf(str[i]); + } else { + for (const key in numberingSystemsUTF16) { + const [min, max] = numberingSystemsUTF16[key]; + if (code >= min && code <= max) { + value += code - min; + } + } + } + } + return parseInt(value, 10); + } else { + return value; + } +} + +// cache of {numberingSystem: {append: regex}} +const digitRegexCache = new Map(); +function resetDigitRegexCache() { + digitRegexCache.clear(); +} +function digitRegex({ + numberingSystem +}, append = "") { + const ns = numberingSystem || "latn"; + let appendCache = digitRegexCache.get(ns); + if (appendCache === undefined) { + appendCache = new Map(); + digitRegexCache.set(ns, appendCache); + } + let regex = appendCache.get(append); + if (regex === undefined) { + regex = new RegExp(`${numberingSystems[ns]}${append}`); + appendCache.set(append, regex); + } + return regex; +} + +let now = () => Date.now(), + defaultZone = "system", + defaultLocale = null, + defaultNumberingSystem = null, + defaultOutputCalendar = null, + twoDigitCutoffYear = 60, + throwOnInvalid, + defaultWeekSettings = null; + +/** + * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. + */ +class Settings { + /** + * Get the callback for returning the current timestamp. + * @type {function} + */ + static get now() { + return now; + } + + /** + * Set the callback for returning the current timestamp. + * The function should return a number, which will be interpreted as an Epoch millisecond count + * @type {function} + * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future + * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time + */ + static set now(n) { + now = n; + } + + /** + * Set the default time zone to create DateTimes in. Does not affect existing instances. + * Use the value "system" to reset this value to the system's time zone. + * @type {string} + */ + static set defaultZone(zone) { + defaultZone = zone; + } + + /** + * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. + * The default value is the system's time zone (the one set on the machine that runs this code). + * @type {Zone} + */ + static get defaultZone() { + return normalizeZone(defaultZone, SystemZone.instance); + } + + /** + * Get the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultLocale() { + return defaultLocale; + } + + /** + * Set the default locale to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultLocale(locale) { + defaultLocale = locale; + } + + /** + * Get the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultNumberingSystem() { + return defaultNumberingSystem; + } + + /** + * Set the default numbering system to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultNumberingSystem(numberingSystem) { + defaultNumberingSystem = numberingSystem; + } + + /** + * Get the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static get defaultOutputCalendar() { + return defaultOutputCalendar; + } + + /** + * Set the default output calendar to create DateTimes with. Does not affect existing instances. + * @type {string} + */ + static set defaultOutputCalendar(outputCalendar) { + defaultOutputCalendar = outputCalendar; + } + + /** + * @typedef {Object} WeekSettings + * @property {number} firstDay + * @property {number} minimalDays + * @property {number[]} weekend + */ + + /** + * @return {WeekSettings|null} + */ + static get defaultWeekSettings() { + return defaultWeekSettings; + } + + /** + * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and + * how many days are required in the first week of a year. + * Does not affect existing instances. + * + * @param {WeekSettings|null} weekSettings + */ + static set defaultWeekSettings(weekSettings) { + defaultWeekSettings = validateWeekSettings(weekSettings); + } + + /** + * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + */ + static get twoDigitCutoffYear() { + return twoDigitCutoffYear; + } + + /** + * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. + * @type {number} + * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century + * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century + * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 + * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 + * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 + */ + static set twoDigitCutoffYear(cutoffYear) { + twoDigitCutoffYear = cutoffYear % 100; + } + + /** + * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static get throwOnInvalid() { + return throwOnInvalid; + } + + /** + * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals + * @type {boolean} + */ + static set throwOnInvalid(t) { + throwOnInvalid = t; + } + + /** + * Reset Luxon's global caches. Should only be necessary in testing scenarios. + * @return {void} + */ + static resetCaches() { + Locale.resetCache(); + IANAZone.resetCache(); + DateTime.resetCache(); + resetDigitRegexCache(); + } +} + +class Invalid { + constructor(reason, explanation) { + this.reason = reason; + this.explanation = explanation; + } + toMessage() { + if (this.explanation) { + return `${this.reason}: ${this.explanation}`; + } else { + return this.reason; + } + } +} + +const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], + leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; +function unitOutOfRange(unit, value) { + return new Invalid("unit out of range", `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`); +} +function dayOfWeek(year, month, day) { + const d = new Date(Date.UTC(year, month - 1, day)); + if (year < 100 && year >= 0) { + d.setUTCFullYear(d.getUTCFullYear() - 1900); + } + const js = d.getUTCDay(); + return js === 0 ? 7 : js; +} +function computeOrdinal(year, month, day) { + return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; +} +function uncomputeOrdinal(year, ordinal) { + const table = isLeapYear(year) ? leapLadder : nonLeapLadder, + month0 = table.findIndex(i => i < ordinal), + day = ordinal - table[month0]; + return { + month: month0 + 1, + day + }; +} +function isoWeekdayToLocal(isoWeekday, startOfWeek) { + return (isoWeekday - startOfWeek + 7) % 7 + 1; +} + +/** + * @private + */ + +function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { + year, + month, + day + } = gregObj, + ordinal = computeOrdinal(year, month, day), + weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); + let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), + weekYear; + if (weekNumber < 1) { + weekYear = year - 1; + weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); + } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { + weekYear = year + 1; + weekNumber = 1; + } else { + weekYear = year; + } + return { + weekYear, + weekNumber, + weekday, + ...timeObject(gregObj) + }; +} +function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) { + const { + weekYear, + weekNumber, + weekday + } = weekData, + weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), + yearInDays = daysInYear(weekYear); + let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, + year; + if (ordinal < 1) { + year = weekYear - 1; + ordinal += daysInYear(year); + } else if (ordinal > yearInDays) { + year = weekYear + 1; + ordinal -= daysInYear(weekYear); + } else { + year = weekYear; + } + const { + month, + day + } = uncomputeOrdinal(year, ordinal); + return { + year, + month, + day, + ...timeObject(weekData) + }; +} +function gregorianToOrdinal(gregData) { + const { + year, + month, + day + } = gregData; + const ordinal = computeOrdinal(year, month, day); + return { + year, + ordinal, + ...timeObject(gregData) + }; +} +function ordinalToGregorian(ordinalData) { + const { + year, + ordinal + } = ordinalData; + const { + month, + day + } = uncomputeOrdinal(year, ordinal); + return { + year, + month, + day, + ...timeObject(ordinalData) + }; +} + +/** + * Check if local week units like localWeekday are used in obj. + * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. + * Modifies obj in-place! + * @param obj the object values + */ +function usesLocalWeekValues(obj, loc) { + const hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); + if (hasLocaleWeekData) { + const hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); + if (hasIsoWeekData) { + throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields"); + } + if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; + if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; + if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; + delete obj.localWeekday; + delete obj.localWeekNumber; + delete obj.localWeekYear; + return { + minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), + startOfWeek: loc.getStartOfWeek() + }; + } else { + return { + minDaysInFirstWeek: 4, + startOfWeek: 1 + }; + } +} +function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) { + const validYear = isInteger(obj.weekYear), + validWeek = integerBetween(obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)), + validWeekday = integerBetween(obj.weekday, 1, 7); + if (!validYear) { + return unitOutOfRange("weekYear", obj.weekYear); + } else if (!validWeek) { + return unitOutOfRange("week", obj.weekNumber); + } else if (!validWeekday) { + return unitOutOfRange("weekday", obj.weekday); + } else return false; +} +function hasInvalidOrdinalData(obj) { + const validYear = isInteger(obj.year), + validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validOrdinal) { + return unitOutOfRange("ordinal", obj.ordinal); + } else return false; +} +function hasInvalidGregorianData(obj) { + const validYear = isInteger(obj.year), + validMonth = integerBetween(obj.month, 1, 12), + validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); + if (!validYear) { + return unitOutOfRange("year", obj.year); + } else if (!validMonth) { + return unitOutOfRange("month", obj.month); + } else if (!validDay) { + return unitOutOfRange("day", obj.day); + } else return false; +} +function hasInvalidTimeData(obj) { + const { + hour, + minute, + second, + millisecond + } = obj; + const validHour = integerBetween(hour, 0, 23) || hour === 24 && minute === 0 && second === 0 && millisecond === 0, + validMinute = integerBetween(minute, 0, 59), + validSecond = integerBetween(second, 0, 59), + validMillisecond = integerBetween(millisecond, 0, 999); + if (!validHour) { + return unitOutOfRange("hour", hour); + } else if (!validMinute) { + return unitOutOfRange("minute", minute); + } else if (!validSecond) { + return unitOutOfRange("second", second); + } else if (!validMillisecond) { + return unitOutOfRange("millisecond", millisecond); + } else return false; +} + +/* + This is just a junk drawer, containing anything used across multiple classes. + Because Luxon is small(ish), this should stay small and we won't worry about splitting + it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. +*/ + +/** + * @private + */ + +// TYPES + +function isUndefined(o) { + return typeof o === "undefined"; +} +function isNumber(o) { + return typeof o === "number"; +} +function isInteger(o) { + return typeof o === "number" && o % 1 === 0; +} +function isString(o) { + return typeof o === "string"; +} +function isDate(o) { + return Object.prototype.toString.call(o) === "[object Date]"; +} + +// CAPABILITIES + +function hasRelative() { + try { + return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; + } catch (e) { + return false; + } +} +function hasLocaleWeekInfo() { + try { + return typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype); + } catch (e) { + return false; + } +} + +// OBJECTS AND ARRAYS + +function maybeArray(thing) { + return Array.isArray(thing) ? thing : [thing]; +} +function bestBy(arr, by, compare) { + if (arr.length === 0) { + return undefined; + } + return arr.reduce((best, next) => { + const pair = [by(next), next]; + if (!best) { + return pair; + } else if (compare(best[0], pair[0]) === best[0]) { + return best; + } else { + return pair; + } + }, null)[1]; +} +function pick(obj, keys) { + return keys.reduce((a, k) => { + a[k] = obj[k]; + return a; + }, {}); +} +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} +function validateWeekSettings(settings) { + if (settings == null) { + return null; + } else if (typeof settings !== "object") { + throw new InvalidArgumentError("Week settings must be an object"); + } else { + if (!integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some(v => !integerBetween(v, 1, 7))) { + throw new InvalidArgumentError("Invalid week settings"); + } + return { + firstDay: settings.firstDay, + minimalDays: settings.minimalDays, + weekend: Array.from(settings.weekend) + }; + } +} + +// NUMBERS AND STRINGS + +function integerBetween(thing, bottom, top) { + return isInteger(thing) && thing >= bottom && thing <= top; +} + +// x % n but takes the sign of n instead of x +function floorMod(x, n) { + return x - n * Math.floor(x / n); +} +function padStart(input, n = 2) { + const isNeg = input < 0; + let padded; + if (isNeg) { + padded = "-" + ("" + -input).padStart(n, "0"); + } else { + padded = ("" + input).padStart(n, "0"); + } + return padded; +} +function parseInteger(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseInt(string, 10); + } +} +function parseFloating(string) { + if (isUndefined(string) || string === null || string === "") { + return undefined; + } else { + return parseFloat(string); + } +} +function parseMillis(fraction) { + // Return undefined (instead of 0) in these cases, where fraction is not set + if (isUndefined(fraction) || fraction === null || fraction === "") { + return undefined; + } else { + const f = parseFloat("0." + fraction) * 1000; + return Math.floor(f); + } +} +function roundTo(number, digits, rounding = "round") { + const factor = 10 ** digits; + switch (rounding) { + case "expand": + return number > 0 ? Math.ceil(number * factor) / factor : Math.floor(number * factor) / factor; + case "trunc": + return Math.trunc(number * factor) / factor; + case "round": + return Math.round(number * factor) / factor; + case "floor": + return Math.floor(number * factor) / factor; + case "ceil": + return Math.ceil(number * factor) / factor; + default: + throw new RangeError(`Value rounding ${rounding} is out of range`); + } +} + +// DATE BASICS + +function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} +function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; +} +function daysInMonth(year, month) { + const modMonth = floorMod(month - 1, 12) + 1, + modYear = year + (month - modMonth) / 12; + if (modMonth === 2) { + return isLeapYear(modYear) ? 29 : 28; + } else { + return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; + } +} + +// convert a calendar object to a local timestamp (epoch, but with the offset baked in) +function objToLocalTS(obj) { + let d = Date.UTC(obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond); + + // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that + if (obj.year < 100 && obj.year >= 0) { + d = new Date(d); + // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not + // so if obj.year is in 99, but obj.day makes it roll over into year 100, + // the calculations done by Date.UTC are using year 2000 - which is incorrect + d.setUTCFullYear(obj.year, obj.month - 1, obj.day); + } + return +d; +} + +// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js +function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { + const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); + return -fwdlw + minDaysInFirstWeek - 1; +} +function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) { + const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); + const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); + return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; +} +function untruncateYear(year) { + if (year > 99) { + return year; + } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; +} + +// PARSING + +function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) { + const date = new Date(ts), + intlOpts = { + hourCycle: "h23", + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit" + }; + if (timeZone) { + intlOpts.timeZone = timeZone; + } + const modified = { + timeZoneName: offsetFormat, + ...intlOpts + }; + const parsed = new Intl.DateTimeFormat(locale, modified).formatToParts(date).find(m => m.type.toLowerCase() === "timezonename"); + return parsed ? parsed.value : null; +} + +// signedOffset('-5', '30') -> -330 +function signedOffset(offHourStr, offMinuteStr) { + let offHour = parseInt(offHourStr, 10); + + // don't || this because we want to preserve -0 + if (Number.isNaN(offHour)) { + offHour = 0; + } + const offMin = parseInt(offMinuteStr, 10) || 0, + offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; + return offHour * 60 + offMinSigned; +} + +// COERCION + +function asNumber(value) { + const numericValue = Number(value); + if (typeof value === "boolean" || value === "" || !Number.isFinite(numericValue)) throw new InvalidArgumentError(`Invalid unit value ${value}`); + return numericValue; +} +function normalizeObject(obj, normalizer) { + const normalized = {}; + for (const u in obj) { + if (hasOwnProperty(obj, u)) { + const v = obj[u]; + if (v === undefined || v === null) continue; + normalized[normalizer(u)] = asNumber(v); + } + } + return normalized; +} + +/** + * Returns the offset's value as a string + * @param {number} ts - Epoch milliseconds for which to get the offset + * @param {string} format - What style of offset to return. + * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively + * @return {string} + */ +function formatOffset(offset, format) { + const hours = Math.trunc(Math.abs(offset / 60)), + minutes = Math.trunc(Math.abs(offset % 60)), + sign = offset >= 0 ? "+" : "-"; + switch (format) { + case "short": + return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`; + case "narrow": + return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`; + case "techie": + return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`; + default: + throw new RangeError(`Value format ${format} is out of range for property format`); + } +} +function timeObject(obj) { + return pick(obj, ["hour", "minute", "second", "millisecond"]); +} + +/** + * @private + */ + +const monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; +const monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; +function months(length) { + switch (length) { + case "narrow": + return [...monthsNarrow]; + case "short": + return [...monthsShort]; + case "long": + return [...monthsLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; + case "2-digit": + return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; + default: + return null; + } +} +const weekdaysLong = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; +const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; +const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; +function weekdays(length) { + switch (length) { + case "narrow": + return [...weekdaysNarrow]; + case "short": + return [...weekdaysShort]; + case "long": + return [...weekdaysLong]; + case "numeric": + return ["1", "2", "3", "4", "5", "6", "7"]; + default: + return null; + } +} +const meridiems = ["AM", "PM"]; +const erasLong = ["Before Christ", "Anno Domini"]; +const erasShort = ["BC", "AD"]; +const erasNarrow = ["B", "A"]; +function eras(length) { + switch (length) { + case "narrow": + return [...erasNarrow]; + case "short": + return [...erasShort]; + case "long": + return [...erasLong]; + default: + return null; + } +} +function meridiemForDateTime(dt) { + return meridiems[dt.hour < 12 ? 0 : 1]; +} +function weekdayForDateTime(dt, length) { + return weekdays(length)[dt.weekday - 1]; +} +function monthForDateTime(dt, length) { + return months(length)[dt.month - 1]; +} +function eraForDateTime(dt, length) { + return eras(length)[dt.year < 0 ? 0 : 1]; +} +function formatRelativeTime(unit, count, numeric = "always", narrow = false) { + const units = { + years: ["year", "yr."], + quarters: ["quarter", "qtr."], + months: ["month", "mo."], + weeks: ["week", "wk."], + days: ["day", "day", "days"], + hours: ["hour", "hr."], + minutes: ["minute", "min."], + seconds: ["second", "sec."] + }; + const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; + if (numeric === "auto" && lastable) { + const isDay = unit === "days"; + switch (count) { + case 1: + return isDay ? "tomorrow" : `next ${units[unit][0]}`; + case -1: + return isDay ? "yesterday" : `last ${units[unit][0]}`; + case 0: + return isDay ? "today" : `this ${units[unit][0]}`; + } + } + + const isInPast = Object.is(count, -0) || count < 0, + fmtValue = Math.abs(count), + singular = fmtValue === 1, + lilUnits = units[unit], + fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; + return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; +} + +function stringifyTokens(splits, tokenToString) { + let s = ""; + for (const token of splits) { + if (token.literal) { + s += token.val; + } else { + s += tokenToString(token.val); + } + } + return s; +} +const macroTokenToFormatOpts = { + D: DATE_SHORT, + DD: DATE_MED, + DDD: DATE_FULL, + DDDD: DATE_HUGE, + t: TIME_SIMPLE, + tt: TIME_WITH_SECONDS, + ttt: TIME_WITH_SHORT_OFFSET, + tttt: TIME_WITH_LONG_OFFSET, + T: TIME_24_SIMPLE, + TT: TIME_24_WITH_SECONDS, + TTT: TIME_24_WITH_SHORT_OFFSET, + TTTT: TIME_24_WITH_LONG_OFFSET, + f: DATETIME_SHORT, + ff: DATETIME_MED, + fff: DATETIME_FULL, + ffff: DATETIME_HUGE, + F: DATETIME_SHORT_WITH_SECONDS, + FF: DATETIME_MED_WITH_SECONDS, + FFF: DATETIME_FULL_WITH_SECONDS, + FFFF: DATETIME_HUGE_WITH_SECONDS +}; + +/** + * @private + */ + +class Formatter { + static create(locale, opts = {}) { + return new Formatter(locale, opts); + } + static parseFormat(fmt) { + // white-space is always considered a literal in user-provided formats + // the " " token has a special meaning (see unitForToken) + + let current = null, + currentFull = "", + bracketed = false; + const splits = []; + for (let i = 0; i < fmt.length; i++) { + const c = fmt.charAt(i); + if (c === "'") { + // turn '' into a literal signal quote instead of just skipping the empty literal + if (currentFull.length > 0 || bracketed) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull === "" ? "'" : currentFull + }); + } + current = null; + currentFull = ""; + bracketed = !bracketed; + } else if (bracketed) { + currentFull += c; + } else if (c === current) { + currentFull += c; + } else { + if (currentFull.length > 0) { + splits.push({ + literal: /^\s+$/.test(currentFull), + val: currentFull + }); + } + currentFull = c; + current = c; + } + } + if (currentFull.length > 0) { + splits.push({ + literal: bracketed || /^\s+$/.test(currentFull), + val: currentFull + }); + } + return splits; + } + static macroTokenToFormatOpts(token) { + return macroTokenToFormatOpts[token]; + } + constructor(locale, formatOpts) { + this.opts = formatOpts; + this.loc = locale; + this.systemLoc = null; + } + formatWithSystemDefault(dt, opts) { + if (this.systemLoc === null) { + this.systemLoc = this.loc.redefaultToSystem(); + } + const df = this.systemLoc.dtFormatter(dt, { + ...this.opts, + ...opts + }); + return df.format(); + } + dtFormatter(dt, opts = {}) { + return this.loc.dtFormatter(dt, { + ...this.opts, + ...opts + }); + } + formatDateTime(dt, opts) { + return this.dtFormatter(dt, opts).format(); + } + formatDateTimeParts(dt, opts) { + return this.dtFormatter(dt, opts).formatToParts(); + } + formatInterval(interval, opts) { + const df = this.dtFormatter(interval.start, opts); + return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); + } + resolvedOptions(dt, opts) { + return this.dtFormatter(dt, opts).resolvedOptions(); + } + num(n, p = 0, signDisplay = undefined) { + // we get some perf out of doing this here, annoyingly + if (this.opts.forceSimple) { + return padStart(n, p); + } + const opts = { + ...this.opts + }; + if (p > 0) { + opts.padTo = p; + } + if (signDisplay) { + opts.signDisplay = signDisplay; + } + return this.loc.numberFormatter(opts).format(n); + } + formatDateTimeFromString(dt, fmt) { + const knownEnglish = this.loc.listingMode() === "en", + useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", + string = (opts, extract) => this.loc.extract(dt, opts, extract), + formatOffset = opts => { + if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { + return "Z"; + } + return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; + }, + meridiem = () => knownEnglish ? meridiemForDateTime(dt) : string({ + hour: "numeric", + hourCycle: "h12" + }, "dayperiod"), + month = (length, standalone) => knownEnglish ? monthForDateTime(dt, length) : string(standalone ? { + month: length + } : { + month: length, + day: "numeric" + }, "month"), + weekday = (length, standalone) => knownEnglish ? weekdayForDateTime(dt, length) : string(standalone ? { + weekday: length + } : { + weekday: length, + month: "long", + day: "numeric" + }, "weekday"), + maybeMacro = token => { + const formatOpts = Formatter.macroTokenToFormatOpts(token); + if (formatOpts) { + return this.formatWithSystemDefault(dt, formatOpts); + } else { + return token; + } + }, + era = length => knownEnglish ? eraForDateTime(dt, length) : string({ + era: length + }, "era"), + tokenToString = token => { + // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols + switch (token) { + // ms + case "S": + return this.num(dt.millisecond); + case "u": + // falls through + case "SSS": + return this.num(dt.millisecond, 3); + // seconds + case "s": + return this.num(dt.second); + case "ss": + return this.num(dt.second, 2); + // fractional seconds + case "uu": + return this.num(Math.floor(dt.millisecond / 10), 2); + case "uuu": + return this.num(Math.floor(dt.millisecond / 100)); + // minutes + case "m": + return this.num(dt.minute); + case "mm": + return this.num(dt.minute, 2); + // hours + case "h": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); + case "hh": + return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); + case "H": + return this.num(dt.hour); + case "HH": + return this.num(dt.hour, 2); + // offset + case "Z": + // like +6 + return formatOffset({ + format: "narrow", + allowZ: this.opts.allowZ + }); + case "ZZ": + // like +06:00 + return formatOffset({ + format: "short", + allowZ: this.opts.allowZ + }); + case "ZZZ": + // like +0600 + return formatOffset({ + format: "techie", + allowZ: this.opts.allowZ + }); + case "ZZZZ": + // like EST + return dt.zone.offsetName(dt.ts, { + format: "short", + locale: this.loc.locale + }); + case "ZZZZZ": + // like Eastern Standard Time + return dt.zone.offsetName(dt.ts, { + format: "long", + locale: this.loc.locale + }); + // zone + case "z": + // like America/New_York + return dt.zoneName; + // meridiems + case "a": + return meridiem(); + // dates + case "d": + return useDateTimeFormatter ? string({ + day: "numeric" + }, "day") : this.num(dt.day); + case "dd": + return useDateTimeFormatter ? string({ + day: "2-digit" + }, "day") : this.num(dt.day, 2); + // weekdays - standalone + case "c": + // like 1 + return this.num(dt.weekday); + case "ccc": + // like 'Tues' + return weekday("short", true); + case "cccc": + // like 'Tuesday' + return weekday("long", true); + case "ccccc": + // like 'T' + return weekday("narrow", true); + // weekdays - format + case "E": + // like 1 + return this.num(dt.weekday); + case "EEE": + // like 'Tues' + return weekday("short", false); + case "EEEE": + // like 'Tuesday' + return weekday("long", false); + case "EEEEE": + // like 'T' + return weekday("narrow", false); + // months - standalone + case "L": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric", + day: "numeric" + }, "month") : this.num(dt.month); + case "LL": + // like 01, doesn't seem to work + return useDateTimeFormatter ? string({ + month: "2-digit", + day: "numeric" + }, "month") : this.num(dt.month, 2); + case "LLL": + // like Jan + return month("short", true); + case "LLLL": + // like January + return month("long", true); + case "LLLLL": + // like J + return month("narrow", true); + // months - format + case "M": + // like 1 + return useDateTimeFormatter ? string({ + month: "numeric" + }, "month") : this.num(dt.month); + case "MM": + // like 01 + return useDateTimeFormatter ? string({ + month: "2-digit" + }, "month") : this.num(dt.month, 2); + case "MMM": + // like Jan + return month("short", false); + case "MMMM": + // like January + return month("long", false); + case "MMMMM": + // like J + return month("narrow", false); + // years + case "y": + // like 2014 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : this.num(dt.year); + case "yy": + // like 14 + return useDateTimeFormatter ? string({ + year: "2-digit" + }, "year") : this.num(dt.year.toString().slice(-2), 2); + case "yyyy": + // like 0012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : this.num(dt.year, 4); + case "yyyyyy": + // like 000012 + return useDateTimeFormatter ? string({ + year: "numeric" + }, "year") : this.num(dt.year, 6); + // eras + case "G": + // like AD + return era("short"); + case "GG": + // like Anno Domini + return era("long"); + case "GGGGG": + return era("narrow"); + case "kk": + return this.num(dt.weekYear.toString().slice(-2), 2); + case "kkkk": + return this.num(dt.weekYear, 4); + case "W": + return this.num(dt.weekNumber); + case "WW": + return this.num(dt.weekNumber, 2); + case "n": + return this.num(dt.localWeekNumber); + case "nn": + return this.num(dt.localWeekNumber, 2); + case "ii": + return this.num(dt.localWeekYear.toString().slice(-2), 2); + case "iiii": + return this.num(dt.localWeekYear, 4); + case "o": + return this.num(dt.ordinal); + case "ooo": + return this.num(dt.ordinal, 3); + case "q": + // like 1 + return this.num(dt.quarter); + case "qq": + // like 01 + return this.num(dt.quarter, 2); + case "X": + return this.num(Math.floor(dt.ts / 1000)); + case "x": + return this.num(dt.ts); + default: + return maybeMacro(token); + } + }; + return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); + } + formatDurationFromString(dur, fmt) { + const invertLargest = this.opts.signMode === "negativeLargestOnly" ? -1 : 1; + const tokenToField = token => { + switch (token[0]) { + case "S": + return "milliseconds"; + case "s": + return "seconds"; + case "m": + return "minutes"; + case "h": + return "hours"; + case "d": + return "days"; + case "w": + return "weeks"; + case "M": + return "months"; + case "y": + return "years"; + default: + return null; + } + }, + tokenToString = (lildur, info) => token => { + const mapped = tokenToField(token); + if (mapped) { + const inversionFactor = info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1; + let signDisplay; + if (this.opts.signMode === "negativeLargestOnly" && mapped !== info.largestUnit) { + signDisplay = "never"; + } else if (this.opts.signMode === "all") { + signDisplay = "always"; + } else { + // "auto" and "negative" are the same, but "auto" has better support + signDisplay = "auto"; + } + return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay); + } else { + return token; + } + }, + tokens = Formatter.parseFormat(fmt), + realTokens = tokens.reduce((found, { + literal, + val + }) => literal ? found : found.concat(val), []), + collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter(t => t)), + durationInfo = { + isNegativeDuration: collapsed < 0, + // this relies on "collapsed" being based on "shiftTo", which builds up the object + // in order + largestUnit: Object.keys(collapsed.values)[0] + }; + return stringifyTokens(tokens, tokenToString(collapsed, durationInfo)); + } +} + +/* + * This file handles parsing for well-specified formats. Here's how it works: + * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. + * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object + * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. + * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. + * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. + * Some extractions are super dumb and simpleParse and fromStrings help DRY them. + */ + +const ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; +function combineRegexes(...regexes) { + const full = regexes.reduce((f, r) => f + r.source, ""); + return RegExp(`^${full}$`); +} +function combineExtractors(...extractors) { + return m => extractors.reduce(([mergedVals, mergedZone, cursor], ex) => { + const [val, zone, next] = ex(m, cursor); + return [{ + ...mergedVals, + ...val + }, zone || mergedZone, next]; + }, [{}, null, 1]).slice(0, 2); +} +function parse(s, ...patterns) { + if (s == null) { + return [null, null]; + } + for (const [regex, extractor] of patterns) { + const m = regex.exec(s); + if (m) { + return extractor(m); + } + } + return [null, null]; +} +function simpleParse(...keys) { + return (match, cursor) => { + const ret = {}; + let i; + for (i = 0; i < keys.length; i++) { + ret[keys[i]] = parseInteger(match[cursor + i]); + } + return [ret, null, cursor + i]; + }; +} + +// ISO and SQL parsing +const offsetRegex = /(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/; +const isoExtendedZone = `(?:${offsetRegex.source}?(?:\\[(${ianaRegex.source})\\])?)?`; +const isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; +const isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`); +const isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`); +const isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; +const isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; +const isoOrdinalRegex = /(\d{4})-?(\d{3})/; +const extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); +const extractISOOrdinalData = simpleParse("year", "ordinal"); +const sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one +const sqlTimeRegex = RegExp(`${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`); +const sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`); +function int(match, pos, fallback) { + const m = match[pos]; + return isUndefined(m) ? fallback : parseInteger(m); +} +function extractISOYmd(match, cursor) { + const item = { + year: int(match, cursor), + month: int(match, cursor + 1, 1), + day: int(match, cursor + 2, 1) + }; + return [item, null, cursor + 3]; +} +function extractISOTime(match, cursor) { + const item = { + hours: int(match, cursor, 0), + minutes: int(match, cursor + 1, 0), + seconds: int(match, cursor + 2, 0), + milliseconds: parseMillis(match[cursor + 3]) + }; + return [item, null, cursor + 4]; +} +function extractISOOffset(match, cursor) { + const local = !match[cursor] && !match[cursor + 1], + fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), + zone = local ? null : FixedOffsetZone.instance(fullOffset); + return [{}, zone, cursor + 3]; +} +function extractIANAZone(match, cursor) { + const zone = match[cursor] ? IANAZone.create(match[cursor]) : null; + return [{}, zone, cursor + 1]; +} + +// ISO time parsing + +const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); + +// ISO duration parsing + +const isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; +function extractISODuration(match) { + const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = match; + const hasNegativePrefix = s[0] === "-"; + const negativeSeconds = secondStr && secondStr[0] === "-"; + const maybeNegate = (num, force = false) => num !== undefined && (force || num && hasNegativePrefix) ? -num : num; + return [{ + years: maybeNegate(parseFloating(yearStr)), + months: maybeNegate(parseFloating(monthStr)), + weeks: maybeNegate(parseFloating(weekStr)), + days: maybeNegate(parseFloating(dayStr)), + hours: maybeNegate(parseFloating(hourStr)), + minutes: maybeNegate(parseFloating(minuteStr)), + seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), + milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds) + }]; +} + +// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York +// and not just that we're in -240 *right now*. But since I don't think these are used that often +// I'm just going to ignore that +const obsOffsets = { + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 +}; +function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + const result = { + year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), + month: monthsShort.indexOf(monthStr) + 1, + day: parseInteger(dayStr), + hour: parseInteger(hourStr), + minute: parseInteger(minuteStr) + }; + if (secondStr) result.second = parseInteger(secondStr); + if (weekdayStr) { + result.weekday = weekdayStr.length > 3 ? weekdaysLong.indexOf(weekdayStr) + 1 : weekdaysShort.indexOf(weekdayStr) + 1; + } + return result; +} + +// RFC 2822/5322 +const rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; +function extractRFC2822(match) { + const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr, obsOffset, milOffset, offHourStr, offMinuteStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + let offset; + if (obsOffset) { + offset = obsOffsets[obsOffset]; + } else if (milOffset) { + offset = 0; + } else { + offset = signedOffset(offHourStr, offMinuteStr); + } + return [result, new FixedOffsetZone(offset)]; +} +function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim(); +} + +// http date + +const rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, + rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, + ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; +function extractRFC1123Or850(match) { + const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +function extractASCII(match) { + const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match, + result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); + return [result, FixedOffsetZone.utcInstance]; +} +const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); +const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); +const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); +const isoTimeCombinedRegex = combineRegexes(isoTimeRegex); +const extractISOYmdTimeAndOffset = combineExtractors(extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone); +const extractISOWeekTimeAndOffset = combineExtractors(extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone); +const extractISOOrdinalDateAndTime = combineExtractors(extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone); +const extractISOTimeAndOffset = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); + +/* + * @private + */ + +function parseISODate(s) { + return parse(s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset]); +} +function parseRFC2822Date(s) { + return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); +} +function parseHTTPDate(s) { + return parse(s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII]); +} +function parseISODuration(s) { + return parse(s, [isoDuration, extractISODuration]); +} +const extractISOTimeOnly = combineExtractors(extractISOTime); +function parseISOTimeOnly(s) { + return parse(s, [isoTimeOnly, extractISOTimeOnly]); +} +const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); +const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); +const extractISOTimeOffsetAndIANAZone = combineExtractors(extractISOTime, extractISOOffset, extractIANAZone); +function parseSQL(s) { + return parse(s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]); +} + +const INVALID$2 = "Invalid Duration"; + +// unit conversion constants +const lowOrderMatrix = { + weeks: { + days: 7, + hours: 7 * 24, + minutes: 7 * 24 * 60, + seconds: 7 * 24 * 60 * 60, + milliseconds: 7 * 24 * 60 * 60 * 1000 + }, + days: { + hours: 24, + minutes: 24 * 60, + seconds: 24 * 60 * 60, + milliseconds: 24 * 60 * 60 * 1000 + }, + hours: { + minutes: 60, + seconds: 60 * 60, + milliseconds: 60 * 60 * 1000 + }, + minutes: { + seconds: 60, + milliseconds: 60 * 1000 + }, + seconds: { + milliseconds: 1000 + } + }, + casualMatrix = { + years: { + quarters: 4, + months: 12, + weeks: 52, + days: 365, + hours: 365 * 24, + minutes: 365 * 24 * 60, + seconds: 365 * 24 * 60 * 60, + milliseconds: 365 * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: 13, + days: 91, + hours: 91 * 24, + minutes: 91 * 24 * 60, + seconds: 91 * 24 * 60 * 60, + milliseconds: 91 * 24 * 60 * 60 * 1000 + }, + months: { + weeks: 4, + days: 30, + hours: 30 * 24, + minutes: 30 * 24 * 60, + seconds: 30 * 24 * 60 * 60, + milliseconds: 30 * 24 * 60 * 60 * 1000 + }, + ...lowOrderMatrix + }, + daysInYearAccurate = 146097.0 / 400, + daysInMonthAccurate = 146097.0 / 4800, + accurateMatrix = { + years: { + quarters: 4, + months: 12, + weeks: daysInYearAccurate / 7, + days: daysInYearAccurate, + hours: daysInYearAccurate * 24, + minutes: daysInYearAccurate * 24 * 60, + seconds: daysInYearAccurate * 24 * 60 * 60, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 + }, + quarters: { + months: 3, + weeks: daysInYearAccurate / 28, + days: daysInYearAccurate / 4, + hours: daysInYearAccurate * 24 / 4, + minutes: daysInYearAccurate * 24 * 60 / 4, + seconds: daysInYearAccurate * 24 * 60 * 60 / 4, + milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000 / 4 + }, + months: { + weeks: daysInMonthAccurate / 7, + days: daysInMonthAccurate, + hours: daysInMonthAccurate * 24, + minutes: daysInMonthAccurate * 24 * 60, + seconds: daysInMonthAccurate * 24 * 60 * 60, + milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000 + }, + ...lowOrderMatrix + }; + +// units ordered by size +const orderedUnits$1 = ["years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"]; +const reverseUnits = orderedUnits$1.slice(0).reverse(); + +// clone really means "create another instance just like this one, but with these changes" +function clone$1(dur, alts, clear = false) { + // deep merge for vals + const conf = { + values: clear ? alts.values : { + ...dur.values, + ...(alts.values || {}) + }, + loc: dur.loc.clone(alts.loc), + conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, + matrix: alts.matrix || dur.matrix + }; + return new Duration(conf); +} +function durationToMillis(matrix, vals) { + var _vals$milliseconds; + let sum = (_vals$milliseconds = vals.milliseconds) != null ? _vals$milliseconds : 0; + for (const unit of reverseUnits.slice(1)) { + if (vals[unit]) { + sum += vals[unit] * matrix[unit]["milliseconds"]; + } + } + return sum; +} + +// NB: mutates parameters +function normalizeValues(matrix, vals) { + // the logic below assumes the overall value of the duration is positive + // if this is not the case, factor is used to make it so + const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; + orderedUnits$1.reduceRight((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const previousVal = vals[previous] * factor; + const conv = matrix[current][previous]; + + // if (previousVal < 0): + // lower order unit is negative (e.g. { years: 2, days: -2 }) + // normalize this by reducing the higher order unit by the appropriate amount + // and increasing the lower order unit + // this can never make the higher order unit negative, because this function only operates + // on positive durations, so the amount of time represented by the lower order unit cannot + // be larger than the higher order unit + // else: + // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) + // in this case we attempt to convert as much as possible from the lower order unit into + // the higher order one + // + // Math.floor takes care of both of these cases, rounding away from 0 + // if previousVal < 0 it makes the absolute value larger + // if previousVal >= it makes the absolute value smaller + const rollUp = Math.floor(previousVal / conv); + vals[current] += rollUp * factor; + vals[previous] -= rollUp * conv * factor; + } + return current; + } else { + return previous; + } + }, null); + + // try to convert any decimals into smaller units if possible + // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } + orderedUnits$1.reduce((previous, current) => { + if (!isUndefined(vals[current])) { + if (previous) { + const fraction = vals[previous] % 1; + vals[previous] -= fraction; + vals[current] += fraction * matrix[previous][current]; + } + return current; + } else { + return previous; + } + }, null); +} + +// Remove all properties with a value of 0 from an object +function removeZeroes(vals) { + const newVals = {}; + for (const [key, value] of Object.entries(vals)) { + if (value !== 0) { + newVals[key] = value; + } + } + return newVals; +} + +/** + * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. + * + * Here is a brief overview of commonly used methods and getters in Duration: + * + * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. + * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. + * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. + * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. + * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} + * + * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. + */ +class Duration { + /** + * @private + */ + constructor(config) { + const accurate = config.conversionAccuracy === "longterm" || false; + let matrix = accurate ? accurateMatrix : casualMatrix; + if (config.matrix) { + matrix = config.matrix; + } + + /** + * @access private + */ + this.values = config.values; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.conversionAccuracy = accurate ? "longterm" : "casual"; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.matrix = matrix; + /** + * @access private + */ + this.isLuxonDuration = true; + } + + /** + * Create Duration from a number of milliseconds. + * @param {number} count of milliseconds + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + static fromMillis(count, opts) { + return Duration.fromObject({ + milliseconds: count + }, opts); + } + + /** + * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. + * If this object is empty then a zero milliseconds duration is returned. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.years + * @param {number} obj.quarters + * @param {number} obj.months + * @param {number} obj.weeks + * @param {number} obj.days + * @param {number} obj.hours + * @param {number} obj.minutes + * @param {number} obj.seconds + * @param {number} obj.milliseconds + * @param {Object} [opts=[]] - options for creating this Duration + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the custom conversion system to use + * @return {Duration} + */ + static fromObject(obj, opts = {}) { + if (obj == null || typeof obj !== "object") { + throw new InvalidArgumentError(`Duration.fromObject: argument expected to be an object, got ${obj === null ? "null" : typeof obj}`); + } + return new Duration({ + values: normalizeObject(obj, Duration.normalizeUnit), + loc: Locale.fromObject(opts), + conversionAccuracy: opts.conversionAccuracy, + matrix: opts.matrix + }); + } + + /** + * Create a Duration from DurationLike. + * + * @param {Object | number | Duration} durationLike + * One of: + * - object with keys like 'years' and 'hours'. + * - number representing milliseconds + * - Duration instance + * @return {Duration} + */ + static fromDurationLike(durationLike) { + if (isNumber(durationLike)) { + return Duration.fromMillis(durationLike); + } else if (Duration.isDuration(durationLike)) { + return durationLike; + } else if (typeof durationLike === "object") { + return Duration.fromObject(durationLike); + } else { + throw new InvalidArgumentError(`Unknown duration argument ${durationLike} of type ${typeof durationLike}`); + } + } + + /** + * Create a Duration from an ISO 8601 duration string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the preset conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } + * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } + * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } + * @return {Duration} + */ + static fromISO(text, opts) { + const [parsed] = parseISODuration(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create a Duration from an ISO 8601 time string. + * @param {string} text - text to parse + * @param {Object} opts - options for parsing + * @param {string} [opts.locale='en-US'] - the locale to use + * @param {string} opts.numberingSystem - the numbering system to use + * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use + * @param {string} [opts.matrix=Object] - the conversion system to use + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } + * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } + * @return {Duration} + */ + static fromISOTime(text, opts) { + const [parsed] = parseISOTimeOnly(text); + if (parsed) { + return Duration.fromObject(parsed, opts); + } else { + return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + } + + /** + * Create an invalid Duration. + * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Duration} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); + } + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDurationError(invalid); + } else { + return new Duration({ + invalid + }); + } + } + + /** + * @private + */ + static normalizeUnit(unit) { + const normalized = { + year: "years", + years: "years", + quarter: "quarters", + quarters: "quarters", + month: "months", + months: "months", + week: "weeks", + weeks: "weeks", + day: "days", + days: "days", + hour: "hours", + hours: "hours", + minute: "minutes", + minutes: "minutes", + second: "seconds", + seconds: "seconds", + millisecond: "milliseconds", + milliseconds: "milliseconds" + }[unit ? unit.toLowerCase() : unit]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; + } + + /** + * Check if an object is a Duration. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDuration(o) { + return o && o.isLuxonDuration || false; + } + + /** + * Get the locale of a Duration, such 'en-GB' + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: + * * `S` for milliseconds + * * `s` for seconds + * * `m` for minutes + * * `h` for hours + * * `d` for days + * * `w` for weeks + * * `M` for months + * * `y` for years + * Notes: + * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits + * * Tokens can be escaped by wrapping with single quotes. + * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. + * @param {string} fmt - the format string + * @param {Object} opts - options + * @param {boolean} [opts.floor=true] - floor numerical values + * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" + * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat("d s", { signMode: "all" }) //=> "+6 +2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "all" }) //=> "-6 -2" + * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat("d s", { signMode: "negativeLargestOnly" }) //=> "-6 2" + * @return {string} + */ + toFormat(fmt, opts = {}) { + // reverse-compat since 1.2; we always round down now, never up, and we do it by default + const fmtOpts = { + ...opts, + floor: opts.round !== false && opts.floor !== false + }; + return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID$2; + } + + /** + * Returns a string representation of a Duration with all units included. + * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options + * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. + * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. + * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero + * @example + * ```js + * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 }) + * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes' + * dur.toHuman({ listStyle: "long" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes' + * dur.toHuman({ unitDisplay: "short" }) //=> '1 mth, 0 wks, 5 hr, 6 min' + * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes' + * ``` + */ + toHuman(opts = {}) { + if (!this.isValid) return INVALID$2; + const showZeros = opts.showZeros !== false; + const l = orderedUnits$1.map(unit => { + const val = this.values[unit]; + if (isUndefined(val) || val === 0 && !showZeros) { + return null; + } + return this.loc.numberFormatter({ + style: "unit", + unitDisplay: "long", + ...opts, + unit: unit.slice(0, -1) + }).format(val); + }).filter(n => n); + return this.loc.listFormatter({ + type: "conjunction", + style: opts.listStyle || "narrow", + ...opts + }).format(l); + } + + /** + * Returns a JavaScript object with this Duration's values. + * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } + * @return {Object} + */ + toObject() { + if (!this.isValid) return {}; + return { + ...this.values + }; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration. + * @see https://en.wikipedia.org/wiki/ISO_8601#Durations + * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' + * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' + * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' + * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' + * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' + * @return {string} + */ + toISO() { + // we could use the formatter, but this is an easier way to get the minimum string + if (!this.isValid) return null; + let s = "P"; + if (this.years !== 0) s += this.years + "Y"; + if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; + if (this.weeks !== 0) s += this.weeks + "W"; + if (this.days !== 0) s += this.days + "D"; + if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; + if (this.hours !== 0) s += this.hours + "H"; + if (this.minutes !== 0) s += this.minutes + "M"; + if (this.seconds !== 0 || this.milliseconds !== 0) + // this will handle "floating point madness" by removing extra decimal places + // https://stackoverflow.com/questions/588004/is-floating-point-math-broken + s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; + if (s === "P") s += "T0S"; + return s; + } + + /** + * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. + * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. + * @see https://en.wikipedia.org/wiki/ISO_8601#Times + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' + * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' + * @return {string} + */ + toISOTime(opts = {}) { + if (!this.isValid) return null; + const millis = this.toMillis(); + if (millis < 0 || millis >= 86400000) return null; + opts = { + suppressMilliseconds: false, + suppressSeconds: false, + includePrefix: false, + format: "extended", + ...opts, + includeOffset: false + }; + const dateTime = DateTime.fromMillis(millis, { + zone: "UTC" + }); + return dateTime.toISOTime(opts); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. + * @return {string} + */ + toString() { + return this.toISO(); + } + + /** + * Returns a string representation of this Duration appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Duration { values: ${JSON.stringify(this.values)} }`; + } else { + return `Duration { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns an milliseconds value of this Duration. + * @return {number} + */ + toMillis() { + if (!this.isValid) return NaN; + return durationToMillis(this.matrix, this.values); + } + + /** + * Returns an milliseconds value of this Duration. Alias of {@link toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Make this Duration longer by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + plus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration), + result = {}; + for (const k of orderedUnits$1) { + if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { + result[k] = dur.get(k) + this.get(k); + } + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @return {Duration} + */ + minus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration); + return this.plus(dur.negate()); + } + + /** + * Scale this Duration by the specified amount. Return a newly-constructed Duration. + * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } + * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } + * @return {Duration} + */ + mapUnits(fn) { + if (!this.isValid) return this; + const result = {}; + for (const k of Object.keys(this.values)) { + result[k] = asNumber(fn(this.values[k], k)); + } + return clone$1(this, { + values: result + }, true); + } + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 + * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 + * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 + * @return {number} + */ + get(unit) { + return this[Duration.normalizeUnit(unit)]; + } + + /** + * "Set" the values of specified units. Return a newly-constructed Duration. + * @param {Object} values - a mapping of units to numbers + * @example dur.set({ years: 2017 }) + * @example dur.set({ hours: 8, minutes: 30 }) + * @return {Duration} + */ + set(values) { + if (!this.isValid) return this; + const mixed = { + ...this.values, + ...normalizeObject(values, Duration.normalizeUnit) + }; + return clone$1(this, { + values: mixed + }); + } + + /** + * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. + * @example dur.reconfigure({ locale: 'en-GB' }) + * @return {Duration} + */ + reconfigure({ + locale, + numberingSystem, + conversionAccuracy, + matrix + } = {}) { + const loc = this.loc.clone({ + locale, + numberingSystem + }); + const opts = { + loc, + matrix, + conversionAccuracy + }; + return clone$1(this, opts); + } + + /** + * Return the length of the duration in the specified unit. + * @param {string} unit - a unit such as 'minutes' or 'days' + * @example Duration.fromObject({years: 1}).as('days') //=> 365 + * @example Duration.fromObject({years: 1}).as('months') //=> 12 + * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 + * @return {number} + */ + as(unit) { + return this.isValid ? this.shiftTo(unit).get(unit) : NaN; + } + + /** + * Reduce this Duration to its canonical representation in its current units. + * Assuming the overall value of the Duration is positive, this means: + * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) + * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise + * the overall value would be negative, see third example) + * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) + * + * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. + * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } + * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } + * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } + * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } + * @return {Duration} + */ + normalize() { + if (!this.isValid) return this; + const vals = this.toObject(); + normalizeValues(this.matrix, vals); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Rescale units to its largest representation + * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } + * @return {Duration} + */ + rescale() { + if (!this.isValid) return this; + const vals = removeZeroes(this.normalize().shiftToAll().toObject()); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Convert this Duration into its representation in a different set of units. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } + * @return {Duration} + */ + shiftTo(...units) { + if (!this.isValid) return this; + if (units.length === 0) { + return this; + } + units = units.map(u => Duration.normalizeUnit(u)); + const built = {}, + accumulated = {}, + vals = this.toObject(); + let lastUnit; + for (const k of orderedUnits$1) { + if (units.indexOf(k) >= 0) { + lastUnit = k; + let own = 0; + + // anything we haven't boiled down yet should get boiled to this unit + for (const ak in accumulated) { + own += this.matrix[ak][k] * accumulated[ak]; + accumulated[ak] = 0; + } + + // plus anything that's already in this unit + if (isNumber(vals[k])) { + own += vals[k]; + } + + // only keep the integer part for now in the hopes of putting any decimal part + // into a smaller unit later + const i = Math.trunc(own); + built[k] = i; + accumulated[k] = (own * 1000 - i * 1000) / 1000; + + // otherwise, keep it in the wings to boil it later + } else if (isNumber(vals[k])) { + accumulated[k] = vals[k]; + } + } + + // anything leftover becomes the decimal for the last unit + // lastUnit must be defined since units is not empty + for (const key in accumulated) { + if (accumulated[key] !== 0) { + built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; + } + } + normalizeValues(this.matrix, built); + return clone$1(this, { + values: built + }, true); + } + + /** + * Shift this Duration to all available units. + * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") + * @return {Duration} + */ + shiftToAll() { + if (!this.isValid) return this; + return this.shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"); + } + + /** + * Return the negative of this Duration. + * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } + * @return {Duration} + */ + negate() { + if (!this.isValid) return this; + const negated = {}; + for (const k of Object.keys(this.values)) { + negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; + } + return clone$1(this, { + values: negated + }, true); + } + + /** + * Removes all units with values equal to 0 from this Duration. + * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 } + * @return {Duration} + */ + removeZeros() { + if (!this.isValid) return this; + const vals = removeZeroes(this.values); + return clone$1(this, { + values: vals + }, true); + } + + /** + * Get the years. + * @type {number} + */ + get years() { + return this.isValid ? this.values.years || 0 : NaN; + } + + /** + * Get the quarters. + * @type {number} + */ + get quarters() { + return this.isValid ? this.values.quarters || 0 : NaN; + } + + /** + * Get the months. + * @type {number} + */ + get months() { + return this.isValid ? this.values.months || 0 : NaN; + } + + /** + * Get the weeks + * @type {number} + */ + get weeks() { + return this.isValid ? this.values.weeks || 0 : NaN; + } + + /** + * Get the days. + * @type {number} + */ + get days() { + return this.isValid ? this.values.days || 0 : NaN; + } + + /** + * Get the hours. + * @type {number} + */ + get hours() { + return this.isValid ? this.values.hours || 0 : NaN; + } + + /** + * Get the minutes. + * @type {number} + */ + get minutes() { + return this.isValid ? this.values.minutes || 0 : NaN; + } + + /** + * Get the seconds. + * @return {number} + */ + get seconds() { + return this.isValid ? this.values.seconds || 0 : NaN; + } + + /** + * Get the milliseconds. + * @return {number} + */ + get milliseconds() { + return this.isValid ? this.values.milliseconds || 0 : NaN; + } + + /** + * Returns whether the Duration is invalid. Invalid durations are returned by diff operations + * on invalid DateTimes or Intervals. + * @return {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this Duration became invalid, or null if the Duration is valid + * @return {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Duration became invalid, or null if the Duration is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Equality check + * Two Durations are equal iff they have the same units and the same values for each unit. + * @param {Duration} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + if (!this.loc.equals(other.loc)) { + return false; + } + function eq(v1, v2) { + // Consider 0 and undefined as equal + if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; + return v1 === v2; + } + for (const u of orderedUnits$1) { + if (!eq(this.values[u], other.values[u])) { + return false; + } + } + return true; + } +} + +const INVALID$1 = "Invalid Interval"; + +// checks if the start is equal to or before the end +function validateStartEnd(start, end) { + if (!start || !start.isValid) { + return Interval.invalid("missing or invalid start"); + } else if (!end || !end.isValid) { + return Interval.invalid("missing or invalid end"); + } else if (end < start) { + return Interval.invalid("end before start", `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`); + } else { + return null; + } +} + +/** + * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. + * + * Here is a brief overview of the most commonly used methods and getters in Interval: + * + * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. + * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. + * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. + * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. + * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} + * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. + */ +class Interval { + /** + * @private + */ + constructor(config) { + /** + * @access private + */ + this.s = config.start; + /** + * @access private + */ + this.e = config.end; + /** + * @access private + */ + this.invalid = config.invalid || null; + /** + * @access private + */ + this.isLuxonInterval = true; + } + + /** + * Create an invalid Interval. + * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {Interval} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); + } + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidIntervalError(invalid); + } else { + return new Interval({ + invalid + }); + } + } + + /** + * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. + * @param {DateTime|Date|Object} start + * @param {DateTime|Date|Object} end + * @return {Interval} + */ + static fromDateTimes(start, end) { + const builtStart = friendlyDateTime(start), + builtEnd = friendlyDateTime(end); + const validateError = validateStartEnd(builtStart, builtEnd); + if (validateError == null) { + return new Interval({ + start: builtStart, + end: builtEnd + }); + } else { + return validateError; + } + } + + /** + * Create an Interval from a start DateTime and a Duration to extend to. + * @param {DateTime|Date|Object} start + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static after(start, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(start); + return Interval.fromDateTimes(dt, dt.plus(dur)); + } + + /** + * Create an Interval from an end DateTime and a Duration to extend backwards to. + * @param {DateTime|Date|Object} end + * @param {Duration|Object|number} duration - the length of the Interval. + * @return {Interval} + */ + static before(end, duration) { + const dur = Duration.fromDurationLike(duration), + dt = friendlyDateTime(end); + return Interval.fromDateTimes(dt.minus(dur), dt); + } + + /** + * Create an Interval from an ISO 8601 string. + * Accepts `/`, `/`, and `/` formats. + * @param {string} text - the ISO string to parse + * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {Interval} + */ + static fromISO(text, opts) { + const [s, e] = (text || "").split("/", 2); + if (s && e) { + let start, startIsValid; + try { + start = DateTime.fromISO(s, opts); + startIsValid = start.isValid; + } catch (e) { + startIsValid = false; + } + let end, endIsValid; + try { + end = DateTime.fromISO(e, opts); + endIsValid = end.isValid; + } catch (e) { + endIsValid = false; + } + if (startIsValid && endIsValid) { + return Interval.fromDateTimes(start, end); + } + if (startIsValid) { + const dur = Duration.fromISO(e, opts); + if (dur.isValid) { + return Interval.after(start, dur); + } + } else if (endIsValid) { + const dur = Duration.fromISO(s, opts); + if (dur.isValid) { + return Interval.before(end, dur); + } + } + } + return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); + } + + /** + * Check if an object is an Interval. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isInterval(o) { + return o && o.isLuxonInterval || false; + } + + /** + * Returns the start of the Interval + * @type {DateTime} + */ + get start() { + return this.isValid ? this.s : null; + } + + /** + * Returns the end of the Interval. This is the first instant which is not part of the interval + * (Interval is half-open). + * @type {DateTime} + */ + get end() { + return this.isValid ? this.e : null; + } + + /** + * Returns the last DateTime included in the interval (since end is not part of the interval) + * @type {DateTime} + */ + get lastDateTime() { + return this.isValid ? this.e ? this.e.minus(1) : null : null; + } + + /** + * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. + * @type {boolean} + */ + get isValid() { + return this.invalidReason === null; + } + + /** + * Returns an error code if this Interval is invalid, or null if the Interval is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this Interval became invalid, or null if the Interval is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Returns the length of the Interval in the specified unit. + * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. + * @return {number} + */ + length(unit = "milliseconds") { + return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN; + } + + /** + * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. + * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' + * asks 'what dates are included in this interval?', not 'how many days long is this interval?' + * @param {string} [unit='milliseconds'] - the unit of time to count. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime + * @return {number} + */ + count(unit = "milliseconds", opts) { + if (!this.isValid) return NaN; + const start = this.start.startOf(unit, opts); + let end; + if (opts != null && opts.useLocaleWeeks) { + end = this.end.reconfigure({ + locale: start.locale + }); + } else { + end = this.end; + } + end = end.startOf(unit, opts); + return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); + } + + /** + * Returns whether this Interval's start and end are both in the same unit of time + * @param {string} unit - the unit of time to check sameness on + * @return {boolean} + */ + hasSame(unit) { + return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; + } + + /** + * Return whether this Interval has the same start and end DateTimes. + * @return {boolean} + */ + isEmpty() { + return this.s.valueOf() === this.e.valueOf(); + } + + /** + * Return whether this Interval's start is after the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isAfter(dateTime) { + if (!this.isValid) return false; + return this.s > dateTime; + } + + /** + * Return whether this Interval's end is before the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + isBefore(dateTime) { + if (!this.isValid) return false; + return this.e <= dateTime; + } + + /** + * Return whether this Interval contains the specified DateTime. + * @param {DateTime} dateTime + * @return {boolean} + */ + contains(dateTime) { + if (!this.isValid) return false; + return this.s <= dateTime && this.e > dateTime; + } + + /** + * "Sets" the start and/or end dates. Returns a newly-constructed Interval. + * @param {Object} values - the values to set + * @param {DateTime} values.start - the starting DateTime + * @param {DateTime} values.end - the ending DateTime + * @return {Interval} + */ + set({ + start, + end + } = {}) { + if (!this.isValid) return this; + return Interval.fromDateTimes(start || this.s, end || this.e); + } + + /** + * Split this Interval at each of the specified DateTimes + * @param {...DateTime} dateTimes - the unit of time to count. + * @return {Array} + */ + splitAt(...dateTimes) { + if (!this.isValid) return []; + const sorted = dateTimes.map(friendlyDateTime).filter(d => this.contains(d)).sort((a, b) => a.toMillis() - b.toMillis()), + results = []; + let { + s + } = this, + i = 0; + while (s < this.e) { + const added = sorted[i] || this.e, + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + i += 1; + } + return results; + } + + /** + * Split this Interval into smaller Intervals, each of the specified length. + * Left over time is grouped into a smaller interval + * @param {Duration|Object|number} duration - The length of each resulting interval. + * @return {Array} + */ + splitBy(duration) { + const dur = Duration.fromDurationLike(duration); + if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { + return []; + } + let { + s + } = this, + idx = 1, + next; + const results = []; + while (s < this.e) { + const added = this.start.plus(dur.mapUnits(x => x * idx)); + next = +added > +this.e ? this.e : added; + results.push(Interval.fromDateTimes(s, next)); + s = next; + idx += 1; + } + return results; + } + + /** + * Split this Interval into the specified number of smaller intervals. + * @param {number} numberOfParts - The number of Intervals to divide the Interval into. + * @return {Array} + */ + divideEqually(numberOfParts) { + if (!this.isValid) return []; + return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); + } + + /** + * Return whether this Interval overlaps with the specified Interval + * @param {Interval} other + * @return {boolean} + */ + overlaps(other) { + return this.e > other.s && this.s < other.e; + } + + /** + * Return whether this Interval's end is adjacent to the specified Interval's start. + * @param {Interval} other + * @return {boolean} + */ + abutsStart(other) { + if (!this.isValid) return false; + return +this.e === +other.s; + } + + /** + * Return whether this Interval's start is adjacent to the specified Interval's end. + * @param {Interval} other + * @return {boolean} + */ + abutsEnd(other) { + if (!this.isValid) return false; + return +other.e === +this.s; + } + + /** + * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. + * @param {Interval} other + * @return {boolean} + */ + engulfs(other) { + if (!this.isValid) return false; + return this.s <= other.s && this.e >= other.e; + } + + /** + * Return whether this Interval has the same start and end as the specified Interval. + * @param {Interval} other + * @return {boolean} + */ + equals(other) { + if (!this.isValid || !other.isValid) { + return false; + } + return this.s.equals(other.s) && this.e.equals(other.e); + } + + /** + * Return an Interval representing the intersection of this Interval and the specified Interval. + * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. + * Returns null if the intersection is empty, meaning, the intervals don't intersect. + * @param {Interval} other + * @return {Interval} + */ + intersection(other) { + if (!this.isValid) return this; + const s = this.s > other.s ? this.s : other.s, + e = this.e < other.e ? this.e : other.e; + if (s >= e) { + return null; + } else { + return Interval.fromDateTimes(s, e); + } + } + + /** + * Return an Interval representing the union of this Interval and the specified Interval. + * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. + * @param {Interval} other + * @return {Interval} + */ + union(other) { + if (!this.isValid) return this; + const s = this.s < other.s ? this.s : other.s, + e = this.e > other.e ? this.e : other.e; + return Interval.fromDateTimes(s, e); + } + + /** + * Merge an array of Intervals into an equivalent minimal set of Intervals. + * Combines overlapping and adjacent Intervals. + * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval + * and ending with the latest. + * + * @param {Array} intervals + * @return {Array} + */ + static merge(intervals) { + const [found, final] = intervals.sort((a, b) => a.s - b.s).reduce(([sofar, current], item) => { + if (!current) { + return [sofar, item]; + } else if (current.overlaps(item) || current.abutsStart(item)) { + return [sofar, current.union(item)]; + } else { + return [sofar.concat([current]), item]; + } + }, [[], null]); + if (final) { + found.push(final); + } + return found; + } + + /** + * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. + * @param {Array} intervals + * @return {Array} + */ + static xor(intervals) { + let start = null, + currentCount = 0; + const results = [], + ends = intervals.map(i => [{ + time: i.s, + type: "s" + }, { + time: i.e, + type: "e" + }]), + flattened = Array.prototype.concat(...ends), + arr = flattened.sort((a, b) => a.time - b.time); + for (const i of arr) { + currentCount += i.type === "s" ? 1 : -1; + if (currentCount === 1) { + start = i.time; + } else { + if (start && +start !== +i.time) { + results.push(Interval.fromDateTimes(start, i.time)); + } + start = null; + } + } + return Interval.merge(results); + } + + /** + * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. + * @param {...Interval} intervals + * @return {Array} + */ + difference(...intervals) { + return Interval.xor([this].concat(intervals)).map(i => this.intersection(i)).filter(i => i && !i.isEmpty()); + } + + /** + * Returns a string representation of this Interval appropriate for debugging. + * @return {string} + */ + toString() { + if (!this.isValid) return INVALID$1; + return `[${this.s.toISO()} – ${this.e.toISO()})`; + } + + /** + * Returns a string representation of this Interval appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`; + } else { + return `Interval { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns a localized string representing this Interval. Accepts the same options as the + * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as + * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method + * is browser-specific, but in general it will return an appropriate representation of the + * Interval in the assigned locale. Defaults to the system's locale if no locale has been + * specified. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or + * Intl.DateTimeFormat constructor options. + * @param {Object} opts - Options to override the configuration of the start DateTime. + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 + * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM + * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID$1; + } + + /** + * Returns an ISO 8601-compliant string representation of this Interval. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISO(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`; + } + + /** + * Returns an ISO 8601-compliant string representation of date of this Interval. + * The time components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @return {string} + */ + toISODate() { + if (!this.isValid) return INVALID$1; + return `${this.s.toISODate()}/${this.e.toISODate()}`; + } + + /** + * Returns an ISO 8601-compliant string representation of time of this Interval. + * The date components are ignored. + * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals + * @param {Object} opts - The same options as {@link DateTime#toISO} + * @return {string} + */ + toISOTime(opts) { + if (!this.isValid) return INVALID$1; + return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`; + } + + /** + * Returns a string representation of this Interval formatted according to the specified format + * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible + * formatting tool. + * @param {string} dateFormat - The format string. This string formats the start and end time. + * See {@link DateTime#toFormat} for details. + * @param {Object} opts - Options. + * @param {string} [opts.separator = ' – '] - A separator to place between the start and end + * representations. + * @return {string} + */ + toFormat(dateFormat, { + separator = " – " + } = {}) { + if (!this.isValid) return INVALID$1; + return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`; + } + + /** + * Return a Duration representing the time spanned by this interval. + * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } + * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } + * @return {Duration} + */ + toDuration(unit, opts) { + if (!this.isValid) { + return Duration.invalid(this.invalidReason); + } + return this.e.diff(this.s, unit, opts); + } + + /** + * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes + * @param {function} mapFn + * @return {Interval} + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) + * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) + */ + mapEndpoints(mapFn) { + return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); + } +} + +/** + * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. + */ +class Info { + /** + * Return whether the specified zone contains a DST. + * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. + * @return {boolean} + */ + static hasDST(zone = Settings.defaultZone) { + const proto = DateTime.now().setZone(zone).set({ + month: 12 + }); + return !zone.isUniversal && proto.offset !== proto.set({ + month: 6 + }).offset; + } + + /** + * Return whether the specified zone is a valid IANA specifier. + * @param {string} zone - Zone to check + * @return {boolean} + */ + static isValidIANAZone(zone) { + return IANAZone.isValidZone(zone); + } + + /** + * Converts the input into a {@link Zone} instance. + * + * * If `input` is already a Zone instance, it is returned unchanged. + * * If `input` is a string containing a valid time zone name, a Zone instance + * with that name is returned. + * * If `input` is a string that doesn't refer to a known time zone, a Zone + * instance with {@link Zone#isValid} == false is returned. + * * If `input is a number, a Zone instance with the specified fixed offset + * in minutes is returned. + * * If `input` is `null` or `undefined`, the default zone is returned. + * @param {string|Zone|number} [input] - the value to be converted + * @return {Zone} + */ + static normalizeZone(input) { + return normalizeZone(input, Settings.defaultZone); + } + + /** + * Get the weekday on which the week starts according to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} the start of the week, 1 for Monday through 7 for Sunday + */ + static getStartOfWeek({ + locale = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale)).getStartOfWeek(); + } + + /** + * Get the minimum number of days necessary in a week before it is considered part of the next year according + * to the given locale. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number} + */ + static getMinimumDaysInFirstWeek({ + locale = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); + } + + /** + * Get the weekdays, which are considered the weekend according to the given locale + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.locObj=null] - an existing locale object to use + * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday + */ + static getWeekendWeekdays({ + locale = null, + locObj = null + } = {}) { + // copy the array, because we cache it internally + return (locObj || Locale.create(locale)).getWeekendDays().slice(); + } + + /** + * Return an array of standalone month names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @example Info.months()[0] //=> 'January' + * @example Info.months('short')[0] //=> 'Jan' + * @example Info.months('numeric')[0] //=> '1' + * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' + * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' + * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' + * @return {Array} + */ + static months(length = "long", { + locale = null, + numberingSystem = null, + locObj = null, + outputCalendar = "gregory" + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); + } + + /** + * Return an array of format month names. + * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that + * changes the string. + * See {@link Info#months} + * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @param {string} [opts.outputCalendar='gregory'] - the calendar + * @return {Array} + */ + static monthsFormat(length = "long", { + locale = null, + numberingSystem = null, + locObj = null, + outputCalendar = "gregory" + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); + } + + /** + * Return an array of standalone week names. + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @example Info.weekdays()[0] //=> 'Monday' + * @example Info.weekdays('short')[0] //=> 'Mon' + * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' + * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' + * @return {Array} + */ + static weekdays(length = "long", { + locale = null, + numberingSystem = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); + } + + /** + * Return an array of format week names. + * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that + * changes the string. + * See {@link Info#weekdays} + * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". + * @param {Object} opts - options + * @param {string} [opts.locale=null] - the locale code + * @param {string} [opts.numberingSystem=null] - the numbering system + * @param {string} [opts.locObj=null] - an existing locale object to use + * @return {Array} + */ + static weekdaysFormat(length = "long", { + locale = null, + numberingSystem = null, + locObj = null + } = {}) { + return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); + } + + /** + * Return an array of meridiems. + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.meridiems() //=> [ 'AM', 'PM' ] + * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] + * @return {Array} + */ + static meridiems({ + locale = null + } = {}) { + return Locale.create(locale).meridiems(); + } + + /** + * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. + * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". + * @param {Object} opts - options + * @param {string} [opts.locale] - the locale code + * @example Info.eras() //=> [ 'BC', 'AD' ] + * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] + * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] + * @return {Array} + */ + static eras(length = "short", { + locale = null + } = {}) { + return Locale.create(locale, null, "gregory").eras(length); + } + + /** + * Return the set of available features in this environment. + * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. + * Keys: + * * `relative`: whether this environment supports relative time formatting + * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale + * @example Info.features() //=> { relative: false, localeWeek: true } + * @return {Object} + */ + static features() { + return { + relative: hasRelative(), + localeWeek: hasLocaleWeekInfo() + }; + } +} + +function dayDiff(earlier, later) { + const utcDayStart = dt => dt.toUTC(0, { + keepLocalTime: true + }).startOf("day").valueOf(), + ms = utcDayStart(later) - utcDayStart(earlier); + return Math.floor(Duration.fromMillis(ms).as("days")); +} +function highOrderDiffs(cursor, later, units) { + const differs = [["years", (a, b) => b.year - a.year], ["quarters", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4], ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], ["weeks", (a, b) => { + const days = dayDiff(a, b); + return (days - days % 7) / 7; + }], ["days", dayDiff]]; + const results = {}; + const earlier = cursor; + let lowestOrder, highWater; + + /* This loop tries to diff using larger units first. + If we overshoot, we backtrack and try the next smaller unit. + "cursor" starts out at the earlier timestamp and moves closer and closer to "later" + as we use smaller and smaller units. + highWater keeps track of where we would be if we added one more of the smallest unit, + this is used later to potentially convert any difference smaller than the smallest higher order unit + into a fraction of that smallest higher order unit + */ + for (const [unit, differ] of differs) { + if (units.indexOf(unit) >= 0) { + lowestOrder = unit; + results[unit] = differ(cursor, later); + highWater = earlier.plus(results); + if (highWater > later) { + // we overshot the end point, backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + + // if we are still overshooting now, we need to backtrack again + // this happens in certain situations when diffing times in different zones, + // because this calculation ignores time zones + if (cursor > later) { + // keep the "overshot by 1" around as highWater + highWater = cursor; + // backtrack cursor by 1 + results[unit]--; + cursor = earlier.plus(results); + } + } else { + cursor = highWater; + } + } + } + return [cursor, results, highWater, lowestOrder]; +} +function diff (earlier, later, units, opts) { + let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units); + const remainingMillis = later - cursor; + const lowerOrderUnits = units.filter(u => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0); + if (lowerOrderUnits.length === 0) { + if (highWater < later) { + highWater = cursor.plus({ + [lowestOrder]: 1 + }); + } + if (highWater !== cursor) { + results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); + } + } + const duration = Duration.fromObject(results, opts); + if (lowerOrderUnits.length > 0) { + return Duration.fromMillis(remainingMillis, opts).shiftTo(...lowerOrderUnits).plus(duration); + } else { + return duration; + } +} + +const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; +function intUnit(regex, post = i => i) { + return { + regex, + deser: ([s]) => post(parseDigits(s)) + }; +} +const NBSP = String.fromCharCode(160); +const spaceOrNBSP = `[ ${NBSP}]`; +const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); +function fixListRegex(s) { + // make dots optional and also make them literal + // make space and non breakable space characters interchangeable + return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); +} +function stripInsensitivities(s) { + return s.replace(/\./g, "") // ignore dots that were made optional + .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp + .toLowerCase(); +} +function oneOf(strings, startIndex) { + if (strings === null) { + return null; + } else { + return { + regex: RegExp(strings.map(fixListRegex).join("|")), + deser: ([s]) => strings.findIndex(i => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex + }; + } +} +function offset(regex, groups) { + return { + regex, + deser: ([, h, m]) => signedOffset(h, m), + groups + }; +} +function simple(regex) { + return { + regex, + deser: ([s]) => s + }; +} +function escapeToken(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); +} + +/** + * @param token + * @param {Locale} loc + */ +function unitForToken(token, loc) { + const one = digitRegex(loc), + two = digitRegex(loc, "{2}"), + three = digitRegex(loc, "{3}"), + four = digitRegex(loc, "{4}"), + six = digitRegex(loc, "{6}"), + oneOrTwo = digitRegex(loc, "{1,2}"), + oneToThree = digitRegex(loc, "{1,3}"), + oneToSix = digitRegex(loc, "{1,6}"), + oneToNine = digitRegex(loc, "{1,9}"), + twoToFour = digitRegex(loc, "{2,4}"), + fourToSix = digitRegex(loc, "{4,6}"), + literal = t => ({ + regex: RegExp(escapeToken(t.val)), + deser: ([s]) => s, + literal: true + }), + unitate = t => { + if (token.literal) { + return literal(t); + } + switch (t.val) { + // era + case "G": + return oneOf(loc.eras("short"), 0); + case "GG": + return oneOf(loc.eras("long"), 0); + // years + case "y": + return intUnit(oneToSix); + case "yy": + return intUnit(twoToFour, untruncateYear); + case "yyyy": + return intUnit(four); + case "yyyyy": + return intUnit(fourToSix); + case "yyyyyy": + return intUnit(six); + // months + case "M": + return intUnit(oneOrTwo); + case "MM": + return intUnit(two); + case "MMM": + return oneOf(loc.months("short", true), 1); + case "MMMM": + return oneOf(loc.months("long", true), 1); + case "L": + return intUnit(oneOrTwo); + case "LL": + return intUnit(two); + case "LLL": + return oneOf(loc.months("short", false), 1); + case "LLLL": + return oneOf(loc.months("long", false), 1); + // dates + case "d": + return intUnit(oneOrTwo); + case "dd": + return intUnit(two); + // ordinals + case "o": + return intUnit(oneToThree); + case "ooo": + return intUnit(three); + // time + case "HH": + return intUnit(two); + case "H": + return intUnit(oneOrTwo); + case "hh": + return intUnit(two); + case "h": + return intUnit(oneOrTwo); + case "mm": + return intUnit(two); + case "m": + return intUnit(oneOrTwo); + case "q": + return intUnit(oneOrTwo); + case "qq": + return intUnit(two); + case "s": + return intUnit(oneOrTwo); + case "ss": + return intUnit(two); + case "S": + return intUnit(oneToThree); + case "SSS": + return intUnit(three); + case "u": + return simple(oneToNine); + case "uu": + return simple(oneOrTwo); + case "uuu": + return intUnit(one); + // meridiem + case "a": + return oneOf(loc.meridiems(), 0); + // weekYear (k) + case "kkkk": + return intUnit(four); + case "kk": + return intUnit(twoToFour, untruncateYear); + // weekNumber (W) + case "W": + return intUnit(oneOrTwo); + case "WW": + return intUnit(two); + // weekdays + case "E": + case "c": + return intUnit(one); + case "EEE": + return oneOf(loc.weekdays("short", false), 1); + case "EEEE": + return oneOf(loc.weekdays("long", false), 1); + case "ccc": + return oneOf(loc.weekdays("short", true), 1); + case "cccc": + return oneOf(loc.weekdays("long", true), 1); + // offset/zone + case "Z": + case "ZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2); + case "ZZZ": + return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2); + // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing + // because we don't have any way to figure out what they are + case "z": + return simple(/[a-z_+-/]{1,256}?/i); + // this special-case "token" represents a place where a macro-token expanded into a white-space literal + // in this case we accept any non-newline white-space + case " ": + return simple(/[^\S\n\r]/); + default: + return literal(t); + } + }; + const unit = unitate(token) || { + invalidReason: MISSING_FTP + }; + unit.token = token; + return unit; +} +const partTypeStyleToTokenVal = { + year: { + "2-digit": "yy", + numeric: "yyyyy" + }, + month: { + numeric: "M", + "2-digit": "MM", + short: "MMM", + long: "MMMM" + }, + day: { + numeric: "d", + "2-digit": "dd" + }, + weekday: { + short: "EEE", + long: "EEEE" + }, + dayperiod: "a", + dayPeriod: "a", + hour12: { + numeric: "h", + "2-digit": "hh" + }, + hour24: { + numeric: "H", + "2-digit": "HH" + }, + minute: { + numeric: "m", + "2-digit": "mm" + }, + second: { + numeric: "s", + "2-digit": "ss" + }, + timeZoneName: { + long: "ZZZZZ", + short: "ZZZ" + } +}; +function tokenForPart(part, formatOpts, resolvedOpts) { + const { + type, + value + } = part; + if (type === "literal") { + const isSpace = /^\s+$/.test(value); + return { + literal: !isSpace, + val: isSpace ? " " : value + }; + } + const style = formatOpts[type]; + + // The user might have explicitly specified hour12 or hourCycle + // if so, respect their decision + // if not, refer back to the resolvedOpts, which are based on the locale + let actualType = type; + if (type === "hour") { + if (formatOpts.hour12 != null) { + actualType = formatOpts.hour12 ? "hour12" : "hour24"; + } else if (formatOpts.hourCycle != null) { + if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { + actualType = "hour12"; + } else { + actualType = "hour24"; + } + } else { + // tokens only differentiate between 24 hours or not, + // so we do not need to check hourCycle here, which is less supported anyways + actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; + } + } + let val = partTypeStyleToTokenVal[actualType]; + if (typeof val === "object") { + val = val[style]; + } + if (val) { + return { + literal: false, + val + }; + } + return undefined; +} +function buildRegex(units) { + const re = units.map(u => u.regex).reduce((f, r) => `${f}(${r.source})`, ""); + return [`^${re}$`, units]; +} +function match(input, regex, handlers) { + const matches = input.match(regex); + if (matches) { + const all = {}; + let matchIndex = 1; + for (const i in handlers) { + if (hasOwnProperty(handlers, i)) { + const h = handlers[i], + groups = h.groups ? h.groups + 1 : 1; + if (!h.literal && h.token) { + all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); + } + matchIndex += groups; + } + } + return [matches, all]; + } else { + return [matches, {}]; + } +} +function dateTimeFromMatches(matches) { + const toField = token => { + switch (token) { + case "S": + return "millisecond"; + case "s": + return "second"; + case "m": + return "minute"; + case "h": + case "H": + return "hour"; + case "d": + return "day"; + case "o": + return "ordinal"; + case "L": + case "M": + return "month"; + case "y": + return "year"; + case "E": + case "c": + return "weekday"; + case "W": + return "weekNumber"; + case "k": + return "weekYear"; + case "q": + return "quarter"; + default: + return null; + } + }; + let zone = null; + let specificOffset; + if (!isUndefined(matches.z)) { + zone = IANAZone.create(matches.z); + } + if (!isUndefined(matches.Z)) { + if (!zone) { + zone = new FixedOffsetZone(matches.Z); + } + specificOffset = matches.Z; + } + if (!isUndefined(matches.q)) { + matches.M = (matches.q - 1) * 3 + 1; + } + if (!isUndefined(matches.h)) { + if (matches.h < 12 && matches.a === 1) { + matches.h += 12; + } else if (matches.h === 12 && matches.a === 0) { + matches.h = 0; + } + } + if (matches.G === 0 && matches.y) { + matches.y = -matches.y; + } + if (!isUndefined(matches.u)) { + matches.S = parseMillis(matches.u); + } + const vals = Object.keys(matches).reduce((r, k) => { + const f = toField(k); + if (f) { + r[f] = matches[k]; + } + return r; + }, {}); + return [vals, zone, specificOffset]; +} +let dummyDateTimeCache = null; +function getDummyDateTime() { + if (!dummyDateTimeCache) { + dummyDateTimeCache = DateTime.fromMillis(1555555555555); + } + return dummyDateTimeCache; +} +function maybeExpandMacroToken(token, locale) { + if (token.literal) { + return token; + } + const formatOpts = Formatter.macroTokenToFormatOpts(token.val); + const tokens = formatOptsToTokens(formatOpts, locale); + if (tokens == null || tokens.includes(undefined)) { + return token; + } + return tokens; +} +function expandMacroTokens(tokens, locale) { + return Array.prototype.concat(...tokens.map(t => maybeExpandMacroToken(t, locale))); +} + +/** + * @private + */ + +class TokenParser { + constructor(locale, format) { + this.locale = locale; + this.format = format; + this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); + this.units = this.tokens.map(t => unitForToken(t, locale)); + this.disqualifyingUnit = this.units.find(t => t.invalidReason); + if (!this.disqualifyingUnit) { + const [regexString, handlers] = buildRegex(this.units); + this.regex = RegExp(regexString, "i"); + this.handlers = handlers; + } + } + explainFromTokens(input) { + if (!this.isValid) { + return { + input, + tokens: this.tokens, + invalidReason: this.invalidReason + }; + } else { + const [rawMatches, matches] = match(input, this.regex, this.handlers), + [result, zone, specificOffset] = matches ? dateTimeFromMatches(matches) : [null, null, undefined]; + if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { + throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format"); + } + return { + input, + tokens: this.tokens, + regex: this.regex, + rawMatches, + matches, + result, + zone, + specificOffset + }; + } + } + get isValid() { + return !this.disqualifyingUnit; + } + get invalidReason() { + return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; + } +} +function explainFromTokens(locale, input, format) { + const parser = new TokenParser(locale, format); + return parser.explainFromTokens(input); +} +function parseFromTokens(locale, input, format) { + const { + result, + zone, + specificOffset, + invalidReason + } = explainFromTokens(locale, input, format); + return [result, zone, specificOffset, invalidReason]; +} +function formatOptsToTokens(formatOpts, locale) { + if (!formatOpts) { + return null; + } + const formatter = Formatter.create(locale, formatOpts); + const df = formatter.dtFormatter(getDummyDateTime()); + const parts = df.formatToParts(); + const resolvedOpts = df.resolvedOptions(); + return parts.map(p => tokenForPart(p, formatOpts, resolvedOpts)); +} + +const INVALID = "Invalid DateTime"; +const MAX_DATE = 8.64e15; +function unsupportedZone(zone) { + return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`); +} + +// we cache week data on the DT object and this intermediates the cache +/** + * @param {DateTime} dt + */ +function possiblyCachedWeekData(dt) { + if (dt.weekData === null) { + dt.weekData = gregorianToWeek(dt.c); + } + return dt.weekData; +} + +/** + * @param {DateTime} dt + */ +function possiblyCachedLocalWeekData(dt) { + if (dt.localWeekData === null) { + dt.localWeekData = gregorianToWeek(dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek()); + } + return dt.localWeekData; +} + +// clone really means, "make a new object with these modifications". all "setters" really use this +// to create a new object while only changing some of the properties +function clone(inst, alts) { + const current = { + ts: inst.ts, + zone: inst.zone, + c: inst.c, + o: inst.o, + loc: inst.loc, + invalid: inst.invalid + }; + return new DateTime({ + ...current, + ...alts, + old: current + }); +} + +// find the right offset a given local time. The o input is our guess, which determines which +// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) +function fixOffset(localTS, o, tz) { + // Our UTC time is just a guess because our offset is just a guess + let utcGuess = localTS - o * 60 * 1000; + + // Test whether the zone matches the offset for this ts + const o2 = tz.offset(utcGuess); + + // If so, offset didn't change and we're done + if (o === o2) { + return [utcGuess, o]; + } + + // If not, change the ts by the difference in the offset + utcGuess -= (o2 - o) * 60 * 1000; + + // If that gives us the local time we want, we're done + const o3 = tz.offset(utcGuess); + if (o2 === o3) { + return [utcGuess, o2]; + } + + // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time + return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; +} + +// convert an epoch timestamp into a calendar object with the given offset +function tsToObj(ts, offset) { + ts += offset * 60 * 1000; + const d = new Date(ts); + return { + year: d.getUTCFullYear(), + month: d.getUTCMonth() + 1, + day: d.getUTCDate(), + hour: d.getUTCHours(), + minute: d.getUTCMinutes(), + second: d.getUTCSeconds(), + millisecond: d.getUTCMilliseconds() + }; +} + +// convert a calendar object to a epoch timestamp +function objToTS(obj, offset, zone) { + return fixOffset(objToLocalTS(obj), offset, zone); +} + +// create a new DT instance by adding a duration, adjusting for DSTs +function adjustTime(inst, dur) { + const oPre = inst.o, + year = inst.c.year + Math.trunc(dur.years), + month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, + c = { + ...inst.c, + year, + month, + day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7 + }, + millisToAdd = Duration.fromObject({ + years: dur.years - Math.trunc(dur.years), + quarters: dur.quarters - Math.trunc(dur.quarters), + months: dur.months - Math.trunc(dur.months), + weeks: dur.weeks - Math.trunc(dur.weeks), + days: dur.days - Math.trunc(dur.days), + hours: dur.hours, + minutes: dur.minutes, + seconds: dur.seconds, + milliseconds: dur.milliseconds + }).as("milliseconds"), + localTS = objToLocalTS(c); + let [ts, o] = fixOffset(localTS, oPre, inst.zone); + if (millisToAdd !== 0) { + ts += millisToAdd; + // that could have changed the offset by going over a DST, but we want to keep the ts the same + o = inst.zone.offset(ts); + } + return { + ts, + o + }; +} + +// helper useful in turning the results of parsing into real dates +// by handling the zone options +function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { + const { + setZone, + zone + } = opts; + if (parsed && Object.keys(parsed).length !== 0 || parsedZone) { + const interpretationZone = parsedZone || zone, + inst = DateTime.fromObject(parsed, { + ...opts, + zone: interpretationZone, + specificOffset + }); + return setZone ? inst : inst.setZone(zone); + } else { + return DateTime.invalid(new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`)); + } +} + +// if you want to output a technical format (e.g. RFC 2822), this helper +// helps handle the details +function toTechFormat(dt, format, allowZ = true) { + return dt.isValid ? Formatter.create(Locale.create("en-US"), { + allowZ, + forceSimple: true + }).formatDateTimeFromString(dt, format) : null; +} +function toISODate(o, extended, precision) { + const longFormat = o.c.year > 9999 || o.c.year < 0; + let c = ""; + if (longFormat && o.c.year >= 0) c += "+"; + c += padStart(o.c.year, longFormat ? 6 : 4); + if (precision === "year") return c; + if (extended) { + c += "-"; + c += padStart(o.c.month); + if (precision === "month") return c; + c += "-"; + } else { + c += padStart(o.c.month); + if (precision === "month") return c; + } + c += padStart(o.c.day); + return c; +} +function toISOTime(o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision) { + let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0, + c = ""; + switch (precision) { + case "day": + case "month": + case "year": + break; + default: + c += padStart(o.c.hour); + if (precision === "hour") break; + if (extended) { + c += ":"; + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += ":"; + c += padStart(o.c.second); + } + } else { + c += padStart(o.c.minute); + if (precision === "minute") break; + if (showSeconds) { + c += padStart(o.c.second); + } + } + if (precision === "second") break; + if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) { + c += "."; + c += padStart(o.c.millisecond, 3); + } + } + if (includeOffset) { + if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { + c += "Z"; + } else if (o.o < 0) { + c += "-"; + c += padStart(Math.trunc(-o.o / 60)); + c += ":"; + c += padStart(Math.trunc(-o.o % 60)); + } else { + c += "+"; + c += padStart(Math.trunc(o.o / 60)); + c += ":"; + c += padStart(Math.trunc(o.o % 60)); + } + } + if (extendedZone) { + c += "[" + o.zone.ianaName + "]"; + } + return c; +} + +// defaults for unspecified units in the supported calendars +const defaultUnitValues = { + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultWeekUnitValues = { + weekNumber: 1, + weekday: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }, + defaultOrdinalUnitValues = { + ordinal: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0 + }; + +// Units in the supported calendars, sorted by bigness +const orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], + orderedWeekUnits = ["weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond"], + orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; + +// standardize case and plurality in units +function normalizeUnit(unit) { + const normalized = { + year: "year", + years: "year", + month: "month", + months: "month", + day: "day", + days: "day", + hour: "hour", + hours: "hour", + minute: "minute", + minutes: "minute", + quarter: "quarter", + quarters: "quarter", + second: "second", + seconds: "second", + millisecond: "millisecond", + milliseconds: "millisecond", + weekday: "weekday", + weekdays: "weekday", + weeknumber: "weekNumber", + weeksnumber: "weekNumber", + weeknumbers: "weekNumber", + weekyear: "weekYear", + weekyears: "weekYear", + ordinal: "ordinal" + }[unit.toLowerCase()]; + if (!normalized) throw new InvalidUnitError(unit); + return normalized; +} +function normalizeUnitWithLocalWeeks(unit) { + switch (unit.toLowerCase()) { + case "localweekday": + case "localweekdays": + return "localWeekday"; + case "localweeknumber": + case "localweeknumbers": + return "localWeekNumber"; + case "localweekyear": + case "localweekyears": + return "localWeekYear"; + default: + return normalizeUnit(unit); + } +} + +// cache offsets for zones based on the current timestamp when this function is +// first called. When we are handling a datetime from components like (year, +// month, day, hour) in a time zone, we need a guess about what the timezone +// offset is so that we can convert into a UTC timestamp. One way is to find the +// offset of now in the zone. The actual date may have a different offset (for +// example, if we handle a date in June while we're in December in a zone that +// observes DST), but we can check and adjust that. +// +// When handling many dates, calculating the offset for now every time is +// expensive. It's just a guess, so we can cache the offset to use even if we +// are right on a time change boundary (we'll just correct in the other +// direction). Using a timestamp from first read is a slight optimization for +// handling dates close to the current date, since those dates will usually be +// in the same offset (we could set the timestamp statically, instead). We use a +// single timestamp for all zones to make things a bit more predictable. +// +// This is safe for quickDT (used by local() and utc()) because we don't fill in +// higher-order units from tsNow (as we do in fromObject, this requires that +// offset is calculated from tsNow). +/** + * @param {Zone} zone + * @return {number} + */ +function guessOffsetForZone(zone) { + if (zoneOffsetTs === undefined) { + zoneOffsetTs = Settings.now(); + } + + // Do not cache anything but IANA zones, because it is not safe to do so. + // Guessing an offset which is not present in the zone can cause wrong results from fixOffset + if (zone.type !== "iana") { + return zone.offset(zoneOffsetTs); + } + const zoneName = zone.name; + let offsetGuess = zoneOffsetGuessCache.get(zoneName); + if (offsetGuess === undefined) { + offsetGuess = zone.offset(zoneOffsetTs); + zoneOffsetGuessCache.set(zoneName, offsetGuess); + } + return offsetGuess; +} + +// this is a dumbed down version of fromObject() that runs about 60% faster +// but doesn't do any validation, makes a bunch of assumptions about what units +// are present, and so on. +function quickDT(obj, opts) { + const zone = normalizeZone(opts.zone, Settings.defaultZone); + if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } + const loc = Locale.fromObject(opts); + let ts, o; + + // assume we have the higher-order units + if (!isUndefined(obj.year)) { + for (const u of orderedUnits) { + if (isUndefined(obj[u])) { + obj[u] = defaultUnitValues[u]; + } + } + const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); + if (invalid) { + return DateTime.invalid(invalid); + } + const offsetProvis = guessOffsetForZone(zone); + [ts, o] = objToTS(obj, offsetProvis, zone); + } else { + ts = Settings.now(); + } + return new DateTime({ + ts, + zone, + loc, + o + }); +} +function diffRelative(start, end, opts) { + const round = isUndefined(opts.round) ? true : opts.round, + rounding = isUndefined(opts.rounding) ? "trunc" : opts.rounding, + format = (c, unit) => { + c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? "round" : rounding); + const formatter = end.loc.clone(opts).relFormatter(opts); + return formatter.format(c, unit); + }, + differ = unit => { + if (opts.calendary) { + if (!end.hasSame(start, unit)) { + return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); + } else return 0; + } else { + return end.diff(start, unit).get(unit); + } + }; + if (opts.unit) { + return format(differ(opts.unit), opts.unit); + } + for (const unit of opts.units) { + const count = differ(unit); + if (Math.abs(count) >= 1) { + return format(count, unit); + } + } + return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); +} +function lastOpts(argList) { + let opts = {}, + args; + if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { + opts = argList[argList.length - 1]; + args = Array.from(argList).slice(0, argList.length - 1); + } else { + args = Array.from(argList); + } + return [opts, args]; +} + +/** + * Timestamp to use for cached zone offset guesses (exposed for test) + */ +let zoneOffsetTs; +/** + * Cache for zone offset guesses (exposed for test). + * + * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of + * zone.offset(). + */ +const zoneOffsetGuessCache = new Map(); + +/** + * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. + * + * A DateTime comprises of: + * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. + * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). + * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. + * + * Here is a brief overview of the most commonly used functionality it provides: + * + * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. + * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, + * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. + * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. + * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. + * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. + * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. + * + * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. + */ +class DateTime { + /** + * @access private + */ + constructor(config) { + const zone = config.zone || Settings.defaultZone; + let invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); + /** + * @access private + */ + this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; + let c = null, + o = null; + if (!invalid) { + const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); + if (unchanged) { + [c, o] = [config.old.c, config.old.o]; + } else { + // If an offset has been passed and we have not been called from + // clone(), we can trust it and avoid the offset calculation. + const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); + c = tsToObj(this.ts, ot); + invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; + c = invalid ? null : c; + o = invalid ? null : ot; + } + } + + /** + * @access private + */ + this._zone = zone; + /** + * @access private + */ + this.loc = config.loc || Locale.create(); + /** + * @access private + */ + this.invalid = invalid; + /** + * @access private + */ + this.weekData = null; + /** + * @access private + */ + this.localWeekData = null; + /** + * @access private + */ + this.c = c; + /** + * @access private + */ + this.o = o; + /** + * @access private + */ + this.isLuxonDateTime = true; + } + + // CONSTRUCT + + /** + * Create a DateTime for the current instant, in the system's time zone. + * + * Use Settings to override these default values if needed. + * @example DateTime.now().toISO() //~> now in the ISO format + * @return {DateTime} + */ + static now() { + return new DateTime({}); + } + + /** + * Create a local DateTime + * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month, 1-indexed + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @example DateTime.local() //~> now + * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time + * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 + * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 + * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale + * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 + * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC + * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 + * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 + * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 + * @return {DateTime} + */ + static local() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, opts); + } + + /** + * Create a DateTime in UTC + * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used + * @param {number} [month=1] - The month, 1-indexed + * @param {number} [day=1] - The day of the month + * @param {number} [hour=0] - The hour of the day, in 24-hour time + * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 + * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 + * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 + * @param {Object} options - configuration options for the DateTime + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.utc() //~> now + * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z + * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z + * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z + * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z + * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale + * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z + * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale + * @return {DateTime} + */ + static utc() { + const [opts, args] = lastOpts(arguments), + [year, month, day, hour, minute, second, millisecond] = args; + opts.zone = FixedOffsetZone.utcInstance; + return quickDT({ + year, + month, + day, + hour, + minute, + second, + millisecond + }, opts); + } + + /** + * Create a DateTime from a JavaScript Date object. Uses the default zone. + * @param {Date} date - a JavaScript Date object + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @return {DateTime} + */ + static fromJSDate(date, options = {}) { + const ts = isDate(date) ? date.valueOf() : NaN; + if (Number.isNaN(ts)) { + return DateTime.invalid("invalid input"); + } + const zoneToUse = normalizeZone(options.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + return new DateTime({ + ts: ts, + zone: zoneToUse, + loc: Locale.fromObject(options) + }); + } + + /** + * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} milliseconds - a number of milliseconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromMillis(milliseconds, options = {}) { + if (!isNumber(milliseconds)) { + throw new InvalidArgumentError(`fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`); + } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { + // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start + return DateTime.invalid("Timestamp out of range"); + } else { + return new DateTime({ + ts: milliseconds, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. + * @param {number} seconds - a number of seconds since 1970 UTC + * @param {Object} options - configuration options for the DateTime + * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into + * @param {string} [options.locale] - a locale to set on the resulting DateTime instance + * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromSeconds(seconds, options = {}) { + if (!isNumber(seconds)) { + throw new InvalidArgumentError("fromSeconds requires a numerical input"); + } else { + return new DateTime({ + ts: seconds * 1000, + zone: normalizeZone(options.zone, Settings.defaultZone), + loc: Locale.fromObject(options) + }); + } + } + + /** + * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. + * @param {Object} obj - the object to create the DateTime from + * @param {number} obj.year - a year, such as 1987 + * @param {number} obj.month - a month, 1-12 + * @param {number} obj.day - a day of the month, 1-31, depending on the month + * @param {number} obj.ordinal - day of the year, 1-365 or 366 + * @param {number} obj.weekYear - an ISO week year + * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year + * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday + * @param {number} obj.localWeekYear - a week year, according to the locale + * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale + * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale + * @param {number} obj.hour - hour of the day, 0-23 + * @param {number} obj.minute - minute of the hour, 0-59 + * @param {number} obj.second - second of the minute, 0-59 + * @param {number} obj.millisecond - millisecond of the second, 0-999 + * @param {Object} opts - options for creating this DateTime + * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() + * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' + * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) + * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) + * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' + * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' + * @return {DateTime} + */ + static fromObject(obj, opts = {}) { + obj = obj || {}; + const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); + if (!zoneToUse.isValid) { + return DateTime.invalid(unsupportedZone(zoneToUse)); + } + const loc = Locale.fromObject(opts); + const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); + const { + minDaysInFirstWeek, + startOfWeek + } = usesLocalWeekValues(normalized, loc); + const tsNow = Settings.now(), + offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + + // cases: + // just a weekday -> this week's instance of that weekday, no worries + // (gregorian data or ordinal) + (weekYear or weekNumber) -> error + // (gregorian month or day) + ordinal -> error + // otherwise just use weeks or ordinals or gregorian, depending on what's specified + + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + const useWeekData = definiteWeekDef || normalized.weekday && !containsGregor; + + // configure ourselves to deal with gregorian dates or week stuff + let units, + defaultValues, + objNow = tsToObj(tsNow, offsetProvis); + if (useWeekData) { + units = orderedWeekUnits; + defaultValues = defaultWeekUnitValues; + objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); + } else if (containsOrdinal) { + units = orderedOrdinalUnits; + defaultValues = defaultOrdinalUnitValues; + objNow = gregorianToOrdinal(objNow); + } else { + units = orderedUnits; + defaultValues = defaultUnitValues; + } + + // set default values for missing stuff + let foundFirst = false; + for (const u of units) { + const v = normalized[u]; + if (!isUndefined(v)) { + foundFirst = true; + } else if (foundFirst) { + normalized[u] = defaultValues[u]; + } else { + normalized[u] = objNow[u]; + } + } + + // make sure the values we have are in range + const higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), + invalid = higherOrderInvalid || hasInvalidTimeData(normalized); + if (invalid) { + return DateTime.invalid(invalid); + } + + // compute the actual time + const gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, + [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse), + inst = new DateTime({ + ts: tsFinal, + zone: zoneToUse, + o: offsetFinal, + loc + }); + + // gregorian data + weekday serves only to validate + if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { + return DateTime.invalid("mismatched weekday", `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`); + } + if (!inst.isValid) { + return DateTime.invalid(inst.invalid); + } + return inst; + } + + /** + * Create a DateTime from an ISO 8601 string + * @param {string} text - the ISO string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance + * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance + * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance + * @example DateTime.fromISO('2016-05-25T09:08:34.123') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') + * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) + * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) + * @example DateTime.fromISO('2016-W05-4') + * @return {DateTime} + */ + static fromISO(text, opts = {}) { + const [vals, parsedZone] = parseISODate(text); + return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); + } + + /** + * Create a DateTime from an RFC 2822 string + * @param {string} text - the RFC 2822 string + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') + * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') + * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') + * @return {DateTime} + */ + static fromRFC2822(text, opts = {}) { + const [vals, parsedZone] = parseRFC2822Date(text); + return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); + } + + /** + * Create a DateTime from an HTTP header date + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @param {string} text - the HTTP header date + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. + * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. + * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') + * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') + * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') + * @return {DateTime} + */ + static fromHTTP(text, opts = {}) { + const [vals, parsedZone] = parseHTTPDate(text); + return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); + } + + /** + * Create a DateTime from an input string and format string. + * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @return {DateTime} + */ + static fromFormat(text, fmt, opts = {}) { + if (isUndefined(text) || isUndefined(fmt)) { + throw new InvalidArgumentError("fromFormat requires an input string and a format"); + } + const { + locale = null, + numberingSystem = null + } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }), + [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt); + if (invalid) { + return DateTime.invalid(invalid); + } else { + return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset); + } + } + + /** + * @deprecated use fromFormat instead + */ + static fromString(text, fmt, opts = {}) { + return DateTime.fromFormat(text, fmt, opts); + } + + /** + * Create a DateTime from a SQL date, time, or datetime + * Defaults to en-US if no locale has been specified, regardless of the system's locale + * @param {string} text - the string to parse + * @param {Object} opts - options to affect the creation + * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone + * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one + * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale + * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system + * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance + * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance + * @example DateTime.fromSQL('2017-05-15') + * @example DateTime.fromSQL('2017-05-15 09:12:34') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') + * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) + * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) + * @example DateTime.fromSQL('09:12:34.342') + * @return {DateTime} + */ + static fromSQL(text, opts = {}) { + const [vals, parsedZone] = parseSQL(text); + return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); + } + + /** + * Create an invalid DateTime. + * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. + * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information + * @return {DateTime} + */ + static invalid(reason, explanation = null) { + if (!reason) { + throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); + } + const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); + if (Settings.throwOnInvalid) { + throw new InvalidDateTimeError(invalid); + } else { + return new DateTime({ + invalid + }); + } + } + + /** + * Check if an object is an instance of DateTime. Works across context boundaries + * @param {object} o + * @return {boolean} + */ + static isDateTime(o) { + return o && o.isLuxonDateTime || false; + } + + /** + * Produce the format string for a set of options + * @param formatOpts + * @param localeOpts + * @returns {string} + */ + static parseFormatForOpts(formatOpts, localeOpts = {}) { + const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); + return !tokenList ? null : tokenList.map(t => t ? t.val : null).join(""); + } + + /** + * Produce the the fully expanded format token for the locale + * Does NOT quote characters, so quoted tokens will not round trip correctly + * @param fmt + * @param localeOpts + * @returns {string} + */ + static expandFormat(fmt, localeOpts = {}) { + const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); + return expanded.map(t => t.val).join(""); + } + static resetCache() { + zoneOffsetTs = undefined; + zoneOffsetGuessCache.clear(); + } + + // INFO + + /** + * Get the value of unit. + * @param {string} unit - a unit such as 'minute' or 'day' + * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 + * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 + * @return {number} + */ + get(unit) { + return this[unit]; + } + + /** + * Returns whether the DateTime is valid. Invalid DateTimes occur when: + * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 + * * The DateTime was created by an operation on another invalid date + * @type {boolean} + */ + get isValid() { + return this.invalid === null; + } + + /** + * Returns an error code if this DateTime is invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidReason() { + return this.invalid ? this.invalid.reason : null; + } + + /** + * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid + * @type {string} + */ + get invalidExplanation() { + return this.invalid ? this.invalid.explanation : null; + } + + /** + * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime + * + * @type {string} + */ + get locale() { + return this.isValid ? this.loc.locale : null; + } + + /** + * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime + * + * @type {string} + */ + get numberingSystem() { + return this.isValid ? this.loc.numberingSystem : null; + } + + /** + * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime + * + * @type {string} + */ + get outputCalendar() { + return this.isValid ? this.loc.outputCalendar : null; + } + + /** + * Get the time zone associated with this DateTime. + * @type {Zone} + */ + get zone() { + return this._zone; + } + + /** + * Get the name of the time zone. + * @type {string} + */ + get zoneName() { + return this.isValid ? this.zone.name : null; + } + + /** + * Get the year + * @example DateTime.local(2017, 5, 25).year //=> 2017 + * @type {number} + */ + get year() { + return this.isValid ? this.c.year : NaN; + } + + /** + * Get the quarter + * @example DateTime.local(2017, 5, 25).quarter //=> 2 + * @type {number} + */ + get quarter() { + return this.isValid ? Math.ceil(this.c.month / 3) : NaN; + } + + /** + * Get the month (1-12). + * @example DateTime.local(2017, 5, 25).month //=> 5 + * @type {number} + */ + get month() { + return this.isValid ? this.c.month : NaN; + } + + /** + * Get the day of the month (1-30ish). + * @example DateTime.local(2017, 5, 25).day //=> 25 + * @type {number} + */ + get day() { + return this.isValid ? this.c.day : NaN; + } + + /** + * Get the hour of the day (0-23). + * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 + * @type {number} + */ + get hour() { + return this.isValid ? this.c.hour : NaN; + } + + /** + * Get the minute of the hour (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 + * @type {number} + */ + get minute() { + return this.isValid ? this.c.minute : NaN; + } + + /** + * Get the second of the minute (0-59). + * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 + * @type {number} + */ + get second() { + return this.isValid ? this.c.second : NaN; + } + + /** + * Get the millisecond of the second (0-999). + * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 + * @type {number} + */ + get millisecond() { + return this.isValid ? this.c.millisecond : NaN; + } + + /** + * Get the week year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 + * @type {number} + */ + get weekYear() { + return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; + } + + /** + * Get the week number of the week year (1-52ish). + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 + * @type {number} + */ + get weekNumber() { + return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; + } + + /** + * Get the day of the week. + * 1 is Monday and 7 is Sunday + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2014, 11, 31).weekday //=> 4 + * @type {number} + */ + get weekday() { + return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; + } + + /** + * Returns true if this date is on a weekend according to the locale, false otherwise + * @returns {boolean} + */ + get isWeekend() { + return this.isValid && this.loc.getWeekendDays().includes(this.weekday); + } + + /** + * Get the day of the week according to the locale. + * 1 is the first day of the week and 7 is the last day of the week. + * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, + * @returns {number} + */ + get localWeekday() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; + } + + /** + * Get the week number of the week year according to the locale. Different locales assign week numbers differently, + * because the week can start on different days of the week (see localWeekday) and because a different number of days + * is required for a week to count as the first week of a year. + * @returns {number} + */ + get localWeekNumber() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; + } + + /** + * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) + * differently, see localWeekNumber. + * @returns {number} + */ + get localWeekYear() { + return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; + } + + /** + * Get the ordinal (meaning the day of the year) + * @example DateTime.local(2017, 5, 25).ordinal //=> 145 + * @type {number|DateTime} + */ + get ordinal() { + return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; + } + + /** + * Get the human readable short month name, such as 'Oct'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthShort //=> Oct + * @type {string} + */ + get monthShort() { + return this.isValid ? Info.months("short", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable long month name, such as 'October'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).monthLong //=> October + * @type {string} + */ + get monthLong() { + return this.isValid ? Info.months("long", { + locObj: this.loc + })[this.month - 1] : null; + } + + /** + * Get the human readable short weekday, such as 'Mon'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon + * @type {string} + */ + get weekdayShort() { + return this.isValid ? Info.weekdays("short", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the human readable long weekday, such as 'Monday'. + * Defaults to the system's locale if no locale has been specified + * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday + * @type {string} + */ + get weekdayLong() { + return this.isValid ? Info.weekdays("long", { + locObj: this.loc + })[this.weekday - 1] : null; + } + + /** + * Get the UTC offset of this DateTime in minutes + * @example DateTime.now().offset //=> -240 + * @example DateTime.utc().offset //=> 0 + * @type {number} + */ + get offset() { + return this.isValid ? +this.o : NaN; + } + + /** + * Get the short human name for the zone's current offset, for example "EST" or "EDT". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameShort() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "short", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". + * Defaults to the system's locale if no locale has been specified + * @type {string} + */ + get offsetNameLong() { + if (this.isValid) { + return this.zone.offsetName(this.ts, { + format: "long", + locale: this.locale + }); + } else { + return null; + } + } + + /** + * Get whether this zone's offset ever changes, as in a DST. + * @type {boolean} + */ + get isOffsetFixed() { + return this.isValid ? this.zone.isUniversal : null; + } + + /** + * Get whether the DateTime is in a DST. + * @type {boolean} + */ + get isInDST() { + if (this.isOffsetFixed) { + return false; + } else { + return this.offset > this.set({ + month: 1, + day: 1 + }).offset || this.offset > this.set({ + month: 5 + }).offset; + } + } + + /** + * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC + * in this DateTime's zone. During DST changes local time can be ambiguous, for example + * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. + * This method will return both possible DateTimes if this DateTime's local time is ambiguous. + * @returns {DateTime[]} + */ + getPossibleOffsets() { + if (!this.isValid || this.isOffsetFixed) { + return [this]; + } + const dayMs = 86400000; + const minuteMs = 60000; + const localTS = objToLocalTS(this.c); + const oEarlier = this.zone.offset(localTS - dayMs); + const oLater = this.zone.offset(localTS + dayMs); + const o1 = this.zone.offset(localTS - oEarlier * minuteMs); + const o2 = this.zone.offset(localTS - oLater * minuteMs); + if (o1 === o2) { + return [this]; + } + const ts1 = localTS - o1 * minuteMs; + const ts2 = localTS - o2 * minuteMs; + const c1 = tsToObj(ts1, o1); + const c2 = tsToObj(ts2, o2); + if (c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond) { + return [clone(this, { + ts: ts1 + }), clone(this, { + ts: ts2 + })]; + } + return [this]; + } + + /** + * Returns true if this DateTime is in a leap year, false otherwise + * @example DateTime.local(2016).isInLeapYear //=> true + * @example DateTime.local(2013).isInLeapYear //=> false + * @type {boolean} + */ + get isInLeapYear() { + return isLeapYear(this.year); + } + + /** + * Returns the number of days in this DateTime's month + * @example DateTime.local(2016, 2).daysInMonth //=> 29 + * @example DateTime.local(2016, 3).daysInMonth //=> 31 + * @type {number} + */ + get daysInMonth() { + return daysInMonth(this.year, this.month); + } + + /** + * Returns the number of days in this DateTime's year + * @example DateTime.local(2016).daysInYear //=> 366 + * @example DateTime.local(2013).daysInYear //=> 365 + * @type {number} + */ + get daysInYear() { + return this.isValid ? daysInYear(this.year) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's year + * @see https://en.wikipedia.org/wiki/ISO_week_date + * @example DateTime.local(2004).weeksInWeekYear //=> 53 + * @example DateTime.local(2013).weeksInWeekYear //=> 52 + * @type {number} + */ + get weeksInWeekYear() { + return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; + } + + /** + * Returns the number of weeks in this DateTime's local week year + * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 + * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 + * @type {number} + */ + get weeksInLocalWeekYear() { + return this.isValid ? weeksInWeekYear(this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek()) : NaN; + } + + /** + * Returns the resolved Intl options for this DateTime. + * This is useful in understanding the behavior of formatting methods + * @param {Object} opts - the same options as toLocaleString + * @return {Object} + */ + resolvedLocaleOptions(opts = {}) { + const { + locale, + numberingSystem, + calendar + } = Formatter.create(this.loc.clone(opts), opts).resolvedOptions(this); + return { + locale, + numberingSystem, + outputCalendar: calendar + }; + } + + // TRANSFORM + + /** + * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. + * + * Equivalent to {@link DateTime#setZone}('utc') + * @param {number} [offset=0] - optionally, an offset from UTC in minutes + * @param {Object} [opts={}] - options to pass to `setZone()` + * @return {DateTime} + */ + toUTC(offset = 0, opts = {}) { + return this.setZone(FixedOffsetZone.instance(offset), opts); + } + + /** + * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. + * + * Equivalent to `setZone('local')` + * @return {DateTime} + */ + toLocal() { + return this.setZone(Settings.defaultZone); + } + + /** + * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. + * + * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. + * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. + * @param {Object} opts - options + * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. + * @return {DateTime} + */ + setZone(zone, { + keepLocalTime = false, + keepCalendarTime = false + } = {}) { + zone = normalizeZone(zone, Settings.defaultZone); + if (zone.equals(this.zone)) { + return this; + } else if (!zone.isValid) { + return DateTime.invalid(unsupportedZone(zone)); + } else { + let newTS = this.ts; + if (keepLocalTime || keepCalendarTime) { + const offsetGuess = zone.offset(this.ts); + const asObj = this.toObject(); + [newTS] = objToTS(asObj, offsetGuess, zone); + } + return clone(this, { + ts: newTS, + zone + }); + } + } + + /** + * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. + * @param {Object} properties - the properties to set + * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) + * @return {DateTime} + */ + reconfigure({ + locale, + numberingSystem, + outputCalendar + } = {}) { + const loc = this.loc.clone({ + locale, + numberingSystem, + outputCalendar + }); + return clone(this, { + loc + }); + } + + /** + * "Set" the locale. Returns a newly-constructed DateTime. + * Just a convenient alias for reconfigure({ locale }) + * @example DateTime.local(2017, 5, 25).setLocale('en-GB') + * @return {DateTime} + */ + setLocale(locale) { + return this.reconfigure({ + locale + }); + } + + /** + * "Set" the values of specified units. Returns a newly-constructed DateTime. + * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. + * + * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. + * They cannot be mixed with ISO-week units like `weekday`. + * @param {Object} values - a mapping of units to numbers + * @example dt.set({ year: 2017 }) + * @example dt.set({ hour: 8, minute: 30 }) + * @example dt.set({ weekday: 5 }) + * @example dt.set({ year: 2005, ordinal: 234 }) + * @return {DateTime} + */ + set(values) { + if (!this.isValid) return this; + const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); + const { + minDaysInFirstWeek, + startOfWeek + } = usesLocalWeekValues(normalized, this.loc); + const settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), + containsOrdinal = !isUndefined(normalized.ordinal), + containsGregorYear = !isUndefined(normalized.year), + containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), + containsGregor = containsGregorYear || containsGregorMD, + definiteWeekDef = normalized.weekYear || normalized.weekNumber; + if ((containsGregor || containsOrdinal) && definiteWeekDef) { + throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals"); + } + if (containsGregorMD && containsOrdinal) { + throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); + } + let mixed; + if (settingWeekStuff) { + mixed = weekToGregorian({ + ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), + ...normalized + }, minDaysInFirstWeek, startOfWeek); + } else if (!isUndefined(normalized.ordinal)) { + mixed = ordinalToGregorian({ + ...gregorianToOrdinal(this.c), + ...normalized + }); + } else { + mixed = { + ...this.toObject(), + ...normalized + }; + + // if we didn't set the day but we ended up on an overflow date, + // use the last day of the right month + if (isUndefined(normalized.day)) { + mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); + } + } + const [ts, o] = objToTS(mixed, this.o, this.zone); + return clone(this, { + ts, + o + }); + } + + /** + * Add a period of time to this DateTime and return the resulting DateTime + * + * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. + * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + * @example DateTime.now().plus(123) //~> in 123 milliseconds + * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes + * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow + * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday + * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min + * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min + * @return {DateTime} + */ + plus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration); + return clone(this, adjustTime(this, dur)); + } + + /** + * Subtract a period of time to this DateTime and return the resulting DateTime + * See {@link DateTime#plus} + * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() + @return {DateTime} + */ + minus(duration) { + if (!this.isValid) return this; + const dur = Duration.fromDurationLike(duration).negate(); + return clone(this, adjustTime(this, dur)); + } + + /** + * "Set" this DateTime to the beginning of a unit of time. + * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' + * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' + * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' + * @return {DateTime} + */ + startOf(unit, { + useLocaleWeeks = false + } = {}) { + if (!this.isValid) return this; + const o = {}, + normalizedUnit = Duration.normalizeUnit(unit); + switch (normalizedUnit) { + case "years": + o.month = 1; + // falls through + case "quarters": + case "months": + o.day = 1; + // falls through + case "weeks": + case "days": + o.hour = 0; + // falls through + case "hours": + o.minute = 0; + // falls through + case "minutes": + o.second = 0; + // falls through + case "seconds": + o.millisecond = 0; + break; + // no default, invalid units throw in normalizeUnit() + } + + if (normalizedUnit === "weeks") { + if (useLocaleWeeks) { + const startOfWeek = this.loc.getStartOfWeek(); + const { + weekday + } = this; + if (weekday < startOfWeek) { + o.weekNumber = this.weekNumber - 1; + } + o.weekday = startOfWeek; + } else { + o.weekday = 1; + } + } + if (normalizedUnit === "quarters") { + const q = Math.ceil(this.month / 3); + o.month = (q - 1) * 3 + 1; + } + return this.set(o); + } + + /** + * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time + * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week + * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' + * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' + * @return {DateTime} + */ + endOf(unit, opts) { + return this.isValid ? this.plus({ + [unit]: 1 + }).startOf(unit, opts).minus(1) : this; + } + + // OUTPUT + + /** + * Returns a string representation of this DateTime formatted according to the specified format string. + * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). + * Defaults to en-US if no locale has been specified, regardless of the system's locale. + * @param {string} fmt - the format string + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' + * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' + * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' + * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' + * @return {string} + */ + toFormat(fmt, opts = {}) { + return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; + } + + /** + * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. + * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation + * of the DateTime in the assigned locale. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat + * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options + * @param {Object} opts - opts to override the configuration options on this DateTime + * @example DateTime.now().toLocaleString(); //=> 4/20/2017 + * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' + * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' + * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' + * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' + * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' + * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' + * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' + * @return {string} + */ + toLocaleString(formatOpts = DATE_SHORT, opts = {}) { + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; + } + + /** + * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. + * Defaults to the system's locale if no locale has been specified + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts + * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. + * @example DateTime.now().toLocaleParts(); //=> [ + * //=> { type: 'day', value: '25' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'month', value: '05' }, + * //=> { type: 'literal', value: '/' }, + * //=> { type: 'year', value: '1982' } + * //=> ] + */ + toLocaleParts(opts = {}) { + return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=false] - add the time zone format extension + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' + * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' + * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' + * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' + * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z' + * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z' + * @return {string|null} + */ + toISO({ + format = "extended", + suppressSeconds = false, + suppressMilliseconds = false, + includeOffset = true, + extendedZone = false, + precision = "milliseconds" + } = {}) { + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + const ext = format === "extended"; + let c = toISODate(this, ext, precision); + if (orderedUnits.indexOf(precision) >= 3) c += "T"; + c += toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + return c; + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's date component + * @param {Object} opts - options + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'. + * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' + * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' + * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05' + * @return {string|null} + */ + toISODate({ + format = "extended", + precision = "day" + } = {}) { + if (!this.isValid) { + return null; + } + return toISODate(this, format === "extended", normalizeUnit(precision)); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's week date + * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' + * @return {string} + */ + toISOWeekDate() { + return toTechFormat(this, "kkkk-'W'WW-c"); + } + + /** + * Returns an ISO 8601-compliant string representation of this DateTime's time component + * @param {Object} opts - options + * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 + * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.extendedZone=true] - add the time zone format extension + * @param {boolean} [opts.includePrefix=false] - include the `T` prefix + * @param {string} [opts.format='extended'] - choose between the basic and extended format + * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0. + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' + * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z' + * @return {string} + */ + toISOTime({ + suppressMilliseconds = false, + suppressSeconds = false, + includeOffset = true, + includePrefix = false, + extendedZone = false, + format = "extended", + precision = "milliseconds" + } = {}) { + if (!this.isValid) { + return null; + } + precision = normalizeUnit(precision); + let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? "T" : ""; + return c + toISOTime(this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone, precision); + } + + /** + * Returns an RFC 2822-compatible string representation of this DateTime + * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' + * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' + * @return {string} + */ + toRFC2822() { + return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); + } + + /** + * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. + * Specifically, the string conforms to RFC 1123. + * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 + * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' + * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' + * @return {string} + */ + toHTTP() { + return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Date + * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' + * @return {string|null} + */ + toSQLDate() { + if (!this.isValid) { + return null; + } + return toISODate(this, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL Time + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc().toSQL() //=> '05:15:16.345' + * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' + * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' + * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' + * @return {string} + */ + toSQLTime({ + includeOffset = true, + includeZone = false, + includeOffsetSpace = true + } = {}) { + let fmt = "HH:mm:ss.SSS"; + if (includeZone || includeOffset) { + if (includeOffsetSpace) { + fmt += " "; + } + if (includeZone) { + fmt += "z"; + } else if (includeOffset) { + fmt += "ZZ"; + } + } + return toTechFormat(this, fmt, true); + } + + /** + * Returns a string representation of this DateTime appropriate for use in SQL DateTime + * @param {Object} opts - options + * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. + * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' + * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' + * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' + * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' + * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' + * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' + * @return {string} + */ + toSQL(opts = {}) { + if (!this.isValid) { + return null; + } + return `${this.toSQLDate()} ${this.toSQLTime(opts)}`; + } + + /** + * Returns a string representation of this DateTime appropriate for debugging + * @return {string} + */ + toString() { + return this.isValid ? this.toISO() : INVALID; + } + + /** + * Returns a string representation of this DateTime appropriate for the REPL. + * @return {string} + */ + [Symbol.for("nodejs.util.inspect.custom")]() { + if (this.isValid) { + return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`; + } else { + return `DateTime { Invalid, reason: ${this.invalidReason} }`; + } + } + + /** + * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} + * @return {number} + */ + valueOf() { + return this.toMillis(); + } + + /** + * Returns the epoch milliseconds of this DateTime. + * @return {number} + */ + toMillis() { + return this.isValid ? this.ts : NaN; + } + + /** + * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. + * @return {number} + */ + toSeconds() { + return this.isValid ? this.ts / 1000 : NaN; + } + + /** + * Returns the epoch seconds (as a whole number) of this DateTime. + * @return {number} + */ + toUnixInteger() { + return this.isValid ? Math.floor(this.ts / 1000) : NaN; + } + + /** + * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. + * @return {string} + */ + toJSON() { + return this.toISO(); + } + + /** + * Returns a BSON serializable equivalent to this DateTime. + * @return {Date} + */ + toBSON() { + return this.toJSDate(); + } + + /** + * Returns a JavaScript object with this DateTime's year, month, day, and so on. + * @param opts - options for generating the object + * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output + * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } + * @return {Object} + */ + toObject(opts = {}) { + if (!this.isValid) return {}; + const base = { + ...this.c + }; + if (opts.includeConfig) { + base.outputCalendar = this.outputCalendar; + base.numberingSystem = this.loc.numberingSystem; + base.locale = this.loc.locale; + } + return base; + } + + /** + * Returns a JavaScript Date equivalent to this DateTime. + * @return {Date} + */ + toJSDate() { + return new Date(this.isValid ? this.ts : NaN); + } + + // COMPARE + + /** + * Return the difference between two DateTimes as a Duration. + * @param {DateTime} otherDateTime - the DateTime to compare this one to + * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @example + * var i1 = DateTime.fromISO('1982-05-25T09:45'), + * i2 = DateTime.fromISO('1983-10-14T10:30'); + * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } + * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } + * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } + * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } + * @return {Duration} + */ + diff(otherDateTime, unit = "milliseconds", opts = {}) { + if (!this.isValid || !otherDateTime.isValid) { + return Duration.invalid("created by diffing an invalid DateTime"); + } + const durOpts = { + locale: this.locale, + numberingSystem: this.numberingSystem, + ...opts + }; + const units = maybeArray(unit).map(Duration.normalizeUnit), + otherIsLater = otherDateTime.valueOf() > this.valueOf(), + earlier = otherIsLater ? this : otherDateTime, + later = otherIsLater ? otherDateTime : this, + diffed = diff(earlier, later, units, durOpts); + return otherIsLater ? diffed.negate() : diffed; + } + + /** + * Return the difference between this DateTime and right now. + * See {@link DateTime#diff} + * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration + * @param {Object} opts - options that affect the creation of the Duration + * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use + * @return {Duration} + */ + diffNow(unit = "milliseconds", opts = {}) { + return this.diff(DateTime.now(), unit, opts); + } + + /** + * Return an Interval spanning between this DateTime and another DateTime + * @param {DateTime} otherDateTime - the other end point of the Interval + * @return {Interval|DateTime} + */ + until(otherDateTime) { + return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; + } + + /** + * Return whether this DateTime is in the same unit of time as another DateTime. + * Higher-order units must also be identical for this function to return `true`. + * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. + * @param {DateTime} otherDateTime - the other DateTime + * @param {string} unit - the unit of time to check sameness on + * @param {Object} opts - options + * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used + * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day + * @return {boolean} + */ + hasSame(otherDateTime, unit, opts) { + if (!this.isValid) return false; + const inputMs = otherDateTime.valueOf(); + const adjustedToZone = this.setZone(otherDateTime.zone, { + keepLocalTime: true + }); + return adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts); + } + + /** + * Equality check + * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. + * To compare just the millisecond values, use `+dt1 === +dt2`. + * @param {DateTime} other - the other DateTime + * @return {boolean} + */ + equals(other) { + return this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc); + } + + /** + * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your + * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" + * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" + * @param {boolean} [options.round=true] - whether to round the numbers in the output. + * @param {string} [options.rounding="trunc"] - rounding method to use when rounding the numbers in the output. Can be "trunc" (toward zero), "expand" (away from zero), "round", "floor", or "ceil". + * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" + * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" + * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" + * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" + * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" + * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" + */ + toRelative(options = {}) { + if (!this.isValid) return null; + const base = options.base || DateTime.fromObject({}, { + zone: this.zone + }), + padding = options.padding ? this < base ? -options.padding : options.padding : 0; + let units = ["years", "months", "days", "hours", "minutes", "seconds"]; + let unit = options.unit; + if (Array.isArray(options.unit)) { + units = options.unit; + unit = undefined; + } + return diffRelative(base, this.plus(padding), { + ...options, + numeric: "always", + units, + unit + }); + } + + /** + * Returns a string representation of this date relative to today, such as "yesterday" or "next month". + * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. + * @param {Object} options - options that affect the output + * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. + * @param {string} options.locale - override the locale of this DateTime + * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" + * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" + * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" + * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" + * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" + */ + toRelativeCalendar(options = {}) { + if (!this.isValid) return null; + return diffRelative(options.base || DateTime.fromObject({}, { + zone: this.zone + }), this, { + ...options, + numeric: "auto", + units: ["years", "months", "days"], + calendary: true + }); + } + + /** + * Return the min of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum + * @return {DateTime} the min DateTime, or undefined if called with no argument + */ + static min(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("min requires all arguments be DateTimes"); + } + return bestBy(dateTimes, i => i.valueOf(), Math.min); + } + + /** + * Return the max of several date times + * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum + * @return {DateTime} the max DateTime, or undefined if called with no argument + */ + static max(...dateTimes) { + if (!dateTimes.every(DateTime.isDateTime)) { + throw new InvalidArgumentError("max requires all arguments be DateTimes"); + } + return bestBy(dateTimes, i => i.valueOf(), Math.max); + } + + // MISC + + /** + * Explain how a string would be parsed by fromFormat() + * @param {string} text - the string to parse + * @param {string} fmt - the format the string is expected to be in (see description) + * @param {Object} options - options taken by fromFormat() + * @return {Object} + */ + static fromFormatExplain(text, fmt, options = {}) { + const { + locale = null, + numberingSystem = null + } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + return explainFromTokens(localeToUse, text, fmt); + } + + /** + * @deprecated use fromFormatExplain instead + */ + static fromStringExplain(text, fmt, options = {}) { + return DateTime.fromFormatExplain(text, fmt, options); + } + + /** + * Build a parser for `fmt` using the given locale. This parser can be passed + * to {@link DateTime.fromFormatParser} to a parse a date in this format. This + * can be used to optimize cases where many dates need to be parsed in a + * specific format. + * + * @param {String} fmt - the format the string is expected to be in (see + * description) + * @param {Object} options - options used to set locale and numberingSystem + * for parser + * @returns {TokenParser} - opaque object to be used + */ + static buildFormatParser(fmt, options = {}) { + const { + locale = null, + numberingSystem = null + } = options, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + return new TokenParser(localeToUse, fmt); + } + + /** + * Create a DateTime from an input string and format parser. + * + * The format parser must have been created with the same locale as this call. + * + * @param {String} text - the string to parse + * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} + * @param {Object} opts - options taken by fromFormat() + * @returns {DateTime} + */ + static fromFormatParser(text, formatParser, opts = {}) { + if (isUndefined(text) || isUndefined(formatParser)) { + throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser"); + } + const { + locale = null, + numberingSystem = null + } = opts, + localeToUse = Locale.fromOpts({ + locale, + numberingSystem, + defaultToEN: true + }); + if (!localeToUse.equals(formatParser.locale)) { + throw new InvalidArgumentError(`fromFormatParser called with a locale of ${localeToUse}, ` + `but the format parser was created for ${formatParser.locale}`); + } + const { + result, + zone, + specificOffset, + invalidReason + } = formatParser.explainFromTokens(text); + if (invalidReason) { + return DateTime.invalid(invalidReason); + } else { + return parseDataToDateTime(result, zone, opts, `format ${formatParser.format}`, text, specificOffset); + } + } + + // FORMAT PRESETS + + /** + * {@link DateTime#toLocaleString} format like 10/14/1983 + * @type {Object} + */ + static get DATE_SHORT() { + return DATE_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED() { + return DATE_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' + * @type {Object} + */ + static get DATE_MED_WITH_WEEKDAY() { + return DATE_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983' + * @type {Object} + */ + static get DATE_FULL() { + return DATE_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' + * @type {Object} + */ + static get DATE_HUGE() { + return DATE_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_SIMPLE() { + return TIME_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SECONDS() { + return TIME_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_SHORT_OFFSET() { + return TIME_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get TIME_WITH_LONG_OFFSET() { + return TIME_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. + * @type {Object} + */ + static get TIME_24_SIMPLE() { + return TIME_24_SIMPLE; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SECONDS() { + return TIME_24_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_SHORT_OFFSET() { + return TIME_24_WITH_SHORT_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. + * @type {Object} + */ + static get TIME_24_WITH_LONG_OFFSET() { + return TIME_24_WITH_LONG_OFFSET; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT() { + return DATETIME_SHORT; + } + + /** + * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_SHORT_WITH_SECONDS() { + return DATETIME_SHORT_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED() { + return DATETIME_MED; + } + + /** + * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_SECONDS() { + return DATETIME_MED_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_MED_WITH_WEEKDAY() { + return DATETIME_MED_WITH_WEEKDAY; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL() { + return DATETIME_FULL; + } + + /** + * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_FULL_WITH_SECONDS() { + return DATETIME_FULL_WITH_SECONDS; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE() { + return DATETIME_HUGE; + } + + /** + * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. + * @type {Object} + */ + static get DATETIME_HUGE_WITH_SECONDS() { + return DATETIME_HUGE_WITH_SECONDS; + } +} + +/** + * @private + */ +function friendlyDateTime(dateTimeish) { + if (DateTime.isDateTime(dateTimeish)) { + return dateTimeish; + } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { + return DateTime.fromJSDate(dateTimeish); + } else if (dateTimeish && typeof dateTimeish === "object") { + return DateTime.fromObject(dateTimeish); + } else { + throw new InvalidArgumentError(`Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`); + } +} + +const VERSION = "3.7.2"; + +exports.DateTime = DateTime; +exports.Duration = Duration; +exports.FixedOffsetZone = FixedOffsetZone; +exports.IANAZone = IANAZone; +exports.Info = Info; +exports.Interval = Interval; +exports.InvalidZone = InvalidZone; +exports.Settings = Settings; +exports.SystemZone = SystemZone; +exports.VERSION = VERSION; +exports.Zone = Zone; +//# sourceMappingURL=luxon.js.map diff --git a/node_modules/luxon/build/node/luxon.js.map b/node_modules/luxon/build/node/luxon.js.map new file mode 100644 index 0000000..bcb0835 --- /dev/null +++ b/node_modules/luxon/build/node/luxon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"luxon.js","sources":["../../src/errors.js","../../src/impl/formats.js","../../src/zone.js","../../src/zones/systemZone.js","../../src/zones/IANAZone.js","../../src/impl/locale.js","../../src/zones/fixedOffsetZone.js","../../src/zones/invalidZone.js","../../src/impl/zoneUtil.js","../../src/impl/digits.js","../../src/settings.js","../../src/impl/invalid.js","../../src/impl/conversions.js","../../src/impl/util.js","../../src/impl/english.js","../../src/impl/formatter.js","../../src/impl/regexParser.js","../../src/duration.js","../../src/interval.js","../../src/info.js","../../src/impl/diff.js","../../src/impl/tokenParser.js","../../src/datetime.js","../../src/luxon.js"],"sourcesContent":["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n","const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n","export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n","import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n","/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n","import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n","import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n"],"names":["LuxonError","Error","InvalidDateTimeError","constructor","reason","toMessage","InvalidIntervalError","InvalidDurationError","ConflictingSpecificationError","InvalidUnitError","unit","InvalidArgumentError","ZoneIsAbstractError","n","s","l","DATE_SHORT","year","month","day","DATE_MED","DATE_MED_WITH_WEEKDAY","weekday","DATE_FULL","DATE_HUGE","TIME_SIMPLE","hour","minute","TIME_WITH_SECONDS","second","TIME_WITH_SHORT_OFFSET","timeZoneName","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","hourCycle","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","type","name","ianaName","isUniversal","offsetName","ts","opts","formatOffset","format","offset","equals","otherZone","isValid","singleton","SystemZone","instance","Intl","DateTimeFormat","resolvedOptions","timeZone","locale","parseZoneInfo","Date","getTimezoneOffset","dtfCache","Map","makeDTF","zoneName","dtf","get","undefined","hour12","era","set","typeToPos","hackyOffset","date","formatted","replace","parsed","exec","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","formatToParts","filled","i","length","value","pos","isUndefined","parseInt","ianaZoneCache","IANAZone","create","zone","resetCache","clear","isValidSpecifier","isValidZone","e","valid","NaN","isNaN","adOrBc","Math","abs","adjustedHour","asUTC","objToLocalTS","millisecond","asTS","over","intlLFCache","getCachedLF","locString","key","JSON","stringify","ListFormat","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","NumberFormat","intlRelCache","getCachedRTF","base","cacheKeyOpts","RelativeTimeFormat","sysLocaleCache","systemLocale","intlResolvedOptionsCache","getCachedIntResolvedOptions","weekInfoCache","getCachedWeekInfo","data","Locale","getWeekInfo","weekInfo","fallbackWeekSettings","parseLocaleString","localeStr","xIndex","indexOf","substring","uIndex","options","selectedStr","smaller","numberingSystem","calendar","intlConfigString","outputCalendar","includes","mapMonths","f","ms","dt","DateTime","utc","push","mapWeekdays","listStuff","loc","englishFn","intlFn","mode","listingMode","supportsFastNumbers","startsWith","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","Object","keys","intlOpts","useGrouping","minimumIntegerDigits","fixed","roundTo","padStart","PolyDateFormatter","originalZone","z","gmtOffset","offsetZ","setZone","plus","minutes","map","join","toJSDate","parts","part","PolyRelFormatter","isEnglish","style","hasRelative","rtf","count","English","numeric","firstDay","minimalDays","weekend","fromOpts","weekSettings","defaultToEN","specifiedLocale","Settings","defaultLocale","localeR","numberingSystemR","defaultNumberingSystem","outputCalendarR","defaultOutputCalendar","weekSettingsR","validateWeekSettings","defaultWeekSettings","fromObject","numbering","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","weekdaysCache","standalone","monthsCache","meridiemCache","eraCache","fastNumbersCached","fastNumbers","isActuallyEn","hasNoWeirdness","clone","alts","getOwnPropertyNames","redefaultToEN","redefaultToSystem","months","monthSpecialCase","formatStr","mapper","extract","dtFormatter","weekdays","meridiems","eras","field","df","results","matching","find","m","toLowerCase","numberFormatter","relFormatter","listFormatter","getWeekSettings","hasLocaleWeekInfo","getStartOfWeek","getMinDaysInFirstWeek","getWeekendDays","other","toString","FixedOffsetZone","utcInstance","parseSpecifier","r","match","signedOffset","InvalidZone","normalizeZone","input","defaultZone","isString","lowered","isNumber","numberingSystems","arab","arabext","bali","beng","deva","fullwide","gujr","hanidec","khmr","knda","laoo","limb","mlym","mong","mymr","orya","tamldec","telu","thai","tibt","latn","numberingSystemsUTF16","hanidecChars","split","parseDigits","str","code","charCodeAt","search","min","max","digitRegexCache","resetDigitRegexCache","digitRegex","append","ns","appendCache","regex","RegExp","now","twoDigitCutoffYear","throwOnInvalid","cutoffYear","t","resetCaches","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","d","UTC","setUTCFullYear","getUTCFullYear","js","getUTCDay","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","findIndex","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","usesLocalWeekValues","obj","hasLocaleWeekData","localWeekday","localWeekNumber","localWeekYear","hasIsoWeekData","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","validHour","validMinute","validSecond","validMillisecond","o","isDate","prototype","call","maybeArray","thing","Array","isArray","bestBy","arr","by","compare","reduce","best","next","pair","pick","a","k","hasOwnProperty","prop","settings","some","v","from","bottom","top","floorMod","x","isNeg","padded","parseInteger","string","parseFloating","parseFloat","parseMillis","fraction","number","digits","rounding","factor","ceil","trunc","round","RangeError","modMonth","modYear","firstWeekOffset","fwdlw","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","modified","offHourStr","offMinuteStr","offHour","Number","offMin","offMinSigned","is","asNumber","numericValue","isFinite","normalizeObject","normalizer","normalized","u","hours","sign","monthsLong","monthsShort","monthsNarrow","weekdaysLong","weekdaysShort","weekdaysNarrow","erasLong","erasShort","erasNarrow","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","narrow","units","years","quarters","weeks","days","seconds","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","token","literal","val","macroTokenToFormatOpts","D","Formats","DD","DDD","DDDD","tt","ttt","tttt","T","TT","TTT","TTTT","ff","fff","ffff","F","FF","FFF","FFFF","Formatter","parseFormat","fmt","current","currentFull","bracketed","c","charAt","test","formatOpts","systemLoc","formatWithSystemDefault","formatDateTime","formatDateTimeParts","formatInterval","interval","start","formatRange","end","num","p","signDisplay","formatDateTimeFromString","knownEnglish","useDateTimeFormatter","isOffsetFixed","allowZ","meridiem","maybeMacro","slice","quarter","formatDurationFromString","dur","invertLargest","signMode","tokenToField","lildur","info","mapped","inversionFactor","isNegativeDuration","largestUnit","tokens","realTokens","found","concat","collapsed","shiftTo","filter","durationInfo","values","ianaRegex","combineRegexes","regexes","full","source","combineExtractors","extractors","mergedVals","mergedZone","cursor","ex","parse","patterns","extractor","simpleParse","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","item","extractISOTime","milliseconds","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","force","obsOffsets","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","fromStrings","weekdayStr","result","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","trim","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","reverse","conf","conversionAccuracy","matrix","Duration","durationToMillis","vals","_vals$milliseconds","sum","normalizeValues","reduceRight","previous","previousVal","conv","rollUp","removeZeroes","newVals","entries","config","accurate","invalid","isLuxonDuration","fromMillis","normalizeUnit","fromDurationLike","durationLike","isDuration","fromISO","text","fromISOTime","week","toFormat","fmtOpts","toHuman","showZeros","unitDisplay","listStyle","toObject","toISO","toISOTime","millis","toMillis","suppressMilliseconds","suppressSeconds","includePrefix","includeOffset","dateTime","toJSON","Symbol","for","invalidReason","valueOf","duration","minus","negate","mapUnits","fn","mixed","reconfigure","as","normalize","rescale","shiftToAll","built","accumulated","lastUnit","own","ak","negated","removeZeros","invalidExplanation","eq","v1","v2","validateStartEnd","Interval","isLuxonInterval","fromDateTimes","builtStart","friendlyDateTime","builtEnd","validateError","after","before","startIsValid","endIsValid","isInterval","lastDateTime","toDuration","startOf","useLocaleWeeks","diff","hasSame","isEmpty","isAfter","isBefore","contains","splitAt","dateTimes","sorted","sort","b","added","splitBy","idx","divideEqually","numberOfParts","overlaps","abutsStart","abutsEnd","engulfs","intersection","union","merge","intervals","final","sofar","xor","currentCount","ends","time","flattened","difference","toLocaleString","toISODate","dateFormat","separator","mapEndpoints","mapFn","Info","hasDST","proto","isValidIANAZone","locObj","getMinimumDaysInFirstWeek","getWeekendWeekdays","monthsFormat","weekdaysFormat","features","relative","localeWeek","dayDiff","earlier","later","utcDayStart","toUTC","keepLocalTime","highOrderDiffs","differs","lowestOrder","highWater","differ","remainingMillis","lowerOrderUnits","MISSING_FTP","intUnit","post","deser","NBSP","String","fromCharCode","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","h","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","unitate","partTypeStyleToTokenVal","short","long","dayperiod","dayPeriod","hour24","tokenForPart","resolvedOpts","isSpace","actualType","buildRegex","re","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","Z","q","M","G","y","S","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","TokenParser","disqualifyingUnit","regexString","explainFromTokens","rawMatches","parser","parseFromTokens","formatter","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","localWeekData","inst","old","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objToTS","adjustTime","oPre","millisToAdd","parseDataToDateTime","parsedZone","interpretationZone","toTechFormat","extended","precision","longFormat","extendedZone","showSeconds","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","weeknumber","weeksnumber","weeknumbers","weekyear","weekyears","normalizeUnitWithLocalWeeks","guessOffsetForZone","zoneOffsetTs","offsetGuess","zoneOffsetGuessCache","quickDT","offsetProvis","diffRelative","calendary","lastOpts","argList","args","unchanged","ot","_zone","isLuxonDateTime","arguments","fromJSDate","zoneToUse","fromSeconds","tsNow","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","higherOrderInvalid","gregorian","tsFinal","offsetFinal","fromRFC2822","fromHTTP","fromFormat","localeToUse","fromString","fromSQL","isDateTime","parseFormatForOpts","localeOpts","tokenList","expandFormat","expanded","isWeekend","monthShort","monthLong","weekdayShort","weekdayLong","offsetNameShort","offsetNameLong","isInDST","getPossibleOffsets","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","isInLeapYear","weeksInLocalWeekYear","resolvedLocaleOptions","toLocal","keepCalendarTime","newTS","asObj","setLocale","settingWeekStuff","normalizedUnit","endOf","toLocaleParts","ext","toISOWeekDate","toRFC2822","toHTTP","toSQLDate","toSQLTime","includeZone","includeOffsetSpace","toSQL","toSeconds","toUnixInteger","toBSON","includeConfig","otherDateTime","durOpts","otherIsLater","diffed","diffNow","until","inputMs","adjustedToZone","toRelative","padding","toRelativeCalendar","every","fromFormatExplain","fromStringExplain","buildFormatParser","fromFormatParser","formatParser","dateTimeish","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/luxon/package.json b/node_modules/luxon/package.json new file mode 100644 index 0000000..f80269b --- /dev/null +++ b/node_modules/luxon/package.json @@ -0,0 +1,87 @@ +{ + "name": "luxon", + "version": "3.7.2", + "description": "Immutable date wrapper", + "author": "Isaac Cambron", + "keywords": [ + "date", + "immutable" + ], + "repository": "https://github.com/moment/luxon", + "exports": { + ".": { + "import": "./build/es6/luxon.mjs", + "require": "./build/node/luxon.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "build": "babel-node tasks/buildAll.js", + "build-node": "babel-node tasks/buildNode.js", + "build-global": "babel-node tasks/buildGlobal.js", + "jest": "jest", + "test": "jest --coverage", + "api-docs": "mkdir -p build && documentation build src/luxon.js -f html -o build/api-docs && sed -i.bak 's/<\\/body>/ +``` + +``` +// "lite" version + +``` + +## Quick Start + +For the full version (800+ MIME types, 1,000+ extensions): + +```javascript +const mime = require('mime'); + +mime.getType('txt'); // ⇨ 'text/plain' +mime.getExtension('text/plain'); // ⇨ 'txt' +``` + +See [Mime API](#mime-api) below for API details. + +## Lite Version + +The "lite" version of this module omits vendor-specific (`*/vnd.*`) and +experimental (`*/x-*`) types. It weighs in at ~2.5KB, compared to 8KB for the +full version. To load the lite version: + +```javascript +const mime = require('mime/lite'); +``` + +## Mime .vs. mime-types .vs. mime-db modules + +For those of you wondering about the difference between these [popular] NPM modules, +here's a brief rundown ... + +[`mime-db`](https://github.com/jshttp/mime-db) is "the source of +truth" for MIME type information. It is not an API. Rather, it is a canonical +dataset of mime type definitions pulled from IANA, Apache, NGINX, and custom mappings +submitted by the Node.js community. + +[`mime-types`](https://github.com/jshttp/mime-types) is a thin +wrapper around mime-db that provides an API drop-in compatible(ish) with `mime @ < v1.3.6` API. + +`mime` is, as of v2, a self-contained module bundled with a pre-optimized version +of the `mime-db` dataset. It provides a simplified API with the following characteristics: + +* Intelligently resolved type conflicts (See [mime-score](https://github.com/broofa/mime-score) for details) +* Method naming consistent with industry best-practices +* Compact footprint. E.g. The minified+compressed sizes of the various modules: + +Module | Size +--- | --- +`mime-db` | 18 KB +`mime-types` | same as mime-db +`mime` | 8 KB +`mime/lite` | 2 KB + +## Mime API + +Both `require('mime')` and `require('mime/lite')` return instances of the MIME +class, documented below. + +Note: Inputs to this API are case-insensitive. Outputs (returned values) will +be lowercase. + +### new Mime(typeMap, ... more maps) + +Most users of this module will not need to create Mime instances directly. +However if you would like to create custom mappings, you may do so as follows +... + +```javascript +// Require Mime class +const Mime = require('mime/Mime'); + +// Define mime type -> extensions map +const typeMap = { + 'text/abc': ['abc', 'alpha', 'bet'], + 'text/def': ['leppard'] +}; + +// Create and use Mime instance +const myMime = new Mime(typeMap); +myMime.getType('abc'); // ⇨ 'text/abc' +myMime.getExtension('text/def'); // ⇨ 'leppard' +``` + +If more than one map argument is provided, each map is `define()`ed (see below), in order. + +### mime.getType(pathOrExtension) + +Get mime type for the given path or extension. E.g. + +```javascript +mime.getType('js'); // ⇨ 'application/javascript' +mime.getType('json'); // ⇨ 'application/json' + +mime.getType('txt'); // ⇨ 'text/plain' +mime.getType('dir/text.txt'); // ⇨ 'text/plain' +mime.getType('dir\\text.txt'); // ⇨ 'text/plain' +mime.getType('.text.txt'); // ⇨ 'text/plain' +mime.getType('.txt'); // ⇨ 'text/plain' +``` + +`null` is returned in cases where an extension is not detected or recognized + +```javascript +mime.getType('foo/txt'); // ⇨ null +mime.getType('bogus_type'); // ⇨ null +``` + +### mime.getExtension(type) +Get extension for the given mime type. Charset options (often included in +Content-Type headers) are ignored. + +```javascript +mime.getExtension('text/plain'); // ⇨ 'txt' +mime.getExtension('application/json'); // ⇨ 'json' +mime.getExtension('text/html; charset=utf8'); // ⇨ 'html' +``` + +### mime.define(typeMap[, force = false]) + +Define [more] type mappings. + +`typeMap` is a map of type -> extensions, as documented in `new Mime`, above. + +By default this method will throw an error if you try to map a type to an +extension that is already assigned to another type. Passing `true` for the +`force` argument will suppress this behavior (overriding any previous mapping). + +```javascript +mime.define({'text/x-abc': ['abc', 'abcd']}); + +mime.getType('abcd'); // ⇨ 'text/x-abc' +mime.getExtension('text/x-abc') // ⇨ 'abc' +``` + +## Command Line + + mime [path_or_extension] + +E.g. + + > mime scripts/jquery.js + application/javascript + +---- +Markdown generated from [src/README_js.md](src/README_js.md) by [![RunMD Logo](http://i.imgur.com/h0FVyzU.png)](https://github.com/broofa/runmd) \ No newline at end of file diff --git a/node_modules/mime/cli.js b/node_modules/mime/cli.js new file mode 100755 index 0000000..ab70a49 --- /dev/null +++ b/node_modules/mime/cli.js @@ -0,0 +1,46 @@ +#!/usr/bin/env node + +'use strict'; + +process.title = 'mime'; +let mime = require('.'); +let pkg = require('./package.json'); +let args = process.argv.splice(2); + +if (args.includes('--version') || args.includes('-v') || args.includes('--v')) { + console.log(pkg.version); + process.exit(0); +} else if (args.includes('--name') || args.includes('-n') || args.includes('--n')) { + console.log(pkg.name); + process.exit(0); +} else if (args.includes('--help') || args.includes('-h') || args.includes('--h')) { + console.log(pkg.name + ' - ' + pkg.description + '\n'); + console.log(`Usage: + + mime [flags] [path_or_extension] + + Flags: + --help, -h Show this message + --version, -v Display the version + --name, -n Print the name of the program + + Note: the command will exit after it executes if a command is specified + The path_or_extension is the path to the file or the extension of the file. + + Examples: + mime --help + mime --version + mime --name + mime -v + mime src/log.js + mime new.py + mime foo.sh + `); + process.exit(0); +} + +let file = args[0]; +let type = mime.getType(file); + +process.stdout.write(type + '\n'); + diff --git a/node_modules/mime/index.js b/node_modules/mime/index.js new file mode 100644 index 0000000..fadcf8d --- /dev/null +++ b/node_modules/mime/index.js @@ -0,0 +1,4 @@ +'use strict'; + +let Mime = require('./Mime'); +module.exports = new Mime(require('./types/standard'), require('./types/other')); diff --git a/node_modules/mime/lite.js b/node_modules/mime/lite.js new file mode 100644 index 0000000..835cffb --- /dev/null +++ b/node_modules/mime/lite.js @@ -0,0 +1,4 @@ +'use strict'; + +let Mime = require('./Mime'); +module.exports = new Mime(require('./types/standard')); diff --git a/node_modules/mime/package.json b/node_modules/mime/package.json new file mode 100644 index 0000000..84f5132 --- /dev/null +++ b/node_modules/mime/package.json @@ -0,0 +1,52 @@ +{ + "author": { + "name": "Robert Kieffer", + "url": "http://github.com/broofa", + "email": "robert@broofa.com" + }, + "engines": { + "node": ">=10.0.0" + }, + "bin": { + "mime": "cli.js" + }, + "contributors": [], + "description": "A comprehensive library for mime-type mapping", + "license": "MIT", + "dependencies": {}, + "devDependencies": { + "benchmark": "*", + "chalk": "4.1.2", + "eslint": "8.1.0", + "mime-db": "1.50.0", + "mime-score": "1.2.0", + "mime-types": "2.1.33", + "mocha": "9.1.3", + "runmd": "*", + "standard-version": "9.3.2" + }, + "files": [ + "index.js", + "lite.js", + "Mime.js", + "cli.js", + "/types" + ], + "scripts": { + "prepare": "node src/build.js && runmd --output README.md src/README_js.md", + "release": "standard-version", + "benchmark": "node src/benchmark.js", + "md": "runmd --watch --output README.md src/README_js.md", + "test": "mocha src/test.js" + }, + "keywords": [ + "util", + "mime" + ], + "name": "mime", + "repository": { + "url": "https://github.com/broofa/mime", + "type": "git" + }, + "version": "3.0.0" +} diff --git a/node_modules/mime/types/other.js b/node_modules/mime/types/other.js new file mode 100644 index 0000000..bb6a035 --- /dev/null +++ b/node_modules/mime/types/other.js @@ -0,0 +1 @@ +module.exports = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.sap.vds":["vds"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}; \ No newline at end of file diff --git a/node_modules/mime/types/standard.js b/node_modules/mime/types/standard.js new file mode 100644 index 0000000..5ee9937 --- /dev/null +++ b/node_modules/mime/types/standard.js @@ -0,0 +1 @@ +module.exports = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["es","ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avif":["avif"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]}; \ No newline at end of file diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/minimatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, 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/minimatch/README.md b/node_modules/minimatch/README.md new file mode 100644 index 0000000..60d8850 --- /dev/null +++ b/node_modules/minimatch/README.md @@ -0,0 +1,267 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://travis-ci.org/isaacs/minimatch.svg?branch=master)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Important Security Consideration! + +> [!WARNING] +> This library uses JavaScript regular expressions. Please read +> the following warning carefully, and be thoughtful about what +> you provide to this library in production systems. + +_Any_ library in JavaScript that deals with matching string +patterns using regular expressions will be subject to +[ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) +if the pattern is generated using untrusted input. + +Efforts have been made to mitigate risk as much as is feasible in +such a library, providing maximum recursion depths and so forth, +but these measures can only ultimately protect against accidents, +not malice. A dedicated attacker can _always_ find patterns that +cannot be defended against by a bash-compatible glob pattern +matching system that uses JavaScript regular expressions. + +To be extremely clear: + +> [!WARNING] +> **If you create a system where you take user input, and use +> that input as the source of a Regular Expression pattern, in +> this or any extant glob matcher in JavaScript, you will be +> pwned.** + +A future version of this library _may_ use a different matching +algorithm which does not exhibit backtracking problems. If and +when that happens, it will likely be a sweeping change, and those +improvements will **not** be backported to legacy versions. + +In the near term, it is not reasonable to continue to play +whack-a-mole with security advisories, and so any future ReDoS +reports will be considered "working as intended", and resolved +entirely by this warning. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instantiating the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself if this option is set. When not set, an empty list +is returned if there are no matches. + +### matchBase + +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`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + +### partial + +Compare a partial path to a pattern. As long as the parts of the path that +are present are not contradicted by the pattern, it will be treated as a +match. This is useful in applications where you're walking through a +folder structure, and don't yet have the full path, but want to ensure that +you do not walk down paths that can never be a match. + +For example, + +```js +minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d +minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d +minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a +``` + +### allowWindowsEscape + +Windows path separator `\` is by default converted to `/`, which +prohibits the usage of `\` as a escape character. This flag skips that +behavior and allows using the escape character. + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. diff --git a/node_modules/minimatch/minimatch.js b/node_modules/minimatch/minimatch.js new file mode 100644 index 0000000..2e4a058 --- /dev/null +++ b/node_modules/minimatch/minimatch.js @@ -0,0 +1,1005 @@ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = (function () { try { return require('path') } catch (e) {}}()) || { + sep: '/' +} +minimatch.sep = path.sep + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + b = b || {} + var t = {} + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || typeof def !== 'object' || !Object.keys(def).length) { + return minimatch + } + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + m.Minimatch.defaults = function defaults (options) { + return orig.defaults(ext(def, options)).Minimatch + } + + m.filter = function filter (pattern, options) { + return orig.filter(pattern, ext(def, options)) + } + + m.defaults = function defaults (options) { + return orig.defaults(ext(def, options)) + } + + m.makeRe = function makeRe (pattern, options) { + return orig.makeRe(pattern, ext(def, options)) + } + + m.braceExpand = function braceExpand (pattern, options) { + return orig.braceExpand(pattern, ext(def, options)) + } + + m.match = function (list, pattern, options) { + return orig.match(list, pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + assertValidPattern(pattern) + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + assertValidPattern(pattern) + + if (!options) options = {} + + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (!options.allowWindowsEscape && path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.maxGlobstarRecursion = options.maxGlobstarRecursion !== undefined + ? options.maxGlobstarRecursion : 200 + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + this.partial = !!options.partial + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) } + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + assertValidPattern(pattern) + + // Thanks to Yeting Li for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +var MAX_PATTERN_LENGTH = 1024 * 64 +var assertValidPattern = function (pattern) { + if (typeof pattern !== 'string') { + throw new TypeError('invalid pattern') + } + + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError('pattern is too long') + } +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + assertValidPattern(pattern) + + var options = this.options + + // shortcuts + if (pattern === '**') { + if (!options.noglobstar) + return GLOBSTAR + else + pattern = '*' + } + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + /* istanbul ignore next */ + case '/': { + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + } + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // coalesce consecutive non-globstar * characters + if (c === '*' && stateChar === '*') continue + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '[': case '.': case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) /* istanbul ignore next - should be impossible */ { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) /* istanbul ignore next - should be impossible */ { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = function match (f, partial) { + if (typeof partial === 'undefined') partial = this.partial + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + if (pattern.indexOf(GLOBSTAR) !== -1) { + return this._matchGlobstar(file, pattern, partial, 0, 0) + } + return this._matchOne(file, pattern, partial, 0, 0) +} + +Minimatch.prototype._matchGlobstar = function (file, pattern, partial, fileIndex, patternIndex) { + var i + + // find first globstar from patternIndex + var firstgs = -1 + for (i = patternIndex; i < pattern.length; i++) { + if (pattern[i] === GLOBSTAR) { firstgs = i; break } + } + + // find last globstar + var lastgs = -1 + for (i = pattern.length - 1; i >= 0; i--) { + if (pattern[i] === GLOBSTAR) { lastgs = i; break } + } + + var head = pattern.slice(patternIndex, firstgs) + var body = partial ? pattern.slice(firstgs + 1) : pattern.slice(firstgs + 1, lastgs) + var tail = partial ? [] : pattern.slice(lastgs + 1) + + // check the head + if (head.length) { + var fileHead = file.slice(fileIndex, fileIndex + head.length) + if (!this._matchOne(fileHead, head, partial, 0, 0)) { + return false + } + fileIndex += head.length + } + + // check the tail + var fileTailMatch = 0 + if (tail.length) { + if (tail.length + fileIndex > file.length) return false + + var tailStart = file.length - tail.length + if (this._matchOne(file, tail, partial, tailStart, 0)) { + fileTailMatch = tail.length + } else { + // affordance for stuff like a/**/* matching a/b/ + if (file[file.length - 1] !== '' || + fileIndex + tail.length === file.length) { + return false + } + tailStart-- + if (!this._matchOne(file, tail, partial, tailStart, 0)) { + return false + } + fileTailMatch = tail.length + 1 + } + } + + // if body is empty (single ** between head and tail) + if (!body.length) { + var sawSome = !!fileTailMatch + for (i = fileIndex; i < file.length - fileTailMatch; i++) { + var f = String(file[i]) + sawSome = true + if (f === '.' || f === '..' || + (!this.options.dot && f.charAt(0) === '.')) { + return false + } + } + return partial || sawSome + } + + // split body into segments at each GLOBSTAR + var bodySegments = [[[], 0]] + var currentBody = bodySegments[0] + var nonGsParts = 0 + var nonGsPartsSums = [0] + for (var bi = 0; bi < body.length; bi++) { + var b = body[bi] + if (b === GLOBSTAR) { + nonGsPartsSums.push(nonGsParts) + currentBody = [[], 0] + bodySegments.push(currentBody) + } else { + currentBody[0].push(b) + nonGsParts++ + } + } + + var idx = bodySegments.length - 1 + var fileLength = file.length - fileTailMatch + for (var si = 0; si < bodySegments.length; si++) { + bodySegments[si][1] = fileLength - + (nonGsPartsSums[idx--] + bodySegments[si][0].length) + } + + return !!this._matchGlobStarBodySections( + file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch + ) +} + +// return false for "nope, not matching" +// return null for "not matching, cannot keep trying" +Minimatch.prototype._matchGlobStarBodySections = function ( + file, bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail +) { + var bs = bodySegments[bodyIndex] + if (!bs) { + // just make sure there are no bad dots + for (var i = fileIndex; i < file.length; i++) { + sawTail = true + var f = file[i] + if (f === '.' || f === '..' || + (!this.options.dot && f.charAt(0) === '.')) { + return false + } + } + return sawTail + } + + var body = bs[0] + var after = bs[1] + while (fileIndex <= after) { + var m = this._matchOne( + file.slice(0, fileIndex + body.length), + body, + partial, + fileIndex, + 0 + ) + // if limit exceeded, no match. intentional false negative, + // acceptable break in correctness for security. + if (m && globStarDepth < this.maxGlobstarRecursion) { + var sub = this._matchGlobStarBodySections( + file, bodySegments, + fileIndex + body.length, bodyIndex + 1, + partial, globStarDepth + 1, sawTail + ) + if (sub !== false) { + return sub + } + } + var f = file[fileIndex] + if (f === '.' || f === '..' || + (!this.options.dot && f.charAt(0) === '.')) { + return false + } + fileIndex++ + } + return partial || null +} + +Minimatch.prototype._matchOne = function (file, pattern, partial, fileIndex, patternIndex) { + var fi, pi, fl, pl + for ( + fi = fileIndex, pi = patternIndex, fl = file.length, pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++ + ) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + /* istanbul ignore if */ + if (p === false || p === GLOBSTAR) return false + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + hit = f === p + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else /* istanbul ignore else */ if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + return (fi === fl - 1) && (file[fi] === '') + } + + // should be unreachable. + /* istanbul ignore next */ + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json new file mode 100644 index 0000000..563d218 --- /dev/null +++ b/node_modules/minimatch/package.json @@ -0,0 +1,33 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me)", + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "3.1.5", + "publishConfig": { + "tag": "legacy-v3" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "devDependencies": { + "tap": "^15.1.6" + }, + "license": "ISC", + "files": [ + "minimatch.js" + ] +} diff --git a/node_modules/minimist/.eslintrc b/node_modules/minimist/.eslintrc new file mode 100644 index 0000000..bd1a5e0 --- /dev/null +++ b/node_modules/minimist/.eslintrc @@ -0,0 +1,29 @@ +{ + "root": true, + + "extends": "@ljharb/eslint-config/node/0.4", + + "rules": { + "array-element-newline": 0, + "complexity": 0, + "func-style": [2, "declaration"], + "max-lines-per-function": 0, + "max-nested-callbacks": 1, + "max-statements-per-line": 1, + "max-statements": 0, + "multiline-comment-style": 0, + "no-continue": 1, + "no-param-reassign": 1, + "no-restricted-syntax": 1, + "object-curly-newline": 0, + }, + + "overrides": [ + { + "files": "test/**", + "rules": { + "camelcase": 0, + }, + }, + ] +} diff --git a/node_modules/minimist/.github/FUNDING.yml b/node_modules/minimist/.github/FUNDING.yml new file mode 100644 index 0000000..a936622 --- /dev/null +++ b/node_modules/minimist/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [ljharb] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: npm/minimist +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/node_modules/minimist/.nycrc b/node_modules/minimist/.nycrc new file mode 100644 index 0000000..55c3d29 --- /dev/null +++ b/node_modules/minimist/.nycrc @@ -0,0 +1,14 @@ +{ + "all": true, + "check-coverage": false, + "reporter": ["text-summary", "text", "html", "json"], + "lines": 86, + "statements": 85.93, + "functions": 82.43, + "branches": 76.06, + "exclude": [ + "coverage", + "example", + "test" + ] +} diff --git a/node_modules/minimist/CHANGELOG.md b/node_modules/minimist/CHANGELOG.md new file mode 100644 index 0000000..c9a1e15 --- /dev/null +++ b/node_modules/minimist/CHANGELOG.md @@ -0,0 +1,298 @@ +# 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). + +## [v1.2.8](https://github.com/minimistjs/minimist/compare/v1.2.7...v1.2.8) - 2023-02-09 + +### Merged + +- [Fix] Fix long option followed by single dash [`#17`](https://github.com/minimistjs/minimist/pull/17) +- [Tests] Remove duplicate test [`#12`](https://github.com/minimistjs/minimist/pull/12) +- [Fix] opt.string works with multiple aliases [`#10`](https://github.com/minimistjs/minimist/pull/10) + +### Fixed + +- [Fix] Fix long option followed by single dash (#17) [`#15`](https://github.com/minimistjs/minimist/issues/15) +- [Tests] Remove duplicate test (#12) [`#8`](https://github.com/minimistjs/minimist/issues/8) +- [Fix] Fix long option followed by single dash [`#15`](https://github.com/minimistjs/minimist/issues/15) +- [Fix] opt.string works with multiple aliases (#10) [`#9`](https://github.com/minimistjs/minimist/issues/9) +- [Fix] Fix handling of short option with non-trivial equals [`#5`](https://github.com/minimistjs/minimist/issues/5) +- [Tests] Remove duplicate test [`#8`](https://github.com/minimistjs/minimist/issues/8) +- [Fix] opt.string works with multiple aliases [`#9`](https://github.com/minimistjs/minimist/issues/9) + +### Commits + +- Merge tag 'v0.2.3' [`a026794`](https://github.com/minimistjs/minimist/commit/a0267947c7870fc5847cf2d437fbe33f392767da) +- [eslint] fix indentation and whitespace [`5368ca4`](https://github.com/minimistjs/minimist/commit/5368ca4147e974138a54cc0dc4cea8f756546b70) +- [eslint] fix indentation and whitespace [`e5f5067`](https://github.com/minimistjs/minimist/commit/e5f5067259ceeaf0b098d14bec910f87e58708c7) +- [eslint] more cleanup [`62fde7d`](https://github.com/minimistjs/minimist/commit/62fde7d935f83417fb046741531a9e2346a36976) +- [eslint] more cleanup [`36ac5d0`](https://github.com/minimistjs/minimist/commit/36ac5d0d95e4947d074e5737d94814034ca335d1) +- [meta] add `auto-changelog` [`73923d2`](https://github.com/minimistjs/minimist/commit/73923d223553fca08b1ba77e3fbc2a492862ae4c) +- [actions] add reusable workflows [`d80727d`](https://github.com/minimistjs/minimist/commit/d80727df77bfa9e631044d7f16368d8f09242c91) +- [eslint] add eslint; rules to enable later are warnings [`48bc06a`](https://github.com/minimistjs/minimist/commit/48bc06a1b41f00e9cdf183db34f7a51ba70e98d4) +- [eslint] fix indentation [`34b0f1c`](https://github.com/minimistjs/minimist/commit/34b0f1ccaa45183c3c4f06a91f9b405180a6f982) +- [readme] rename and add badges [`5df0fe4`](https://github.com/minimistjs/minimist/commit/5df0fe49211bd09a3636f8686a7cb3012c3e98f0) +- [Dev Deps] switch from `covert` to `nyc` [`a48b128`](https://github.com/minimistjs/minimist/commit/a48b128fdb8d427dfb20a15273f83e38d97bef07) +- [Dev Deps] update `covert`, `tape`; remove unnecessary `tap` [`f0fb958`](https://github.com/minimistjs/minimist/commit/f0fb958e9a1fe980cdffc436a211b0bda58f621b) +- [meta] create FUNDING.yml; add `funding` in package.json [`3639e0c`](https://github.com/minimistjs/minimist/commit/3639e0c819359a366387e425ab6eabf4c78d3caa) +- [meta] use `npmignore` to autogenerate an npmignore file [`be2e038`](https://github.com/minimistjs/minimist/commit/be2e038c342d8333b32f0fde67a0026b79c8150e) +- Only apps should have lockfiles [`282b570`](https://github.com/minimistjs/minimist/commit/282b570e7489d01b03f2d6d3dabf79cd3e5f84cf) +- isConstructorOrProto adapted from PR [`ef9153f`](https://github.com/minimistjs/minimist/commit/ef9153fc52b6cea0744b2239921c5dcae4697f11) +- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`098873c`](https://github.com/minimistjs/minimist/commit/098873c213cdb7c92e55ae1ef5aa1af3a8192a79) +- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`3124ed3`](https://github.com/minimistjs/minimist/commit/3124ed3e46306301ebb3c834874ce0241555c2c4) +- [meta] add `safe-publish-latest` [`4b927de`](https://github.com/minimistjs/minimist/commit/4b927de696d561c636b4f43bf49d4597cb36d6d6) +- [Tests] add `aud` in `posttest` [`b32d9bd`](https://github.com/minimistjs/minimist/commit/b32d9bd0ab340f4e9f8c3a97ff2a4424f25fab8c) +- [meta] update repo URLs [`f9fdfc0`](https://github.com/minimistjs/minimist/commit/f9fdfc032c54884d9a9996a390c63cd0719bbe1a) +- [actions] Avoid 0.6 tests due to build failures [`ba92fe6`](https://github.com/minimistjs/minimist/commit/ba92fe6ebbdc0431cca9a2ea8f27beb492f5e4ec) +- [Dev Deps] update `tape` [`950eaa7`](https://github.com/minimistjs/minimist/commit/950eaa74f112e04d23e9c606c67472c46739b473) +- [Dev Deps] add missing `npmignore` dev dep [`3226afa`](https://github.com/minimistjs/minimist/commit/3226afaf09e9d127ca369742437fe6e88f752d6b) +- Merge tag 'v0.2.2' [`980d7ac`](https://github.com/minimistjs/minimist/commit/980d7ac61a0b4bd552711251ac107d506b23e41f) + +## [v1.2.7](https://github.com/minimistjs/minimist/compare/v1.2.6...v1.2.7) - 2022-10-10 + +### Commits + +- [meta] add `auto-changelog` [`0ebf4eb`](https://github.com/minimistjs/minimist/commit/0ebf4ebcd5f7787a5524d31a849ef41316b83c3c) +- [actions] add reusable workflows [`e115b63`](https://github.com/minimistjs/minimist/commit/e115b63fa9d3909f33b00a2db647ff79068388de) +- [eslint] add eslint; rules to enable later are warnings [`f58745b`](https://github.com/minimistjs/minimist/commit/f58745b9bb84348e1be72af7dbba5840c7c13013) +- [Dev Deps] switch from `covert` to `nyc` [`ab03356`](https://github.com/minimistjs/minimist/commit/ab033567b9c8b31117cb026dc7f1e592ce455c65) +- [readme] rename and add badges [`236f4a0`](https://github.com/minimistjs/minimist/commit/236f4a07e4ebe5ee44f1496ec6974991ab293ffd) +- [meta] create FUNDING.yml; add `funding` in package.json [`783a49b`](https://github.com/minimistjs/minimist/commit/783a49bfd47e8335d3098a8cac75662cf71eb32a) +- [meta] use `npmignore` to autogenerate an npmignore file [`f81ece6`](https://github.com/minimistjs/minimist/commit/f81ece6aaec2fa14e69ff4f1e0407a8c4e2635a2) +- Only apps should have lockfiles [`56cad44`](https://github.com/minimistjs/minimist/commit/56cad44c7f879b9bb5ec18fcc349308024a89bfc) +- [Dev Deps] update `covert`, `tape`; remove unnecessary `tap` [`49c5f9f`](https://github.com/minimistjs/minimist/commit/49c5f9fb7e6a92db9eb340cc679de92fb3aacded) +- [Tests] add `aud` in `posttest` [`228ae93`](https://github.com/minimistjs/minimist/commit/228ae938f3cd9db9dfd8bd7458b076a7b2aef280) +- [meta] add `safe-publish-latest` [`01fc23f`](https://github.com/minimistjs/minimist/commit/01fc23f5104f85c75059972e01dd33796ab529ff) +- [meta] update repo URLs [`6b164c7`](https://github.com/minimistjs/minimist/commit/6b164c7d68e0b6bf32f894699effdfb7c63041dd) + +## [v1.2.6](https://github.com/minimistjs/minimist/compare/v1.2.5...v1.2.6) - 2022-03-21 + +### Commits + +- test from prototype pollution PR [`bc8ecee`](https://github.com/minimistjs/minimist/commit/bc8ecee43875261f4f17eb20b1243d3ed15e70eb) +- isConstructorOrProto adapted from PR [`c2b9819`](https://github.com/minimistjs/minimist/commit/c2b981977fa834b223b408cfb860f933c9811e4d) +- security notice for additional prototype pollution issue [`ef88b93`](https://github.com/minimistjs/minimist/commit/ef88b9325f77b5ee643ccfc97e2ebda577e4c4e2) + +## [v1.2.5](https://github.com/minimistjs/minimist/compare/v1.2.4...v1.2.5) - 2020-03-12 + +## [v1.2.4](https://github.com/minimistjs/minimist/compare/v1.2.3...v1.2.4) - 2020-03-11 + +### Commits + +- security notice [`4cf1354`](https://github.com/minimistjs/minimist/commit/4cf1354839cb972e38496d35e12f806eea92c11f) +- additional test for constructor prototype pollution [`1043d21`](https://github.com/minimistjs/minimist/commit/1043d212c3caaf871966e710f52cfdf02f9eea4b) + +## [v1.2.3](https://github.com/minimistjs/minimist/compare/v1.2.2...v1.2.3) - 2020-03-10 + +### Commits + +- more failing proto pollution tests [`13c01a5`](https://github.com/minimistjs/minimist/commit/13c01a5327736903704984b7f65616b8476850cc) +- even more aggressive checks for protocol pollution [`38a4d1c`](https://github.com/minimistjs/minimist/commit/38a4d1caead72ef99e824bb420a2528eec03d9ab) + +## [v1.2.2](https://github.com/minimistjs/minimist/compare/v1.2.1...v1.2.2) - 2020-03-10 + +### Commits + +- failing test for protocol pollution [`0efed03`](https://github.com/minimistjs/minimist/commit/0efed0340ec8433638758f7ca0c77cb20a0bfbab) +- cleanup [`67d3722`](https://github.com/minimistjs/minimist/commit/67d3722413448d00a62963d2d30c34656a92d7e2) +- console.dir -> console.log [`47acf72`](https://github.com/minimistjs/minimist/commit/47acf72c715a630bf9ea013867f47f1dd69dfc54) +- don't assign onto __proto__ [`63e7ed0`](https://github.com/minimistjs/minimist/commit/63e7ed05aa4b1889ec2f3b196426db4500cbda94) + +## [v1.2.1](https://github.com/minimistjs/minimist/compare/v1.2.0...v1.2.1) - 2020-03-10 + +### Merged + +- move the `opts['--']` example back where it belongs [`#63`](https://github.com/minimistjs/minimist/pull/63) + +### Commits + +- add test [`6be5dae`](https://github.com/minimistjs/minimist/commit/6be5dae35a32a987bcf4137fcd6c19c5200ee909) +- fix bad boolean regexp [`ac3fc79`](https://github.com/minimistjs/minimist/commit/ac3fc796e63b95128fdbdf67ea7fad71bd59aa76) + +## [v1.2.0](https://github.com/minimistjs/minimist/compare/v1.1.3...v1.2.0) - 2015-08-24 + +### Commits + +- failing -k=v short test [`63416b8`](https://github.com/minimistjs/minimist/commit/63416b8cd1d0d70e4714564cce465a36e4dd26d7) +- kv short fix [`6bbe145`](https://github.com/minimistjs/minimist/commit/6bbe14529166245e86424f220a2321442fe88dc3) +- failing kv short test [`f72ab7f`](https://github.com/minimistjs/minimist/commit/f72ab7f4572adc52902c9b6873cc969192f01b10) +- fixed kv test [`f5a48c3`](https://github.com/minimistjs/minimist/commit/f5a48c3e50e40ca54f00c8e84de4b4d6e9897fa8) +- enforce space between arg key and value [`86b321a`](https://github.com/minimistjs/minimist/commit/86b321affe648a8e016c095a4f0efa9d9074f502) + +## [v1.1.3](https://github.com/minimistjs/minimist/compare/v1.1.2...v1.1.3) - 2015-08-06 + +### Commits + +- add failing test - boolean alias array [`0fa3c5b`](https://github.com/minimistjs/minimist/commit/0fa3c5b3dd98551ddecf5392831b4c21211743fc) +- fix boolean values with multiple aliases [`9c0a6e7`](https://github.com/minimistjs/minimist/commit/9c0a6e7de25a273b11bbf9a7464f0bd833779795) + +## [v1.1.2](https://github.com/minimistjs/minimist/compare/v1.1.1...v1.1.2) - 2015-07-22 + +### Commits + +- Convert boolean arguments to boolean values [`8f3dc27`](https://github.com/minimistjs/minimist/commit/8f3dc27cf833f1d54671b6d0bcb55c2fe19672a9) +- use non-ancient npm, node 0.12 and iojs [`61ed1d0`](https://github.com/minimistjs/minimist/commit/61ed1d034b9ec7282764ce76f3992b1a0b4906ae) +- an older npm for 0.8 [`25cf778`](https://github.com/minimistjs/minimist/commit/25cf778b1220e7838a526832ad6972f75244054f) + +## [v1.1.1](https://github.com/minimistjs/minimist/compare/v1.1.0...v1.1.1) - 2015-03-10 + +### Commits + +- check that they type of a value is a boolean, not just that it is currently set to a boolean [`6863198`](https://github.com/minimistjs/minimist/commit/6863198e36139830ff1f20ffdceaddd93f2c1db9) +- upgrade tape, fix type issues from old tape version [`806712d`](https://github.com/minimistjs/minimist/commit/806712df91604ed02b8e39aa372b84aea659ee34) +- test for setting a boolean to a null default [`8c444fe`](https://github.com/minimistjs/minimist/commit/8c444fe89384ded7d441c120915ea60620b01dd3) +- if the previous value was a boolean, without an default (or with an alias) don't make an array either [`e5f419a`](https://github.com/minimistjs/minimist/commit/e5f419a3b5b3bc3f9e5ac71b7040621af70ed2dd) + +## [v1.1.0](https://github.com/minimistjs/minimist/compare/v1.0.0...v1.1.0) - 2014-08-10 + +### Commits + +- add support for handling "unknown" options not registered with the parser. [`6f3cc5d`](https://github.com/minimistjs/minimist/commit/6f3cc5d4e84524932a6ef2ce3592acc67cdd4383) +- reformat package.json [`02ed371`](https://github.com/minimistjs/minimist/commit/02ed37115194d3697ff358e8e25e5e66bab1d9f8) +- coverage script [`e5531ba`](https://github.com/minimistjs/minimist/commit/e5531ba0479da3b8138d3d8cac545d84ccb1c8df) +- extra fn to get 100% coverage again [`a6972da`](https://github.com/minimistjs/minimist/commit/a6972da89e56bf77642f8ec05a13b6558db93498) + +## [v1.0.0](https://github.com/minimistjs/minimist/compare/v0.2.3...v1.0.0) - 2014-08-10 + +### Commits + +- added stopEarly option [`471c7e4`](https://github.com/minimistjs/minimist/commit/471c7e4a7e910fc7ad8f9df850a186daf32c64e9) +- fix list [`fef6ae7`](https://github.com/minimistjs/minimist/commit/fef6ae79c38b9dc1c49569abb7cd04eb965eac5e) + +## [v0.2.3](https://github.com/minimistjs/minimist/compare/v0.2.2...v0.2.3) - 2023-02-09 + +### Merged + +- [Fix] Fix long option followed by single dash [`#17`](https://github.com/minimistjs/minimist/pull/17) +- [Tests] Remove duplicate test [`#12`](https://github.com/minimistjs/minimist/pull/12) +- [Fix] opt.string works with multiple aliases [`#10`](https://github.com/minimistjs/minimist/pull/10) + +### Fixed + +- [Fix] Fix long option followed by single dash (#17) [`#15`](https://github.com/minimistjs/minimist/issues/15) +- [Tests] Remove duplicate test (#12) [`#8`](https://github.com/minimistjs/minimist/issues/8) +- [Fix] opt.string works with multiple aliases (#10) [`#9`](https://github.com/minimistjs/minimist/issues/9) + +### Commits + +- [eslint] fix indentation and whitespace [`e5f5067`](https://github.com/minimistjs/minimist/commit/e5f5067259ceeaf0b098d14bec910f87e58708c7) +- [eslint] more cleanup [`36ac5d0`](https://github.com/minimistjs/minimist/commit/36ac5d0d95e4947d074e5737d94814034ca335d1) +- [eslint] fix indentation [`34b0f1c`](https://github.com/minimistjs/minimist/commit/34b0f1ccaa45183c3c4f06a91f9b405180a6f982) +- isConstructorOrProto adapted from PR [`ef9153f`](https://github.com/minimistjs/minimist/commit/ef9153fc52b6cea0744b2239921c5dcae4697f11) +- [Dev Deps] update `@ljharb/eslint-config`, `aud` [`098873c`](https://github.com/minimistjs/minimist/commit/098873c213cdb7c92e55ae1ef5aa1af3a8192a79) +- [Dev Deps] add missing `npmignore` dev dep [`3226afa`](https://github.com/minimistjs/minimist/commit/3226afaf09e9d127ca369742437fe6e88f752d6b) + +## [v0.2.2](https://github.com/minimistjs/minimist/compare/v0.2.1...v0.2.2) - 2022-10-10 + +### Commits + +- [meta] add `auto-changelog` [`73923d2`](https://github.com/minimistjs/minimist/commit/73923d223553fca08b1ba77e3fbc2a492862ae4c) +- [actions] add reusable workflows [`d80727d`](https://github.com/minimistjs/minimist/commit/d80727df77bfa9e631044d7f16368d8f09242c91) +- [eslint] add eslint; rules to enable later are warnings [`48bc06a`](https://github.com/minimistjs/minimist/commit/48bc06a1b41f00e9cdf183db34f7a51ba70e98d4) +- [readme] rename and add badges [`5df0fe4`](https://github.com/minimistjs/minimist/commit/5df0fe49211bd09a3636f8686a7cb3012c3e98f0) +- [Dev Deps] switch from `covert` to `nyc` [`a48b128`](https://github.com/minimistjs/minimist/commit/a48b128fdb8d427dfb20a15273f83e38d97bef07) +- [Dev Deps] update `covert`, `tape`; remove unnecessary `tap` [`f0fb958`](https://github.com/minimistjs/minimist/commit/f0fb958e9a1fe980cdffc436a211b0bda58f621b) +- [meta] create FUNDING.yml; add `funding` in package.json [`3639e0c`](https://github.com/minimistjs/minimist/commit/3639e0c819359a366387e425ab6eabf4c78d3caa) +- [meta] use `npmignore` to autogenerate an npmignore file [`be2e038`](https://github.com/minimistjs/minimist/commit/be2e038c342d8333b32f0fde67a0026b79c8150e) +- Only apps should have lockfiles [`282b570`](https://github.com/minimistjs/minimist/commit/282b570e7489d01b03f2d6d3dabf79cd3e5f84cf) +- [meta] add `safe-publish-latest` [`4b927de`](https://github.com/minimistjs/minimist/commit/4b927de696d561c636b4f43bf49d4597cb36d6d6) +- [Tests] add `aud` in `posttest` [`b32d9bd`](https://github.com/minimistjs/minimist/commit/b32d9bd0ab340f4e9f8c3a97ff2a4424f25fab8c) +- [meta] update repo URLs [`f9fdfc0`](https://github.com/minimistjs/minimist/commit/f9fdfc032c54884d9a9996a390c63cd0719bbe1a) + +## [v0.2.1](https://github.com/minimistjs/minimist/compare/v0.2.0...v0.2.1) - 2020-03-12 + +## [v0.2.0](https://github.com/minimistjs/minimist/compare/v0.1.0...v0.2.0) - 2014-06-19 + +### Commits + +- support all-boolean mode [`450a97f`](https://github.com/minimistjs/minimist/commit/450a97f6e2bc85c7a4a13185c19a818d9a5ebe69) + +## [v0.1.0](https://github.com/minimistjs/minimist/compare/v0.0.10...v0.1.0) - 2014-05-12 + +### Commits + +- Provide a mechanism to segregate -- arguments [`ce4a1e6`](https://github.com/minimistjs/minimist/commit/ce4a1e63a7e8d5ab88d2a3768adefa6af98a445a) +- documented argv['--'] [`14db0e6`](https://github.com/minimistjs/minimist/commit/14db0e6dbc6d2b9e472adaa54dad7004b364634f) +- Adding a test-case for notFlags segregation [`715c1e3`](https://github.com/minimistjs/minimist/commit/715c1e3714be223f998f6c537af6b505f0236c16) + +## [v0.0.10](https://github.com/minimistjs/minimist/compare/v0.0.9...v0.0.10) - 2014-05-11 + +### Commits + +- dedicated boolean test [`46e448f`](https://github.com/minimistjs/minimist/commit/46e448f9f513cfeb2bcc8b688b9b47ba1e515c2b) +- dedicated num test [`9bf2d36`](https://github.com/minimistjs/minimist/commit/9bf2d36f1d3b8795be90b8f7de0a937f098aa394) +- aliased values treated as strings [`1ab743b`](https://github.com/minimistjs/minimist/commit/1ab743bad4484d69f1259bed42f9531de01119de) +- cover the case of already numbers, at 100% coverage [`b2bb044`](https://github.com/minimistjs/minimist/commit/b2bb04436599d77a2ce029e8e555e25b3aa55d13) +- another test for higher coverage [`3662624`](https://github.com/minimistjs/minimist/commit/3662624be976d5489d486a856849c048d13be903) + +## [v0.0.9](https://github.com/minimistjs/minimist/compare/v0.0.8...v0.0.9) - 2014-05-08 + +### Commits + +- Eliminate `longest` fn. [`824f642`](https://github.com/minimistjs/minimist/commit/824f642038d1b02ede68b6261d1d65163390929a) + +## [v0.0.8](https://github.com/minimistjs/minimist/compare/v0.0.7...v0.0.8) - 2014-02-20 + +### Commits + +- return '' if flag is string and empty [`fa63ed4`](https://github.com/minimistjs/minimist/commit/fa63ed4651a4ef4eefddce34188e0d98d745a263) +- handle joined single letters [`66c248f`](https://github.com/minimistjs/minimist/commit/66c248f0241d4d421d193b022e9e365f11178534) + +## [v0.0.7](https://github.com/minimistjs/minimist/compare/v0.0.6...v0.0.7) - 2014-02-08 + +### Commits + +- another swap of .test for .match [`d1da408`](https://github.com/minimistjs/minimist/commit/d1da40819acbe846d89a5c02721211e3c1260dde) + +## [v0.0.6](https://github.com/minimistjs/minimist/compare/v0.0.5...v0.0.6) - 2014-02-08 + +### Commits + +- use .test() instead of .match() to not crash on non-string values in the arguments array [`7e0d1ad`](https://github.com/minimistjs/minimist/commit/7e0d1add8c9e5b9b20a4d3d0f9a94d824c578da1) + +## [v0.0.5](https://github.com/minimistjs/minimist/compare/v0.0.4...v0.0.5) - 2013-09-18 + +### Commits + +- Improve '--' handling. [`b11822c`](https://github.com/minimistjs/minimist/commit/b11822c09cc9d2460f30384d12afc0b953c037a4) + +## [v0.0.4](https://github.com/minimistjs/minimist/compare/v0.0.3...v0.0.4) - 2013-09-17 + +## [v0.0.3](https://github.com/minimistjs/minimist/compare/v0.0.2...v0.0.3) - 2013-09-12 + +### Commits + +- failing test for single dash preceeding a double dash [`b465514`](https://github.com/minimistjs/minimist/commit/b465514b82c9ae28972d714facd951deb2ad762b) +- fix for the dot test [`6a095f1`](https://github.com/minimistjs/minimist/commit/6a095f1d364c8fab2d6753d2291a0649315d297a) + +## [v0.0.2](https://github.com/minimistjs/minimist/compare/v0.0.1...v0.0.2) - 2013-08-28 + +### Commits + +- allow dotted aliases & defaults [`321c33e`](https://github.com/minimistjs/minimist/commit/321c33e755485faaeb44eeb1c05d33b2e0a5a7c4) +- use a better version of ff [`e40f611`](https://github.com/minimistjs/minimist/commit/e40f61114cf7be6f7947f7b3eed345853a67dbbb) + +## [v0.0.1](https://github.com/minimistjs/minimist/compare/v0.0.0...v0.0.1) - 2013-06-25 + +### Commits + +- remove trailing commas [`6ff0fa0`](https://github.com/minimistjs/minimist/commit/6ff0fa055064f15dbe06d50b89d5173a6796e1db) + +## v0.0.0 - 2013-06-25 + +### Commits + +- half of the parse test ported [`3079326`](https://github.com/minimistjs/minimist/commit/307932601325087de6cf94188eb798ffc4f3088a) +- stripped down code and a passing test from optimist [`7cced88`](https://github.com/minimistjs/minimist/commit/7cced88d82e399d1a03ed23eb667f04d3f320d10) +- ported parse tests completely over [`9448754`](https://github.com/minimistjs/minimist/commit/944875452e0820df6830b1408c26a0f7d3e1db04) +- docs, package.json [`a5bf46a`](https://github.com/minimistjs/minimist/commit/a5bf46ac9bb3bd114a9c340276c62c1091e538d5) +- move more short tests into short.js [`503edb5`](https://github.com/minimistjs/minimist/commit/503edb5c41d89c0d40831ee517154fc13b0f18b9) +- default bool test was wrong, not the code [`1b9f5db`](https://github.com/minimistjs/minimist/commit/1b9f5db4741b49962846081b68518de824992097) +- passing long tests ripped out of parse.js [`7972c4a`](https://github.com/minimistjs/minimist/commit/7972c4aff1f4803079e1668006658e2a761a0428) +- badges [`84c0370`](https://github.com/minimistjs/minimist/commit/84c037063664d42878aace715fe6572ce01b6f3b) +- all the tests now ported, some failures [`64239ed`](https://github.com/minimistjs/minimist/commit/64239edfe92c711c4eb0da254fcdfad2a5fdb605) +- failing short test [`f8a5341`](https://github.com/minimistjs/minimist/commit/f8a534112dd1138d2fad722def56a848480c446f) +- fixed the numeric test [`6b034f3`](https://github.com/minimistjs/minimist/commit/6b034f37c79342c60083ed97fd222e16928aac51) diff --git a/node_modules/minimist/LICENSE b/node_modules/minimist/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/minimist/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +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/minimist/README.md b/node_modules/minimist/README.md new file mode 100644 index 0000000..74da323 --- /dev/null +++ b/node_modules/minimist/README.md @@ -0,0 +1,121 @@ +# minimist [![Version Badge][npm-version-svg]][package-url] + +[![github actions][actions-image]][actions-url] +[![coverage][codecov-image]][codecov-url] +[![License][license-image]][license-url] +[![Downloads][downloads-image]][downloads-url] + +[![npm badge][npm-badge-png]][package-url] + +parse argument options + +This module is the guts of optimist's argument parser without all the +fanciful decoration. + +# example + +``` js +var argv = require('minimist')(process.argv.slice(2)); +console.log(argv); +``` + +``` +$ node example/parse.js -a beep -b boop +{ _: [], a: 'beep', b: 'boop' } +``` + +``` +$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz +{ + _: ['foo', 'bar', 'baz'], + x: 3, + y: 4, + n: 5, + a: true, + b: true, + c: true, + beep: 'boop' +} +``` + +# security + +Previous versions had a prototype pollution bug that could cause privilege +escalation in some circumstances when handling untrusted user input. + +Please use version 1.2.6 or later: + +* https://security.snyk.io/vuln/SNYK-JS-MINIMIST-2429795 (version <=1.2.5) +* https://snyk.io/vuln/SNYK-JS-MINIMIST-559764 (version <=1.2.3) + +# methods + +``` js +var parseArgs = require('minimist') +``` + +## var argv = parseArgs(args, opts={}) + +Return an argument object `argv` populated with the array arguments from `args`. + +`argv._` contains all the arguments that didn't have an option associated with +them. + +Numeric-looking arguments will be returned as numbers unless `opts.string` or +`opts.boolean` is set for that argument name. + +Any arguments after `'--'` will not be parsed and will end up in `argv._`. + +options can be: + +* `opts.string` - a string or array of strings argument names to always treat as +strings +* `opts.boolean` - a boolean, string or array of strings to always treat as +booleans. if `true` will treat all double hyphenated arguments without equal signs +as boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`) +* `opts.alias` - an object mapping string names to strings or arrays of string +argument names to use as aliases +* `opts.default` - an object mapping string argument names to default values +* `opts.stopEarly` - when true, populate `argv._` with everything after the +first non-option +* `opts['--']` - when true, populate `argv._` with everything before the `--` +and `argv['--']` with everything after the `--`. Here's an example: + + ``` + > require('./')('one two three -- four five --six'.split(' '), { '--': true }) + { + _: ['one', 'two', 'three'], + '--': ['four', 'five', '--six'] + } + ``` + + Note that with `opts['--']` set, parsing for arguments still stops after the + `--`. + +* `opts.unknown` - a function which is invoked with a command line parameter not +defined in the `opts` configuration object. If the function returns `false`, the +unknown option is not added to `argv`. + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install minimist +``` + +# license + +MIT + +[package-url]: https://npmjs.org/package/minimist +[npm-version-svg]: https://versionbadg.es/minimistjs/minimist.svg +[npm-badge-png]: https://nodei.co/npm/minimist.png?downloads=true&stars=true +[license-image]: https://img.shields.io/npm/l/minimist.svg +[license-url]: LICENSE +[downloads-image]: https://img.shields.io/npm/dm/minimist.svg +[downloads-url]: https://npm-stat.com/charts.html?package=minimist +[codecov-image]: https://codecov.io/gh/minimistjs/minimist/branch/main/graphs/badge.svg +[codecov-url]: https://app.codecov.io/gh/minimistjs/minimist/ +[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/minimistjs/minimist +[actions-url]: https://github.com/minimistjs/minimist/actions diff --git a/node_modules/minimist/example/parse.js b/node_modules/minimist/example/parse.js new file mode 100644 index 0000000..9d90ffb --- /dev/null +++ b/node_modules/minimist/example/parse.js @@ -0,0 +1,4 @@ +'use strict'; + +var argv = require('../')(process.argv.slice(2)); +console.log(argv); diff --git a/node_modules/minimist/index.js b/node_modules/minimist/index.js new file mode 100644 index 0000000..f020f39 --- /dev/null +++ b/node_modules/minimist/index.js @@ -0,0 +1,263 @@ +'use strict'; + +function hasKey(obj, keys) { + var o = obj; + keys.slice(0, -1).forEach(function (key) { + o = o[key] || {}; + }); + + var key = keys[keys.length - 1]; + return key in o; +} + +function isNumber(x) { + if (typeof x === 'number') { return true; } + if ((/^0x[0-9a-f]+$/i).test(x)) { return true; } + return (/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/).test(x); +} + +function isConstructorOrProto(obj, key) { + return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__'; +} + +module.exports = function (args, opts) { + if (!opts) { opts = {}; } + + var flags = { + bools: {}, + strings: {}, + unknownFn: null, + }; + + if (typeof opts.unknown === 'function') { + flags.unknownFn = opts.unknown; + } + + if (typeof opts.boolean === 'boolean' && opts.boolean) { + flags.allBools = true; + } else { + [].concat(opts.boolean).filter(Boolean).forEach(function (key) { + flags.bools[key] = true; + }); + } + + var aliases = {}; + + function aliasIsBoolean(key) { + return aliases[key].some(function (x) { + return flags.bools[x]; + }); + } + + Object.keys(opts.alias || {}).forEach(function (key) { + aliases[key] = [].concat(opts.alias[key]); + aliases[key].forEach(function (x) { + aliases[x] = [key].concat(aliases[key].filter(function (y) { + return x !== y; + })); + }); + }); + + [].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true; + if (aliases[key]) { + [].concat(aliases[key]).forEach(function (k) { + flags.strings[k] = true; + }); + } + }); + + var defaults = opts.default || {}; + + var argv = { _: [] }; + + function argDefined(key, arg) { + return (flags.allBools && (/^--[^=]+$/).test(arg)) + || flags.strings[key] + || flags.bools[key] + || aliases[key]; + } + + function setKey(obj, keys, value) { + var o = obj; + for (var i = 0; i < keys.length - 1; i++) { + var key = keys[i]; + if (isConstructorOrProto(o, key)) { return; } + if (o[key] === undefined) { o[key] = {}; } + if ( + o[key] === Object.prototype + || o[key] === Number.prototype + || o[key] === String.prototype + ) { + o[key] = {}; + } + if (o[key] === Array.prototype) { o[key] = []; } + o = o[key]; + } + + var lastKey = keys[keys.length - 1]; + if (isConstructorOrProto(o, lastKey)) { return; } + if ( + o === Object.prototype + || o === Number.prototype + || o === String.prototype + ) { + o = {}; + } + if (o === Array.prototype) { o = []; } + if (o[lastKey] === undefined || flags.bools[lastKey] || typeof o[lastKey] === 'boolean') { + o[lastKey] = value; + } else if (Array.isArray(o[lastKey])) { + o[lastKey].push(value); + } else { + o[lastKey] = [o[lastKey], value]; + } + } + + function setArg(key, val, arg) { + if (arg && flags.unknownFn && !argDefined(key, arg)) { + if (flags.unknownFn(arg) === false) { return; } + } + + var value = !flags.strings[key] && isNumber(val) + ? Number(val) + : val; + setKey(argv, key.split('.'), value); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), value); + }); + } + + Object.keys(flags.bools).forEach(function (key) { + setArg(key, defaults[key] === undefined ? false : defaults[key]); + }); + + var notFlags = []; + + if (args.indexOf('--') !== -1) { + notFlags = args.slice(args.indexOf('--') + 1); + args = args.slice(0, args.indexOf('--')); + } + + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + var key; + var next; + + if ((/^--.+=/).test(arg)) { + // Using [\s\S] instead of . because js doesn't support the + // 'dotall' regex modifier. See: + // http://stackoverflow.com/a/1068308/13216 + var m = arg.match(/^--([^=]+)=([\s\S]*)$/); + key = m[1]; + var value = m[2]; + if (flags.bools[key]) { + value = value !== 'false'; + } + setArg(key, value, arg); + } else if ((/^--no-.+/).test(arg)) { + key = arg.match(/^--no-(.+)/)[1]; + setArg(key, false, arg); + } else if ((/^--.+/).test(arg)) { + key = arg.match(/^--(.+)/)[1]; + next = args[i + 1]; + if ( + next !== undefined + && !(/^(-|--)[^-]/).test(next) + && !flags.bools[key] + && !flags.allBools + && (aliases[key] ? !aliasIsBoolean(key) : true) + ) { + setArg(key, next, arg); + i += 1; + } else if ((/^(true|false)$/).test(next)) { + setArg(key, next === 'true', arg); + i += 1; + } else { + setArg(key, flags.strings[key] ? '' : true, arg); + } + } else if ((/^-[^-]+/).test(arg)) { + var letters = arg.slice(1, -1).split(''); + + var broken = false; + for (var j = 0; j < letters.length; j++) { + next = arg.slice(j + 2); + + if (next === '-') { + setArg(letters[j], next, arg); + continue; + } + + if ((/[A-Za-z]/).test(letters[j]) && next[0] === '=') { + setArg(letters[j], next.slice(1), arg); + broken = true; + break; + } + + if ( + (/[A-Za-z]/).test(letters[j]) + && (/-?\d+(\.\d*)?(e-?\d+)?$/).test(next) + ) { + setArg(letters[j], next, arg); + broken = true; + break; + } + + if (letters[j + 1] && letters[j + 1].match(/\W/)) { + setArg(letters[j], arg.slice(j + 2), arg); + broken = true; + break; + } else { + setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg); + } + } + + key = arg.slice(-1)[0]; + if (!broken && key !== '-') { + if ( + args[i + 1] + && !(/^(-|--)[^-]/).test(args[i + 1]) + && !flags.bools[key] + && (aliases[key] ? !aliasIsBoolean(key) : true) + ) { + setArg(key, args[i + 1], arg); + i += 1; + } else if (args[i + 1] && (/^(true|false)$/).test(args[i + 1])) { + setArg(key, args[i + 1] === 'true', arg); + i += 1; + } else { + setArg(key, flags.strings[key] ? '' : true, arg); + } + } + } else { + if (!flags.unknownFn || flags.unknownFn(arg) !== false) { + argv._.push(flags.strings._ || !isNumber(arg) ? arg : Number(arg)); + } + if (opts.stopEarly) { + argv._.push.apply(argv._, args.slice(i + 1)); + break; + } + } + } + + Object.keys(defaults).forEach(function (k) { + if (!hasKey(argv, k.split('.'))) { + setKey(argv, k.split('.'), defaults[k]); + + (aliases[k] || []).forEach(function (x) { + setKey(argv, x.split('.'), defaults[k]); + }); + } + }); + + if (opts['--']) { + argv['--'] = notFlags.slice(); + } else { + notFlags.forEach(function (k) { + argv._.push(k); + }); + } + + return argv; +}; diff --git a/node_modules/minimist/package.json b/node_modules/minimist/package.json new file mode 100644 index 0000000..c10a334 --- /dev/null +++ b/node_modules/minimist/package.json @@ -0,0 +1,75 @@ +{ + "name": "minimist", + "version": "1.2.8", + "description": "parse argument options", + "main": "index.js", + "devDependencies": { + "@ljharb/eslint-config": "^21.0.1", + "aud": "^2.0.2", + "auto-changelog": "^2.4.0", + "eslint": "=8.8.0", + "in-publish": "^2.0.1", + "npmignore": "^0.3.0", + "nyc": "^10.3.2", + "safe-publish-latest": "^2.0.0", + "tape": "^5.6.3" + }, + "scripts": { + "prepack": "npmignore --auto --commentLines=auto", + "prepublishOnly": "safe-publish-latest", + "prepublish": "not-in-publish || npm run prepublishOnly", + "lint": "eslint --ext=js,mjs .", + "pretest": "npm run lint", + "tests-only": "nyc tape 'test/**/*.js'", + "test": "npm run tests-only", + "posttest": "aud --production", + "version": "auto-changelog && git add CHANGELOG.md", + "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/6..latest", + "ff/5", + "firefox/latest", + "chrome/10", + "chrome/latest", + "safari/5.1", + "safari/latest", + "opera/12" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/minimistjs/minimist.git" + }, + "homepage": "https://github.com/minimistjs/minimist", + "keywords": [ + "argv", + "getopt", + "parser", + "optimist" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "license": "MIT", + "auto-changelog": { + "output": "CHANGELOG.md", + "template": "keepachangelog", + "unreleased": false, + "commitLimit": false, + "backfillLimit": false, + "hideCredit": true + }, + "publishConfig": { + "ignore": [ + ".github/workflows" + ] + } +} diff --git a/node_modules/minimist/test/all_bool.js b/node_modules/minimist/test/all_bool.js new file mode 100644 index 0000000..befa0c9 --- /dev/null +++ b/node_modules/minimist/test/all_bool.js @@ -0,0 +1,34 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('flag boolean true (default all --args to boolean)', function (t) { + var argv = parse(['moo', '--honk', 'cow'], { + boolean: true, + }); + + t.deepEqual(argv, { + honk: true, + _: ['moo', 'cow'], + }); + + t.deepEqual(typeof argv.honk, 'boolean'); + t.end(); +}); + +test('flag boolean true only affects double hyphen arguments without equals signs', function (t) { + var argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], { + boolean: true, + }); + + t.deepEqual(argv, { + honk: true, + tacos: 'good', + p: 55, + _: ['moo', 'cow'], + }); + + t.deepEqual(typeof argv.honk, 'boolean'); + t.end(); +}); diff --git a/node_modules/minimist/test/bool.js b/node_modules/minimist/test/bool.js new file mode 100644 index 0000000..e58d47e --- /dev/null +++ b/node_modules/minimist/test/bool.js @@ -0,0 +1,177 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('flag boolean default false', function (t) { + var argv = parse(['moo'], { + boolean: ['t', 'verbose'], + default: { verbose: false, t: false }, + }); + + t.deepEqual(argv, { + verbose: false, + t: false, + _: ['moo'], + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); + +}); + +test('boolean groups', function (t) { + var argv = parse(['-x', '-z', 'one', 'two', 'three'], { + boolean: ['x', 'y', 'z'], + }); + + t.deepEqual(argv, { + x: true, + y: false, + z: true, + _: ['one', 'two', 'three'], + }); + + t.deepEqual(typeof argv.x, 'boolean'); + t.deepEqual(typeof argv.y, 'boolean'); + t.deepEqual(typeof argv.z, 'boolean'); + t.end(); +}); +test('boolean and alias with chainable api', function (t) { + var aliased = ['-h', 'derp']; + var regular = ['--herp', 'derp']; + var aliasedArgv = parse(aliased, { + boolean: 'herp', + alias: { h: 'herp' }, + }); + var propertyArgv = parse(regular, { + boolean: 'herp', + alias: { h: 'herp' }, + }); + var expected = { + herp: true, + h: true, + _: ['derp'], + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias with options hash', function (t) { + var aliased = ['-h', 'derp']; + var regular = ['--herp', 'derp']; + var opts = { + alias: { h: 'herp' }, + boolean: 'herp', + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + _: ['derp'], + }; + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias array with options hash', function (t) { + var aliased = ['-h', 'derp']; + var regular = ['--herp', 'derp']; + var alt = ['--harp', 'derp']; + var opts = { + alias: { h: ['herp', 'harp'] }, + boolean: 'h', + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var altPropertyArgv = parse(alt, opts); + var expected = { + harp: true, + herp: true, + h: true, + _: ['derp'], + }; + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.same(altPropertyArgv, expected); + t.end(); +}); + +test('boolean and alias using explicit true', function (t) { + var aliased = ['-h', 'true']; + var regular = ['--herp', 'true']; + var opts = { + alias: { h: 'herp' }, + boolean: 'h', + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + _: [], + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +// regression, see https://github.com/substack/node-optimist/issues/71 +test('boolean and --x=true', function (t) { + var parsed = parse(['--boool', '--other=true'], { + boolean: 'boool', + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'true'); + + parsed = parse(['--boool', '--other=false'], { + boolean: 'boool', + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'false'); + t.end(); +}); + +test('boolean --boool=true', function (t) { + var parsed = parse(['--boool=true'], { + default: { + boool: false, + }, + boolean: ['boool'], + }); + + t.same(parsed.boool, true); + t.end(); +}); + +test('boolean --boool=false', function (t) { + var parsed = parse(['--boool=false'], { + default: { + boool: true, + }, + boolean: ['boool'], + }); + + t.same(parsed.boool, false); + t.end(); +}); + +test('boolean using something similar to true', function (t) { + var opts = { boolean: 'h' }; + var result = parse(['-h', 'true.txt'], opts); + var expected = { + h: true, + _: ['true.txt'], + }; + + t.same(result, expected); + t.end(); +}); diff --git a/node_modules/minimist/test/dash.js b/node_modules/minimist/test/dash.js new file mode 100644 index 0000000..7078817 --- /dev/null +++ b/node_modules/minimist/test/dash.js @@ -0,0 +1,43 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('-', function (t) { + t.plan(6); + t.deepEqual(parse(['-n', '-']), { n: '-', _: [] }); + t.deepEqual(parse(['--nnn', '-']), { nnn: '-', _: [] }); + t.deepEqual(parse(['-']), { _: ['-'] }); + t.deepEqual(parse(['-f-']), { f: '-', _: [] }); + t.deepEqual( + parse(['-b', '-'], { boolean: 'b' }), + { b: true, _: ['-'] } + ); + t.deepEqual( + parse(['-s', '-'], { string: 's' }), + { s: '-', _: [] } + ); +}); + +test('-a -- b', function (t) { + t.plan(2); + t.deepEqual(parse(['-a', '--', 'b']), { a: true, _: ['b'] }); + t.deepEqual(parse(['--a', '--', 'b']), { a: true, _: ['b'] }); +}); + +test('move arguments after the -- into their own `--` array', function (t) { + t.plan(1); + t.deepEqual( + parse(['--name', 'John', 'before', '--', 'after'], { '--': true }), + { name: 'John', _: ['before'], '--': ['after'] } + ); +}); + +test('--- option value', function (t) { + // A multi-dash value is largely an edge case, but check the behaviour is as expected, + // and in particular the same for short option and long option (as made consistent in Jan 2023). + t.plan(2); + t.deepEqual(parse(['-n', '---']), { n: '---', _: [] }); + t.deepEqual(parse(['--nnn', '---']), { nnn: '---', _: [] }); +}); + diff --git a/node_modules/minimist/test/default_bool.js b/node_modules/minimist/test/default_bool.js new file mode 100644 index 0000000..4e9f625 --- /dev/null +++ b/node_modules/minimist/test/default_bool.js @@ -0,0 +1,37 @@ +'use strict'; + +var test = require('tape'); +var parse = require('../'); + +test('boolean default true', function (t) { + var argv = parse([], { + boolean: 'sometrue', + default: { sometrue: true }, + }); + t.equal(argv.sometrue, true); + t.end(); +}); + +test('boolean default false', function (t) { + var argv = parse([], { + boolean: 'somefalse', + default: { somefalse: false }, + }); + t.equal(argv.somefalse, false); + t.end(); +}); + +test('boolean default to null', function (t) { + var argv = parse([], { + boolean: 'maybe', + default: { maybe: null }, + }); + t.equal(argv.maybe, null); + + var argvLong = parse(['--maybe'], { + boolean: 'maybe', + default: { maybe: null }, + }); + t.equal(argvLong.maybe, true); + t.end(); +}); diff --git a/node_modules/minimist/test/dotted.js b/node_modules/minimist/test/dotted.js new file mode 100644 index 0000000..126ff03 --- /dev/null +++ b/node_modules/minimist/test/dotted.js @@ -0,0 +1,24 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('dotted alias', function (t) { + var argv = parse(['--a.b', '22'], { default: { 'a.b': 11 }, alias: { 'a.b': 'aa.bb' } }); + t.equal(argv.a.b, 22); + t.equal(argv.aa.bb, 22); + t.end(); +}); + +test('dotted default', function (t) { + var argv = parse('', { default: { 'a.b': 11 }, alias: { 'a.b': 'aa.bb' } }); + t.equal(argv.a.b, 11); + t.equal(argv.aa.bb, 11); + t.end(); +}); + +test('dotted default with no alias', function (t) { + var argv = parse('', { default: { 'a.b': 11 } }); + t.equal(argv.a.b, 11); + t.end(); +}); diff --git a/node_modules/minimist/test/kv_short.js b/node_modules/minimist/test/kv_short.js new file mode 100644 index 0000000..6d1b53a --- /dev/null +++ b/node_modules/minimist/test/kv_short.js @@ -0,0 +1,32 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('short -k=v', function (t) { + t.plan(1); + + var argv = parse(['-b=123']); + t.deepEqual(argv, { b: 123, _: [] }); +}); + +test('multi short -k=v', function (t) { + t.plan(1); + + var argv = parse(['-a=whatever', '-b=robots']); + t.deepEqual(argv, { a: 'whatever', b: 'robots', _: [] }); +}); + +test('short with embedded equals -k=a=b', function (t) { + t.plan(1); + + var argv = parse(['-k=a=b']); + t.deepEqual(argv, { k: 'a=b', _: [] }); +}); + +test('short with later equals like -ab=c', function (t) { + t.plan(1); + + var argv = parse(['-ab=c']); + t.deepEqual(argv, { a: true, b: 'c', _: [] }); +}); diff --git a/node_modules/minimist/test/long.js b/node_modules/minimist/test/long.js new file mode 100644 index 0000000..9fef51f --- /dev/null +++ b/node_modules/minimist/test/long.js @@ -0,0 +1,33 @@ +'use strict'; + +var test = require('tape'); +var parse = require('../'); + +test('long opts', function (t) { + t.deepEqual( + parse(['--bool']), + { bool: true, _: [] }, + 'long boolean' + ); + t.deepEqual( + parse(['--pow', 'xixxle']), + { pow: 'xixxle', _: [] }, + 'long capture sp' + ); + t.deepEqual( + parse(['--pow=xixxle']), + { pow: 'xixxle', _: [] }, + 'long capture eq' + ); + t.deepEqual( + parse(['--host', 'localhost', '--port', '555']), + { host: 'localhost', port: 555, _: [] }, + 'long captures sp' + ); + t.deepEqual( + parse(['--host=localhost', '--port=555']), + { host: 'localhost', port: 555, _: [] }, + 'long captures eq' + ); + t.end(); +}); diff --git a/node_modules/minimist/test/num.js b/node_modules/minimist/test/num.js new file mode 100644 index 0000000..074393e --- /dev/null +++ b/node_modules/minimist/test/num.js @@ -0,0 +1,38 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('nums', function (t) { + var argv = parse([ + '-x', '1234', + '-y', '5.67', + '-z', '1e7', + '-w', '10f', + '--hex', '0xdeadbeef', + '789', + ]); + t.deepEqual(argv, { + x: 1234, + y: 5.67, + z: 1e7, + w: '10f', + hex: 0xdeadbeef, + _: [789], + }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv.y, 'number'); + t.deepEqual(typeof argv.z, 'number'); + t.deepEqual(typeof argv.w, 'string'); + t.deepEqual(typeof argv.hex, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); + +test('already a number', function (t) { + var argv = parse(['-x', 1234, 789]); + t.deepEqual(argv, { x: 1234, _: [789] }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); diff --git a/node_modules/minimist/test/parse.js b/node_modules/minimist/test/parse.js new file mode 100644 index 0000000..65d9d90 --- /dev/null +++ b/node_modules/minimist/test/parse.js @@ -0,0 +1,209 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('parse args', function (t) { + t.deepEqual( + parse(['--no-moo']), + { moo: false, _: [] }, + 'no' + ); + t.deepEqual( + parse(['-v', 'a', '-v', 'b', '-v', 'c']), + { v: ['a', 'b', 'c'], _: [] }, + 'multi' + ); + t.end(); +}); + +test('comprehensive', function (t) { + t.deepEqual( + parse([ + '--name=meowmers', 'bare', '-cats', 'woo', + '-h', 'awesome', '--multi=quux', + '--key', 'value', + '-b', '--bool', '--no-meep', '--multi=baz', + '--', '--not-a-flag', 'eek', + ]), + { + c: true, + a: true, + t: true, + s: 'woo', + h: 'awesome', + b: true, + bool: true, + key: 'value', + multi: ['quux', 'baz'], + meep: false, + name: 'meowmers', + _: ['bare', '--not-a-flag', 'eek'], + } + ); + t.end(); +}); + +test('flag boolean', function (t) { + var argv = parse(['-t', 'moo'], { boolean: 't' }); + t.deepEqual(argv, { t: true, _: ['moo'] }); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('flag boolean value', function (t) { + var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { + boolean: ['t', 'verbose'], + default: { verbose: true }, + }); + + t.deepEqual(argv, { + verbose: false, + t: true, + _: ['moo'], + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('newlines in params', function (t) { + var args = parse(['-s', 'X\nX']); + t.deepEqual(args, { _: [], s: 'X\nX' }); + + // reproduce in bash: + // VALUE="new + // line" + // node program.js --s="$VALUE" + args = parse(['--s=X\nX']); + t.deepEqual(args, { _: [], s: 'X\nX' }); + t.end(); +}); + +test('strings', function (t) { + var s = parse(['-s', '0001234'], { string: 's' }).s; + t.equal(s, '0001234'); + t.equal(typeof s, 'string'); + + var x = parse(['-x', '56'], { string: 'x' }).x; + t.equal(x, '56'); + t.equal(typeof x, 'string'); + t.end(); +}); + +test('stringArgs', function (t) { + var s = parse([' ', ' '], { string: '_' })._; + t.same(s.length, 2); + t.same(typeof s[0], 'string'); + t.same(s[0], ' '); + t.same(typeof s[1], 'string'); + t.same(s[1], ' '); + t.end(); +}); + +test('empty strings', function (t) { + var s = parse(['-s'], { string: 's' }).s; + t.equal(s, ''); + t.equal(typeof s, 'string'); + + var str = parse(['--str'], { string: 'str' }).str; + t.equal(str, ''); + t.equal(typeof str, 'string'); + + var letters = parse(['-art'], { + string: ['a', 't'], + }); + + t.equal(letters.a, ''); + t.equal(letters.r, true); + t.equal(letters.t, ''); + + t.end(); +}); + +test('string and alias', function (t) { + var x = parse(['--str', '000123'], { + string: 's', + alias: { s: 'str' }, + }); + + t.equal(x.str, '000123'); + t.equal(typeof x.str, 'string'); + t.equal(x.s, '000123'); + t.equal(typeof x.s, 'string'); + + var y = parse(['-s', '000123'], { + string: 'str', + alias: { str: 's' }, + }); + + t.equal(y.str, '000123'); + t.equal(typeof y.str, 'string'); + t.equal(y.s, '000123'); + t.equal(typeof y.s, 'string'); + + var z = parse(['-s123'], { + alias: { str: ['s', 'S'] }, + string: ['str'], + }); + + t.deepEqual( + z, + { _: [], s: '123', S: '123', str: '123' }, + 'opt.string works with multiple aliases' + ); + t.end(); +}); + +test('slashBreak', function (t) { + t.same( + parse(['-I/foo/bar/baz']), + { I: '/foo/bar/baz', _: [] } + ); + t.same( + parse(['-xyz/foo/bar/baz']), + { x: true, y: true, z: '/foo/bar/baz', _: [] } + ); + t.end(); +}); + +test('alias', function (t) { + var argv = parse(['-f', '11', '--zoom', '55'], { + alias: { z: 'zoom' }, + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.f, 11); + t.end(); +}); + +test('multiAlias', function (t) { + var argv = parse(['-f', '11', '--zoom', '55'], { + alias: { z: ['zm', 'zoom'] }, + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.z, argv.zm); + t.equal(argv.f, 11); + t.end(); +}); + +test('nested dotted objects', function (t) { + var argv = parse([ + '--foo.bar', '3', '--foo.baz', '4', + '--foo.quux.quibble', '5', '--foo.quux.o_O', + '--beep.boop', + ]); + + t.same(argv.foo, { + bar: 3, + baz: 4, + quux: { + quibble: 5, + o_O: true, + }, + }); + t.same(argv.beep, { boop: true }); + t.end(); +}); diff --git a/node_modules/minimist/test/parse_modified.js b/node_modules/minimist/test/parse_modified.js new file mode 100644 index 0000000..32965d1 --- /dev/null +++ b/node_modules/minimist/test/parse_modified.js @@ -0,0 +1,11 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('parse with modifier functions', function (t) { + t.plan(1); + + var argv = parse(['-b', '123'], { boolean: 'b' }); + t.deepEqual(argv, { b: true, _: [123] }); +}); diff --git a/node_modules/minimist/test/proto.js b/node_modules/minimist/test/proto.js new file mode 100644 index 0000000..6e629dd --- /dev/null +++ b/node_modules/minimist/test/proto.js @@ -0,0 +1,64 @@ +'use strict'; + +/* eslint no-proto: 0 */ + +var parse = require('../'); +var test = require('tape'); + +test('proto pollution', function (t) { + var argv = parse(['--__proto__.x', '123']); + t.equal({}.x, undefined); + t.equal(argv.__proto__.x, undefined); + t.equal(argv.x, undefined); + t.end(); +}); + +test('proto pollution (array)', function (t) { + var argv = parse(['--x', '4', '--x', '5', '--x.__proto__.z', '789']); + t.equal({}.z, undefined); + t.deepEqual(argv.x, [4, 5]); + t.equal(argv.x.z, undefined); + t.equal(argv.x.__proto__.z, undefined); + t.end(); +}); + +test('proto pollution (number)', function (t) { + var argv = parse(['--x', '5', '--x.__proto__.z', '100']); + t.equal({}.z, undefined); + t.equal((4).z, undefined); + t.equal(argv.x, 5); + t.equal(argv.x.z, undefined); + t.end(); +}); + +test('proto pollution (string)', function (t) { + var argv = parse(['--x', 'abc', '--x.__proto__.z', 'def']); + t.equal({}.z, undefined); + t.equal('...'.z, undefined); + t.equal(argv.x, 'abc'); + t.equal(argv.x.z, undefined); + t.end(); +}); + +test('proto pollution (constructor)', function (t) { + var argv = parse(['--constructor.prototype.y', '123']); + t.equal({}.y, undefined); + t.equal(argv.y, undefined); + t.end(); +}); + +test('proto pollution (constructor function)', function (t) { + var argv = parse(['--_.concat.constructor.prototype.y', '123']); + function fnToBeTested() {} + t.equal(fnToBeTested.y, undefined); + t.equal(argv.y, undefined); + t.end(); +}); + +// powered by snyk - https://github.com/backstage/backstage/issues/10343 +test('proto pollution (constructor function) snyk', function (t) { + var argv = parse('--_.constructor.constructor.prototype.foo bar'.split(' ')); + t.equal(function () {}.foo, undefined); + t.equal(argv.y, undefined); + t.end(); +}); diff --git a/node_modules/minimist/test/short.js b/node_modules/minimist/test/short.js new file mode 100644 index 0000000..4a7b843 --- /dev/null +++ b/node_modules/minimist/test/short.js @@ -0,0 +1,69 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('numeric short args', function (t) { + t.plan(2); + t.deepEqual(parse(['-n123']), { n: 123, _: [] }); + t.deepEqual( + parse(['-123', '456']), + { 1: true, 2: true, 3: 456, _: [] } + ); +}); + +test('short', function (t) { + t.deepEqual( + parse(['-b']), + { b: true, _: [] }, + 'short boolean' + ); + t.deepEqual( + parse(['foo', 'bar', 'baz']), + { _: ['foo', 'bar', 'baz'] }, + 'bare' + ); + t.deepEqual( + parse(['-cats']), + { c: true, a: true, t: true, s: true, _: [] }, + 'group' + ); + t.deepEqual( + parse(['-cats', 'meow']), + { c: true, a: true, t: true, s: 'meow', _: [] }, + 'short group next' + ); + t.deepEqual( + parse(['-h', 'localhost']), + { h: 'localhost', _: [] }, + 'short capture' + ); + t.deepEqual( + parse(['-h', 'localhost', '-p', '555']), + { h: 'localhost', p: 555, _: [] }, + 'short captures' + ); + t.end(); +}); + +test('mixed short bool and capture', function (t) { + t.same( + parse(['-h', 'localhost', '-fp', '555', 'script.js']), + { + f: true, p: 555, h: 'localhost', + _: ['script.js'], + } + ); + t.end(); +}); + +test('short and long', function (t) { + t.deepEqual( + parse(['-h', 'localhost', '-fp', '555', 'script.js']), + { + f: true, p: 555, h: 'localhost', + _: ['script.js'], + } + ); + t.end(); +}); diff --git a/node_modules/minimist/test/stop_early.js b/node_modules/minimist/test/stop_early.js new file mode 100644 index 0000000..52a6a91 --- /dev/null +++ b/node_modules/minimist/test/stop_early.js @@ -0,0 +1,17 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('stops parsing on the first non-option when stopEarly is set', function (t) { + var argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], { + stopEarly: true, + }); + + t.deepEqual(argv, { + aaa: 'bbb', + _: ['ccc', '--ddd'], + }); + + t.end(); +}); diff --git a/node_modules/minimist/test/unknown.js b/node_modules/minimist/test/unknown.js new file mode 100644 index 0000000..4f2e0ca --- /dev/null +++ b/node_modules/minimist/test/unknown.js @@ -0,0 +1,104 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('boolean and alias is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = ['-h', 'true', '--derp', 'true']; + var regular = ['--herp', 'true', '-d', 'true']; + var opts = { + alias: { h: 'herp' }, + boolean: 'h', + unknown: unknownFn, + }; + parse(aliased, opts); + parse(regular, opts); + + t.same(unknown, ['--derp', '-d']); + t.end(); +}); + +test('flag boolean true any double hyphen argument is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], { + boolean: true, + unknown: unknownFn, + }); + t.same(unknown, ['--tacos=good', 'cow', '-p']); + t.same(argv, { + honk: true, + _: [], + }); + t.end(); +}); + +test('string and alias is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = ['-h', 'hello', '--derp', 'goodbye']; + var regular = ['--herp', 'hello', '-d', 'moon']; + var opts = { + alias: { h: 'herp' }, + string: 'h', + unknown: unknownFn, + }; + parse(aliased, opts); + parse(regular, opts); + + t.same(unknown, ['--derp', '-d']); + t.end(); +}); + +test('default and alias is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = ['-h', 'hello']; + var regular = ['--herp', 'hello']; + var opts = { + default: { h: 'bar' }, + alias: { h: 'herp' }, + unknown: unknownFn, + }; + parse(aliased, opts); + parse(regular, opts); + + t.same(unknown, []); + t.end(); + unknownFn(); // exercise fn for 100% coverage +}); + +test('value following -- is not unknown', function (t) { + var unknown = []; + function unknownFn(arg) { + unknown.push(arg); + return false; + } + var aliased = ['--bad', '--', 'good', 'arg']; + var opts = { + '--': true, + unknown: unknownFn, + }; + var argv = parse(aliased, opts); + + t.same(unknown, ['--bad']); + t.same(argv, { + '--': ['good', 'arg'], + _: [], + }); + t.end(); +}); diff --git a/node_modules/minimist/test/whitespace.js b/node_modules/minimist/test/whitespace.js new file mode 100644 index 0000000..4fdaf1d --- /dev/null +++ b/node_modules/minimist/test/whitespace.js @@ -0,0 +1,10 @@ +'use strict'; + +var parse = require('../'); +var test = require('tape'); + +test('whitespace should be whitespace', function (t) { + t.plan(1); + var x = parse(['-x', '\t']).x; + t.equal(x, '\t'); +}); diff --git a/node_modules/minipass/LICENSE.md b/node_modules/minipass/LICENSE.md new file mode 100644 index 0000000..c5402b9 --- /dev/null +++ b/node_modules/minipass/LICENSE.md @@ -0,0 +1,55 @@ +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** diff --git a/node_modules/minipass/README.md b/node_modules/minipass/README.md new file mode 100644 index 0000000..1126330 --- /dev/null +++ b/node_modules/minipass/README.md @@ -0,0 +1,825 @@ +# minipass + +A _very_ minimal implementation of a [PassThrough +stream](https://nodejs.org/api/stream.html#stream_class_stream_passthrough) + +[It's very +fast](https://docs.google.com/spreadsheets/d/1K_HR5oh3r80b8WVMWCPPjfuWXUgfkmhlX7FGI6JJ8tY/edit?usp=sharing) +for objects, strings, and buffers. + +Supports `pipe()`ing (including multi-`pipe()` and backpressure +transmission), buffering data until either a `data` event handler +or `pipe()` is added (so you don't lose the first chunk), and +most other cases where PassThrough is a good idea. + +There is a `read()` method, but it's much more efficient to +consume data from this stream via `'data'` events or by calling +`pipe()` into some other stream. Calling `read()` requires the +buffer to be flattened in some cases, which requires copying +memory. + +If you set `objectMode: true` in the options, then whatever is +written will be emitted. Otherwise, it'll do a minimal amount of +Buffer copying to ensure proper Streams semantics when `read(n)` +is called. + +`objectMode` can only be set at instantiation. Attempting to +write something other than a String or Buffer without having set +`objectMode` in the options will throw an error. + +This is not a `through` or `through2` stream. It doesn't +transform the data, it just passes it right through. If you want +to transform the data, extend the class, and override the +`write()` method. Once you're done transforming the data however +you want, call `super.write()` with the transform output. + +For some examples of streams that extend Minipass in various +ways, check out: + +- [minizlib](http://npm.im/minizlib) +- [fs-minipass](http://npm.im/fs-minipass) +- [tar](http://npm.im/tar) +- [minipass-collect](http://npm.im/minipass-collect) +- [minipass-flush](http://npm.im/minipass-flush) +- [minipass-pipeline](http://npm.im/minipass-pipeline) +- [tap](http://npm.im/tap) +- [tap-parser](http://npm.im/tap-parser) +- [treport](http://npm.im/treport) +- [minipass-fetch](http://npm.im/minipass-fetch) +- [pacote](http://npm.im/pacote) +- [make-fetch-happen](http://npm.im/make-fetch-happen) +- [cacache](http://npm.im/cacache) +- [ssri](http://npm.im/ssri) +- [npm-registry-fetch](http://npm.im/npm-registry-fetch) +- [minipass-json-stream](http://npm.im/minipass-json-stream) +- [minipass-sized](http://npm.im/minipass-sized) + +## Usage in TypeScript + +The `Minipass` class takes three type template definitions: + +- `RType` the type being read, which defaults to `Buffer`. If + `RType` is `string`, then the constructor _must_ get an options + object specifying either an `encoding` or `objectMode: true`. + If it's anything other than `string` or `Buffer`, then it + _must_ get an options object specifying `objectMode: true`. +- `WType` the type being written. If `RType` is `Buffer` or + `string`, then this defaults to `ContiguousData` (Buffer, + string, ArrayBuffer, or ArrayBufferView). Otherwise, it + defaults to `RType`. +- `Events` type mapping event names to the arguments emitted + with that event, which extends `Minipass.Events`. + +To declare types for custom events in subclasses, extend the +third parameter with your own event signatures. For example: + +```js +import { Minipass } from 'minipass' + +// a NDJSON stream that emits 'jsonError' when it can't stringify +export interface Events extends Minipass.Events { + jsonError: [e: Error] +} + +export class NDJSONStream extends Minipass { + constructor() { + super({ objectMode: true }) + } + + // data is type `any` because that's WType + write(data, encoding, cb) { + try { + const json = JSON.stringify(data) + return super.write(json + '\n', encoding, cb) + } catch (er) { + if (!er instanceof Error) { + er = Object.assign(new Error('json stringify failed'), { + cause: er, + }) + } + // trying to emit with something OTHER than an error will + // fail, because we declared the event arguments type. + this.emit('jsonError', er) + } + } +} + +const s = new NDJSONStream() +s.on('jsonError', e => { + // here, TS knows that e is an Error +}) +``` + +Emitting/handling events that aren't declared in this way is +fine, but the arguments will be typed as `unknown`. + +## Differences from Node.js Streams + +There are several things that make Minipass streams different +from (and in some ways superior to) Node.js core streams. + +Please read these caveats if you are familiar with node-core +streams and intend to use Minipass streams in your programs. + +You can avoid most of these differences entirely (for a very +small performance penalty) by setting `{async: true}` in the +constructor options. + +### Timing + +Minipass streams are designed to support synchronous use-cases. +Thus, data is emitted as soon as it is available, always. It is +buffered until read, but no longer. Another way to look at it is +that Minipass streams are exactly as synchronous as the logic +that writes into them. + +This can be surprising if your code relies on +`PassThrough.write()` always providing data on the next tick +rather than the current one, or being able to call `resume()` and +not have the entire buffer disappear immediately. + +However, without this synchronicity guarantee, there would be no +way for Minipass to achieve the speeds it does, or support the +synchronous use cases that it does. Simply put, waiting takes +time. + +This non-deferring approach makes Minipass streams much easier to +reason about, especially in the context of Promises and other +flow-control mechanisms. + +Example: + +```js +// hybrid module, either works +import { Minipass } from 'minipass' +// or: +const { Minipass } = require('minipass') + +const stream = new Minipass() +stream.on('data', () => console.log('data event')) +console.log('before write') +stream.write('hello') +console.log('after write') +// output: +// before write +// data event +// after write +``` + +### Exception: Async Opt-In + +If you wish to have a Minipass stream with behavior that more +closely mimics Node.js core streams, you can set the stream in +async mode either by setting `async: true` in the constructor +options, or by setting `stream.async = true` later on. + +```js +// hybrid module, either works +import { Minipass } from 'minipass' +// or: +const { Minipass } = require('minipass') + +const asyncStream = new Minipass({ async: true }) +asyncStream.on('data', () => console.log('data event')) +console.log('before write') +asyncStream.write('hello') +console.log('after write') +// output: +// before write +// after write +// data event <-- this is deferred until the next tick +``` + +Switching _out_ of async mode is unsafe, as it could cause data +corruption, and so is not enabled. Example: + +```js +import { Minipass } from 'minipass' +const stream = new Minipass({ encoding: 'utf8' }) +stream.on('data', chunk => console.log(chunk)) +stream.async = true +console.log('before writes') +stream.write('hello') +setStreamSyncAgainSomehow(stream) // <-- this doesn't actually exist! +stream.write('world') +console.log('after writes') +// hypothetical output would be: +// before writes +// world +// after writes +// hello +// NOT GOOD! +``` + +To avoid this problem, once set into async mode, any attempt to +make the stream sync again will be ignored. + +```js +const { Minipass } = require('minipass') +const stream = new Minipass({ encoding: 'utf8' }) +stream.on('data', chunk => console.log(chunk)) +stream.async = true +console.log('before writes') +stream.write('hello') +stream.async = false // <-- no-op, stream already async +stream.write('world') +console.log('after writes') +// actual output: +// before writes +// after writes +// hello +// world +``` + +### No High/Low Water Marks + +Node.js core streams will optimistically fill up a buffer, +returning `true` on all writes until the limit is hit, even if +the data has nowhere to go. Then, they will not attempt to draw +more data in until the buffer size dips below a minimum value. + +Minipass streams are much simpler. The `write()` method will +return `true` if the data has somewhere to go (which is to say, +given the timing guarantees, that the data is already there by +the time `write()` returns). + +If the data has nowhere to go, then `write()` returns false, and +the data sits in a buffer, to be drained out immediately as soon +as anyone consumes it. + +Since nothing is ever buffered unnecessarily, there is much less +copying data, and less bookkeeping about buffer capacity levels. + +### Hazards of Buffering (or: Why Minipass Is So Fast) + +Since data written to a Minipass stream is immediately written +all the way through the pipeline, and `write()` always returns +true/false based on whether the data was fully flushed, +backpressure is communicated immediately to the upstream caller. +This minimizes buffering. + +Consider this case: + +```js +const { PassThrough } = require('stream') +const p1 = new PassThrough({ highWaterMark: 1024 }) +const p2 = new PassThrough({ highWaterMark: 1024 }) +const p3 = new PassThrough({ highWaterMark: 1024 }) +const p4 = new PassThrough({ highWaterMark: 1024 }) + +p1.pipe(p2).pipe(p3).pipe(p4) +p4.on('data', () => console.log('made it through')) + +// this returns false and buffers, then writes to p2 on next tick (1) +// p2 returns false and buffers, pausing p1, then writes to p3 on next tick (2) +// p3 returns false and buffers, pausing p2, then writes to p4 on next tick (3) +// p4 returns false and buffers, pausing p3, then emits 'data' and 'drain' +// on next tick (4) +// p3 sees p4's 'drain' event, and calls resume(), emitting 'resume' and +// 'drain' on next tick (5) +// p2 sees p3's 'drain', calls resume(), emits 'resume' and 'drain' on next tick (6) +// p1 sees p2's 'drain', calls resume(), emits 'resume' and 'drain' on next +// tick (7) + +p1.write(Buffer.alloc(2048)) // returns false +``` + +Along the way, the data was buffered and deferred at each stage, +and multiple event deferrals happened, for an unblocked pipeline +where it was perfectly safe to write all the way through! + +Furthermore, setting a `highWaterMark` of `1024` might lead +someone reading the code to think an advisory maximum of 1KiB is +being set for the pipeline. However, the actual advisory +buffering level is the _sum_ of `highWaterMark` values, since +each one has its own bucket. + +Consider the Minipass case: + +```js +const m1 = new Minipass() +const m2 = new Minipass() +const m3 = new Minipass() +const m4 = new Minipass() + +m1.pipe(m2).pipe(m3).pipe(m4) +m4.on('data', () => console.log('made it through')) + +// m1 is flowing, so it writes the data to m2 immediately +// m2 is flowing, so it writes the data to m3 immediately +// m3 is flowing, so it writes the data to m4 immediately +// m4 is flowing, so it fires the 'data' event immediately, returns true +// m4's write returned true, so m3 is still flowing, returns true +// m3's write returned true, so m2 is still flowing, returns true +// m2's write returned true, so m1 is still flowing, returns true +// No event deferrals or buffering along the way! + +m1.write(Buffer.alloc(2048)) // returns true +``` + +It is extremely unlikely that you _don't_ want to buffer any data +written, or _ever_ buffer data that can be flushed all the way +through. Neither node-core streams nor Minipass ever fail to +buffer written data, but node-core streams do a lot of +unnecessary buffering and pausing. + +As always, the faster implementation is the one that does less +stuff and waits less time to do it. + +### Immediately emit `end` for empty streams (when not paused) + +If a stream is not paused, and `end()` is called before writing +any data into it, then it will emit `end` immediately. + +If you have logic that occurs on the `end` event which you don't +want to potentially happen immediately (for example, closing file +descriptors, moving on to the next entry in an archive parse +stream, etc.) then be sure to call `stream.pause()` on creation, +and then `stream.resume()` once you are ready to respond to the +`end` event. + +However, this is _usually_ not a problem because: + +### Emit `end` When Asked + +One hazard of immediately emitting `'end'` is that you may not +yet have had a chance to add a listener. In order to avoid this +hazard, Minipass streams safely re-emit the `'end'` event if a +new listener is added after `'end'` has been emitted. + +Ie, if you do `stream.on('end', someFunction)`, and the stream +has already emitted `end`, then it will call the handler right +away. (You can think of this somewhat like attaching a new +`.then(fn)` to a previously-resolved Promise.) + +To prevent calling handlers multiple times who would not expect +multiple ends to occur, all listeners are removed from the +`'end'` event whenever it is emitted. + +### Emit `error` When Asked + +The most recent error object passed to the `'error'` event is +stored on the stream. If a new `'error'` event handler is added, +and an error was previously emitted, then the event handler will +be called immediately (or on `process.nextTick` in the case of +async streams). + +This makes it much more difficult to end up trying to interact +with a broken stream, if the error handler is added after an +error was previously emitted. + +### Impact of "immediate flow" on Tee-streams + +A "tee stream" is a stream piping to multiple destinations: + +```js +const tee = new Minipass() +t.pipe(dest1) +t.pipe(dest2) +t.write('foo') // goes to both destinations +``` + +Since Minipass streams _immediately_ process any pending data +through the pipeline when a new pipe destination is added, this +can have surprising effects, especially when a stream comes in +from some other function and may or may not have data in its +buffer. + +```js +// WARNING! WILL LOSE DATA! +const src = new Minipass() +src.write('foo') +src.pipe(dest1) // 'foo' chunk flows to dest1 immediately, and is gone +src.pipe(dest2) // gets nothing! +``` + +One solution is to create a dedicated tee-stream junction that +pipes to both locations, and then pipe to _that_ instead. + +```js +// Safe example: tee to both places +const src = new Minipass() +src.write('foo') +const tee = new Minipass() +tee.pipe(dest1) +tee.pipe(dest2) +src.pipe(tee) // tee gets 'foo', pipes to both locations +``` + +The same caveat applies to `on('data')` event listeners. The +first one added will _immediately_ receive all of the data, +leaving nothing for the second: + +```js +// WARNING! WILL LOSE DATA! +const src = new Minipass() +src.write('foo') +src.on('data', handler1) // receives 'foo' right away +src.on('data', handler2) // nothing to see here! +``` + +Using a dedicated tee-stream can be used in this case as well: + +```js +// Safe example: tee to both data handlers +const src = new Minipass() +src.write('foo') +const tee = new Minipass() +tee.on('data', handler1) +tee.on('data', handler2) +src.pipe(tee) +``` + +All of the hazards in this section are avoided by setting `{ +async: true }` in the Minipass constructor, or by setting +`stream.async = true` afterwards. Note that this does add some +overhead, so should only be done in cases where you are willing +to lose a bit of performance in order to avoid having to refactor +program logic. + +## USAGE + +It's a stream! Use it like a stream and it'll most likely do what +you want. + +```js +import { Minipass } from 'minipass' +const mp = new Minipass(options) // options is optional +mp.write('foo') +mp.pipe(someOtherStream) +mp.end('bar') +``` + +### OPTIONS + +- `encoding` How would you like the data coming _out_ of the + stream to be encoded? Accepts any values that can be passed to + `Buffer.toString()`. +- `objectMode` Emit data exactly as it comes in. This will be + flipped on by default if you write() something other than a + string or Buffer at any point. Setting `objectMode: true` will + prevent setting any encoding value. +- `async` Defaults to `false`. Set to `true` to defer data + emission until next tick. This reduces performance slightly, + but makes Minipass streams use timing behavior closer to Node + core streams. See [Timing](#timing) for more details. +- `signal` An `AbortSignal` that will cause the stream to unhook + itself from everything and become as inert as possible. Note + that providing a `signal` parameter will make `'error'` events + no longer throw if they are unhandled, but they will still be + emitted to handlers if any are attached. + +### API + +Implements the user-facing portions of Node.js's `Readable` and +`Writable` streams. + +### Methods + +- `write(chunk, [encoding], [callback])` - Put data in. (Note + that, in the base Minipass class, the same data will come out.) + Returns `false` if the stream will buffer the next write, or + true if it's still in "flowing" mode. +- `end([chunk, [encoding]], [callback])` - Signal that you have + no more data to write. This will queue an `end` event to be + fired when all the data has been consumed. +- `pause()` - No more data for a while, please. This also + prevents `end` from being emitted for empty streams until the + stream is resumed. +- `resume()` - Resume the stream. If there's data in the buffer, + it is all discarded. Any buffered events are immediately + emitted. +- `pipe(dest)` - Send all output to the stream provided. When + data is emitted, it is immediately written to any and all pipe + destinations. (Or written on next tick in `async` mode.) +- `unpipe(dest)` - Stop piping to the destination stream. This is + immediate, meaning that any asynchronously queued data will + _not_ make it to the destination when running in `async` mode. + - `options.end` - Boolean, end the destination stream when the + source stream ends. Default `true`. + - `options.proxyErrors` - Boolean, proxy `error` events from + the source stream to the destination stream. Note that errors + are _not_ proxied after the pipeline terminates, either due + to the source emitting `'end'` or manually unpiping with + `src.unpipe(dest)`. Default `false`. +- `on(ev, fn)`, `emit(ev, fn)` - Minipass streams are + EventEmitters. Some events are given special treatment, + however. (See below under "events".) +- `promise()` - Returns a Promise that resolves when the stream + emits `end`, or rejects if the stream emits `error`. +- `collect()` - Return a Promise that resolves on `end` with an + array containing each chunk of data that was emitted, or + rejects if the stream emits `error`. Note that this consumes + the stream data. +- `concat()` - Same as `collect()`, but concatenates the data + into a single Buffer object. Will reject the returned promise + if the stream is in objectMode, or if it goes into objectMode + by the end of the data. +- `read(n)` - Consume `n` bytes of data out of the buffer. If `n` + is not provided, then consume all of it. If `n` bytes are not + available, then it returns null. **Note** consuming streams in + this way is less efficient, and can lead to unnecessary Buffer + copying. +- `destroy([er])` - Destroy the stream. If an error is provided, + then an `'error'` event is emitted. If the stream has a + `close()` method, and has not emitted a `'close'` event yet, + then `stream.close()` will be called. Any Promises returned by + `.promise()`, `.collect()` or `.concat()` will be rejected. + After being destroyed, writing to the stream will emit an + error. No more data will be emitted if the stream is destroyed, + even if it was previously buffered. + +### Properties + +- `bufferLength` Read-only. Total number of bytes buffered, or in + the case of objectMode, the total number of objects. +- `encoding` Read-only. The encoding that has been set. +- `flowing` Read-only. Boolean indicating whether a chunk written + to the stream will be immediately emitted. +- `emittedEnd` Read-only. Boolean indicating whether the end-ish + events (ie, `end`, `prefinish`, `finish`) have been emitted. + Note that listening on any end-ish event will immediateyl + re-emit it if it has already been emitted. +- `writable` Whether the stream is writable. Default `true`. Set + to `false` when `end()` +- `readable` Whether the stream is readable. Default `true`. +- `pipes` An array of Pipe objects referencing streams that this + stream is piping into. +- `destroyed` A getter that indicates whether the stream was + destroyed. +- `paused` True if the stream has been explicitly paused, + otherwise false. +- `objectMode` Indicates whether the stream is in `objectMode`. +- `aborted` Readonly property set when the `AbortSignal` + dispatches an `abort` event. + +### Events + +- `data` Emitted when there's data to read. Argument is the data + to read. This is never emitted while not flowing. If a listener + is attached, that will resume the stream. +- `end` Emitted when there's no more data to read. This will be + emitted immediately for empty streams when `end()` is called. + If a listener is attached, and `end` was already emitted, then + it will be emitted again. All listeners are removed when `end` + is emitted. +- `prefinish` An end-ish event that follows the same logic as + `end` and is emitted in the same conditions where `end` is + emitted. Emitted after `'end'`. +- `finish` An end-ish event that follows the same logic as `end` + and is emitted in the same conditions where `end` is emitted. + Emitted after `'prefinish'`. +- `close` An indication that an underlying resource has been + released. Minipass does not emit this event, but will defer it + until after `end` has been emitted, since it throws off some + stream libraries otherwise. +- `drain` Emitted when the internal buffer empties, and it is + again suitable to `write()` into the stream. +- `readable` Emitted when data is buffered and ready to be read + by a consumer. +- `resume` Emitted when stream changes state from buffering to + flowing mode. (Ie, when `resume` is called, `pipe` is called, + or a `data` event listener is added.) + +### Static Methods + +- `Minipass.isStream(stream)` Returns `true` if the argument is a + stream, and false otherwise. To be considered a stream, the + object must be either an instance of Minipass, or an + EventEmitter that has either a `pipe()` method, or both + `write()` and `end()` methods. (Pretty much any stream in + node-land will return `true` for this.) + +## EXAMPLES + +Here are some examples of things you can do with Minipass +streams. + +### simple "are you done yet" promise + +```js +mp.promise().then( + () => { + // stream is finished + }, + er => { + // stream emitted an error + } +) +``` + +### collecting + +```js +mp.collect().then(all => { + // all is an array of all the data emitted + // encoding is supported in this case, so + // so the result will be a collection of strings if + // an encoding is specified, or buffers/objects if not. + // + // In an async function, you may do + // const data = await stream.collect() +}) +``` + +### collecting into a single blob + +This is a bit slower because it concatenates the data into one +chunk for you, but if you're going to do it yourself anyway, it's +convenient this way: + +```js +mp.concat().then(onebigchunk => { + // onebigchunk is a string if the stream + // had an encoding set, or a buffer otherwise. +}) +``` + +### iteration + +You can iterate over streams synchronously or asynchronously in +platforms that support it. + +Synchronous iteration will end when the currently available data +is consumed, even if the `end` event has not been reached. In +string and buffer mode, the data is concatenated, so unless +multiple writes are occurring in the same tick as the `read()`, +sync iteration loops will generally only have a single iteration. + +To consume chunks in this way exactly as they have been written, +with no flattening, create the stream with the `{ objectMode: +true }` option. + +```js +const mp = new Minipass({ objectMode: true }) +mp.write('a') +mp.write('b') +for (let letter of mp) { + console.log(letter) // a, b +} +mp.write('c') +mp.write('d') +for (let letter of mp) { + console.log(letter) // c, d +} +mp.write('e') +mp.end() +for (let letter of mp) { + console.log(letter) // e +} +for (let letter of mp) { + console.log(letter) // nothing +} +``` + +Asynchronous iteration will continue until the end event is reached, +consuming all of the data. + +```js +const mp = new Minipass({ encoding: 'utf8' }) + +// some source of some data +let i = 5 +const inter = setInterval(() => { + if (i-- > 0) mp.write(Buffer.from('foo\n', 'utf8')) + else { + mp.end() + clearInterval(inter) + } +}, 100) + +// consume the data with asynchronous iteration +async function consume() { + for await (let chunk of mp) { + console.log(chunk) + } + return 'ok' +} + +consume().then(res => console.log(res)) +// logs `foo\n` 5 times, and then `ok` +``` + +### subclass that `console.log()`s everything written into it + +```js +class Logger extends Minipass { + write(chunk, encoding, callback) { + console.log('WRITE', chunk, encoding) + return super.write(chunk, encoding, callback) + } + end(chunk, encoding, callback) { + console.log('END', chunk, encoding) + return super.end(chunk, encoding, callback) + } +} + +someSource.pipe(new Logger()).pipe(someDest) +``` + +### same thing, but using an inline anonymous class + +```js +// js classes are fun +someSource + .pipe( + new (class extends Minipass { + emit(ev, ...data) { + // let's also log events, because debugging some weird thing + console.log('EMIT', ev) + return super.emit(ev, ...data) + } + write(chunk, encoding, callback) { + console.log('WRITE', chunk, encoding) + return super.write(chunk, encoding, callback) + } + end(chunk, encoding, callback) { + console.log('END', chunk, encoding) + return super.end(chunk, encoding, callback) + } + })() + ) + .pipe(someDest) +``` + +### subclass that defers 'end' for some reason + +```js +class SlowEnd extends Minipass { + emit(ev, ...args) { + if (ev === 'end') { + console.log('going to end, hold on a sec') + setTimeout(() => { + console.log('ok, ready to end now') + super.emit('end', ...args) + }, 100) + return true + } else { + return super.emit(ev, ...args) + } + } +} +``` + +### transform that creates newline-delimited JSON + +```js +class NDJSONEncode extends Minipass { + write(obj, cb) { + try { + // JSON.stringify can throw, emit an error on that + return super.write(JSON.stringify(obj) + '\n', 'utf8', cb) + } catch (er) { + this.emit('error', er) + } + } + end(obj, cb) { + if (typeof obj === 'function') { + cb = obj + obj = undefined + } + if (obj !== undefined) { + this.write(obj) + } + return super.end(cb) + } +} +``` + +### transform that parses newline-delimited JSON + +```js +class NDJSONDecode extends Minipass { + constructor(options) { + // always be in object mode, as far as Minipass is concerned + super({ objectMode: true }) + this._jsonBuffer = '' + } + write(chunk, encoding, cb) { + if ( + typeof chunk === 'string' && + typeof encoding === 'string' && + encoding !== 'utf8' + ) { + chunk = Buffer.from(chunk, encoding).toString() + } else if (Buffer.isBuffer(chunk)) { + chunk = chunk.toString() + } + if (typeof encoding === 'function') { + cb = encoding + } + const jsonData = (this._jsonBuffer + chunk).split('\n') + this._jsonBuffer = jsonData.pop() + for (let i = 0; i < jsonData.length; i++) { + try { + // JSON.parse can throw, emit an error on that + super.write(JSON.parse(jsonData[i])) + } catch (er) { + this.emit('error', er) + continue + } + } + if (cb) cb() + } +} +``` diff --git a/node_modules/minipass/dist/commonjs/index.d.ts b/node_modules/minipass/dist/commonjs/index.d.ts new file mode 100644 index 0000000..3e75b57 --- /dev/null +++ b/node_modules/minipass/dist/commonjs/index.d.ts @@ -0,0 +1,545 @@ +import { EventEmitter } from 'node:events'; +import { StringDecoder } from 'node:string_decoder'; +/** + * Same as StringDecoder, but exposing the `lastNeed` flag on the type + */ +type SD = StringDecoder & { + lastNeed: boolean; +}; +export type { SD, Pipe, PipeProxyErrors }; +/** + * Return true if the argument is a Minipass stream, Node stream, or something + * else that Minipass can interact with. + */ +export declare const isStream: (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & { + end(): any; + write(chunk: any, ...args: any[]): any; +}) | (EventEmitter & { + pause(): any; + resume(): any; + pipe(...destArgs: any[]): any; +}) | (NodeJS.ReadStream & { + fd: number; +}) | (NodeJS.WriteStream & { + fd: number; +}); +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +export declare const isReadable: (s: any) => s is Minipass.Readable; +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +export declare const isWritable: (s: any) => s is Minipass.Readable; +declare const EOF: unique symbol; +declare const MAYBE_EMIT_END: unique symbol; +declare const EMITTED_END: unique symbol; +declare const EMITTING_END: unique symbol; +declare const EMITTED_ERROR: unique symbol; +declare const CLOSED: unique symbol; +declare const READ: unique symbol; +declare const FLUSH: unique symbol; +declare const FLUSHCHUNK: unique symbol; +declare const ENCODING: unique symbol; +declare const DECODER: unique symbol; +declare const FLOWING: unique symbol; +declare const PAUSED: unique symbol; +declare const RESUME: unique symbol; +declare const BUFFER: unique symbol; +declare const PIPES: unique symbol; +declare const BUFFERLENGTH: unique symbol; +declare const BUFFERPUSH: unique symbol; +declare const BUFFERSHIFT: unique symbol; +declare const OBJECTMODE: unique symbol; +declare const DESTROYED: unique symbol; +declare const ERROR: unique symbol; +declare const EMITDATA: unique symbol; +declare const EMITEND: unique symbol; +declare const EMITEND2: unique symbol; +declare const ASYNC: unique symbol; +declare const ABORT: unique symbol; +declare const ABORTED: unique symbol; +declare const SIGNAL: unique symbol; +declare const DATALISTENERS: unique symbol; +declare const DISCARDED: unique symbol; +/** + * Options that may be passed to stream.pipe() + */ +export interface PipeOptions { + /** + * end the destination stream when the source stream ends + */ + end?: boolean; + /** + * proxy errors from the source stream to the destination stream + */ + proxyErrors?: boolean; +} +/** + * Internal class representing a pipe to a destination stream. + * + * @internal + */ +declare class Pipe { + src: Minipass; + dest: Minipass; + opts: PipeOptions; + ondrain: () => any; + constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions); + unpipe(): void; + proxyErrors(_er: any): void; + end(): void; +} +/** + * Internal class representing a pipe to a destination stream where + * errors are proxied. + * + * @internal + */ +declare class PipeProxyErrors extends Pipe { + unpipe(): void; + constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions); +} +export declare namespace Minipass { + /** + * Encoding used to create a stream that outputs strings rather than + * Buffer objects. + */ + export type Encoding = BufferEncoding | 'buffer' | null; + /** + * Any stream that Minipass can pipe into + */ + export type Writable = Minipass | NodeJS.WriteStream | (NodeJS.WriteStream & { + fd: number; + }) | (EventEmitter & { + end(): any; + write(chunk: any, ...args: any[]): any; + }); + /** + * Any stream that can be read from + */ + export type Readable = Minipass | NodeJS.ReadStream | (NodeJS.ReadStream & { + fd: number; + }) | (EventEmitter & { + pause(): any; + resume(): any; + pipe(...destArgs: any[]): any; + }); + /** + * Utility type that can be iterated sync or async + */ + export type DualIterable = Iterable & AsyncIterable; + type EventArguments = Record; + /** + * The listing of events that a Minipass class can emit. + * Extend this when extending the Minipass class, and pass as + * the third template argument. The key is the name of the event, + * and the value is the argument list. + * + * Any undeclared events will still be allowed, but the handler will get + * arguments as `unknown[]`. + */ + export interface Events extends EventArguments { + readable: []; + data: [chunk: RType]; + error: [er: unknown]; + abort: [reason: unknown]; + drain: []; + resume: []; + end: []; + finish: []; + prefinish: []; + close: []; + [DESTROYED]: [er?: unknown]; + [ERROR]: [er: unknown]; + } + /** + * String or buffer-like data that can be joined and sliced + */ + export type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string; + export type BufferOrString = Buffer | string; + /** + * Options passed to the Minipass constructor. + */ + export type SharedOptions = { + /** + * Defer all data emission and other events until the end of the + * current tick, similar to Node core streams + */ + async?: boolean; + /** + * A signal which will abort the stream + */ + signal?: AbortSignal; + /** + * Output string encoding. Set to `null` or `'buffer'` (or omit) to + * emit Buffer objects rather than strings. + * + * Conflicts with `objectMode` + */ + encoding?: BufferEncoding | null | 'buffer'; + /** + * Output data exactly as it was written, supporting non-buffer/string + * data (such as arbitrary objects, falsey values, etc.) + * + * Conflicts with `encoding` + */ + objectMode?: boolean; + }; + /** + * Options for a string encoded output + */ + export type EncodingOptions = SharedOptions & { + encoding: BufferEncoding; + objectMode?: false; + }; + /** + * Options for contiguous data buffer output + */ + export type BufferOptions = SharedOptions & { + encoding?: null | 'buffer'; + objectMode?: false; + }; + /** + * Options for objectMode arbitrary output + */ + export type ObjectModeOptions = SharedOptions & { + objectMode: true; + encoding?: null; + }; + /** + * Utility type to determine allowed options based on read type + */ + export type Options = ObjectModeOptions | (T extends string ? EncodingOptions : T extends Buffer ? BufferOptions : SharedOptions); + export {}; +} +/** + * Main export, the Minipass class + * + * `RType` is the type of data emitted, defaults to Buffer + * + * `WType` is the type of data to be written, if RType is buffer or string, + * then any {@link Minipass.ContiguousData} is allowed. + * + * `Events` is the set of event handler signatures that this object + * will emit, see {@link Minipass.Events} + */ +export declare class Minipass = Minipass.Events> extends EventEmitter implements Minipass.DualIterable { + [FLOWING]: boolean; + [PAUSED]: boolean; + [PIPES]: Pipe[]; + [BUFFER]: RType[]; + [OBJECTMODE]: boolean; + [ENCODING]: BufferEncoding | null; + [ASYNC]: boolean; + [DECODER]: SD | null; + [EOF]: boolean; + [EMITTED_END]: boolean; + [EMITTING_END]: boolean; + [CLOSED]: boolean; + [EMITTED_ERROR]: unknown; + [BUFFERLENGTH]: number; + [DESTROYED]: boolean; + [SIGNAL]?: AbortSignal; + [ABORTED]: boolean; + [DATALISTENERS]: number; + [DISCARDED]: boolean; + /** + * true if the stream can be written + */ + writable: boolean; + /** + * true if the stream can be read + */ + readable: boolean; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args: [Minipass.ObjectModeOptions] | (RType extends Buffer ? [] | [Minipass.Options] : [Minipass.Options])); + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ + get bufferLength(): number; + /** + * The `BufferEncoding` currently in use, or `null` + */ + get encoding(): BufferEncoding | null; + /** + * @deprecated - This is a read only property + */ + set encoding(_enc: BufferEncoding | null); + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc: Minipass.Encoding): void; + /** + * True if this is an objectMode stream + */ + get objectMode(): boolean; + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om: boolean); + /** + * true if this is an async stream + */ + get ['async'](): boolean; + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ + set ['async'](a: boolean); + [ABORT](): void; + /** + * True if the stream has been aborted. + */ + get aborted(): boolean; + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_: boolean); + /** + * Write data into the stream + * + * If the chunk written is a string, and encoding is not specified, then + * `utf8` will be assumed. If the stream encoding matches the encoding of + * a written string, and the state of the string decoder allows it, then + * the string will be passed through to either the output or the internal + * buffer without any processing. Otherwise, it will be turned into a + * Buffer object for processing into the desired encoding. + * + * If provided, `cb` function is called immediately before return for + * sync streams, or on next tick for async streams, because for this + * base class, a chunk is considered "processed" once it is accepted + * and either emitted or buffered. That is, the callback does not indicate + * that the chunk has been eventually emitted, though of course child + * classes can override this function to do whatever processing is required + * and call `super.write(...)` only once processing is completed. + */ + write(chunk: WType, cb?: () => void): boolean; + write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean; + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ + read(n?: number | null): RType | null; + [READ](n: number | null, chunk: RType): RType; + /** + * End the stream, optionally providing a final write. + * + * See {@link Minipass#write} for argument descriptions + */ + end(cb?: () => void): this; + end(chunk: WType, cb?: () => void): this; + end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this; + [RESUME](): void; + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ + resume(): void; + /** + * Pause the stream + */ + pause(): void; + /** + * true if the stream has been forcibly destroyed + */ + get destroyed(): boolean; + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ + get flowing(): boolean; + /** + * true if the stream is currently in a paused state + */ + get paused(): boolean; + [BUFFERPUSH](chunk: RType): void; + [BUFFERSHIFT](): RType; + [FLUSH](noDrain?: boolean): void; + [FLUSHCHUNK](chunk: RType): boolean; + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ + pipe(dest: W, opts?: PipeOptions): W; + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + unpipe(dest: W): void; + /** + * Alias for {@link Minipass#on} + */ + addListener(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev?: Event): this; + /** + * true if the 'end' event has been emitted + */ + get emittedEnd(): boolean; + [MAYBE_EMIT_END](): void; + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev: Event, ...args: Events[Event]): boolean; + [EMITDATA](data: RType): boolean; + [EMITEND](): boolean; + [EMITEND2](): boolean; + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + collect(): Promise; + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + concat(): Promise; + /** + * Return a void Promise that resolves once the stream ends. + */ + promise(): Promise; + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator](): AsyncGenerator; + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator](): Generator; + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ + destroy(er?: unknown): this; + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream(): (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & { + end(): any; + write(chunk: any, ...args: any[]): any; + }) | (EventEmitter & { + pause(): any; + resume(): any; + pipe(...destArgs: any[]): any; + }) | (NodeJS.ReadStream & { + fd: number; + }) | (NodeJS.WriteStream & { + fd: number; + }); +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/minipass/dist/commonjs/index.d.ts.map b/node_modules/minipass/dist/commonjs/index.d.ts.map new file mode 100644 index 0000000..7bce611 --- /dev/null +++ b/node_modules/minipass/dist/commonjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n typeof process === 'object' && process\n ? process\n : {\n stdout: null,\n stderr: null,\n }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n s: any\n): s is Minipass.Readable | Minipass.Writable =>\n !!s &&\n typeof s === 'object' &&\n (s instanceof Minipass ||\n s instanceof Stream ||\n isReadable(s) ||\n isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Readable).pipe === 'function' &&\n // node core Writable streams have a pipe() method, but it throws\n (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Writable).write === 'function' &&\n typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n b instanceof ArrayBuffer ||\n (!!b &&\n typeof b === 'object' &&\n b.constructor &&\n b.constructor.name === 'ArrayBuffer' &&\n b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n /**\n * end the destination stream when the source stream ends\n */\n end?: boolean\n /**\n * proxy errors from the source stream to the destination stream\n */\n proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n src: Minipass\n dest: Minipass\n opts: PipeOptions\n ondrain: () => any\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n this.src = src\n this.dest = dest as Minipass\n this.opts = opts\n this.ondrain = () => src[RESUME]()\n this.dest.on('drain', this.ondrain)\n }\n unpipe() {\n this.dest.removeListener('drain', this.ondrain)\n }\n // only here for the prototype\n /* c8 ignore start */\n proxyErrors(_er: any) {}\n /* c8 ignore stop */\n end() {\n this.unpipe()\n if (this.opts.end) this.dest.end()\n }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n unpipe() {\n this.src.removeListener('error', this.proxyErrors)\n super.unpipe()\n }\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n super(src, dest, opts)\n this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n src.on('error', this.proxyErrors)\n }\n}\n\nexport namespace Minipass {\n /**\n * Encoding used to create a stream that outputs strings rather than\n * Buffer objects.\n */\n export type Encoding = BufferEncoding | 'buffer' | null\n\n /**\n * Any stream that Minipass can pipe into\n */\n export type Writable =\n | Minipass\n | NodeJS.WriteStream\n | (NodeJS.WriteStream & { fd: number })\n | (EventEmitter & {\n end(): any\n write(chunk: any, ...args: any[]): any\n })\n\n /**\n * Any stream that can be read from\n */\n export type Readable =\n | Minipass\n | NodeJS.ReadStream\n | (NodeJS.ReadStream & { fd: number })\n | (EventEmitter & {\n pause(): any\n resume(): any\n pipe(...destArgs: any[]): any\n })\n\n /**\n * Utility type that can be iterated sync or async\n */\n export type DualIterable = Iterable & AsyncIterable\n\n type EventArguments = Record\n\n /**\n * The listing of events that a Minipass class can emit.\n * Extend this when extending the Minipass class, and pass as\n * the third template argument. The key is the name of the event,\n * and the value is the argument list.\n *\n * Any undeclared events will still be allowed, but the handler will get\n * arguments as `unknown[]`.\n */\n export interface Events\n extends EventArguments {\n readable: []\n data: [chunk: RType]\n error: [er: unknown]\n abort: [reason: unknown]\n drain: []\n resume: []\n end: []\n finish: []\n prefinish: []\n close: []\n [DESTROYED]: [er?: unknown]\n [ERROR]: [er: unknown]\n }\n\n /**\n * String or buffer-like data that can be joined and sliced\n */\n export type ContiguousData =\n | Buffer\n | ArrayBufferLike\n | ArrayBufferView\n | string\n export type BufferOrString = Buffer | string\n\n /**\n * Options passed to the Minipass constructor.\n */\n export type SharedOptions = {\n /**\n * Defer all data emission and other events until the end of the\n * current tick, similar to Node core streams\n */\n async?: boolean\n /**\n * A signal which will abort the stream\n */\n signal?: AbortSignal\n /**\n * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n * emit Buffer objects rather than strings.\n *\n * Conflicts with `objectMode`\n */\n encoding?: BufferEncoding | null | 'buffer'\n /**\n * Output data exactly as it was written, supporting non-buffer/string\n * data (such as arbitrary objects, falsey values, etc.)\n *\n * Conflicts with `encoding`\n */\n objectMode?: boolean\n }\n\n /**\n * Options for a string encoded output\n */\n export type EncodingOptions = SharedOptions & {\n encoding: BufferEncoding\n objectMode?: false\n }\n\n /**\n * Options for contiguous data buffer output\n */\n export type BufferOptions = SharedOptions & {\n encoding?: null | 'buffer'\n objectMode?: false\n }\n\n /**\n * Options for objectMode arbitrary output\n */\n export type ObjectModeOptions = SharedOptions & {\n objectMode: true\n encoding?: null\n }\n\n /**\n * Utility type to determine allowed options based on read type\n */\n export type Options =\n | ObjectModeOptions\n | (T extends string\n ? EncodingOptions\n : T extends Buffer\n ? BufferOptions\n : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n RType extends unknown = Buffer,\n WType extends unknown = RType extends Minipass.BufferOrString\n ? Minipass.ContiguousData\n : RType,\n Events extends Minipass.Events = Minipass.Events\n >\n extends EventEmitter\n implements Minipass.DualIterable\n{\n [FLOWING]: boolean = false;\n [PAUSED]: boolean = false;\n [PIPES]: Pipe[] = [];\n [BUFFER]: RType[] = [];\n [OBJECTMODE]: boolean;\n [ENCODING]: BufferEncoding | null;\n [ASYNC]: boolean;\n [DECODER]: SD | null;\n [EOF]: boolean = false;\n [EMITTED_END]: boolean = false;\n [EMITTING_END]: boolean = false;\n [CLOSED]: boolean = false;\n [EMITTED_ERROR]: unknown = null;\n [BUFFERLENGTH]: number = 0;\n [DESTROYED]: boolean = false;\n [SIGNAL]?: AbortSignal;\n [ABORTED]: boolean = false;\n [DATALISTENERS]: number = 0;\n [DISCARDED]: boolean = false\n\n /**\n * true if the stream can be written\n */\n writable: boolean = true\n /**\n * true if the stream can be read\n */\n readable: boolean = true\n\n /**\n * If `RType` is Buffer, then options do not need to be provided.\n * Otherwise, an options object must be provided to specify either\n * {@link Minipass.SharedOptions.objectMode} or\n * {@link Minipass.SharedOptions.encoding}, as appropriate.\n */\n constructor(\n ...args:\n | [Minipass.ObjectModeOptions]\n | (RType extends Buffer\n ? [] | [Minipass.Options]\n : [Minipass.Options])\n ) {\n const options: Minipass.Options = (args[0] ||\n {}) as Minipass.Options\n super()\n if (options.objectMode && typeof options.encoding === 'string') {\n throw new TypeError(\n 'Encoding and objectMode may not be used together'\n )\n }\n if (isObjectModeOptions(options)) {\n this[OBJECTMODE] = true\n this[ENCODING] = null\n } else if (isEncodingOptions(options)) {\n this[ENCODING] = options.encoding\n this[OBJECTMODE] = false\n } else {\n this[OBJECTMODE] = false\n this[ENCODING] = null\n }\n this[ASYNC] = !!options.async\n this[DECODER] = this[ENCODING]\n ? (new StringDecoder(this[ENCODING]) as SD)\n : null\n\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposeBuffer === true) {\n Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n }\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposePipes === true) {\n Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n }\n\n const { signal } = options\n if (signal) {\n this[SIGNAL] = signal\n if (signal.aborted) {\n this[ABORT]()\n } else {\n signal.addEventListener('abort', () => this[ABORT]())\n }\n }\n }\n\n /**\n * The amount of data stored in the buffer waiting to be read.\n *\n * For Buffer strings, this will be the total byte length.\n * For string encoding streams, this will be the string character length,\n * according to JavaScript's `string.length` logic.\n * For objectMode streams, this is a count of the items waiting to be\n * emitted.\n */\n get bufferLength() {\n return this[BUFFERLENGTH]\n }\n\n /**\n * The `BufferEncoding` currently in use, or `null`\n */\n get encoding() {\n return this[ENCODING]\n }\n\n /**\n * @deprecated - This is a read only property\n */\n set encoding(_enc) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * @deprecated - Encoding may only be set at instantiation time\n */\n setEncoding(_enc: Minipass.Encoding) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * True if this is an objectMode stream\n */\n get objectMode() {\n return this[OBJECTMODE]\n }\n\n /**\n * @deprecated - This is a read-only property\n */\n set objectMode(_om) {\n throw new Error('objectMode must be set at instantiation time')\n }\n\n /**\n * true if this is an async stream\n */\n get ['async'](): boolean {\n return this[ASYNC]\n }\n /**\n * Set to true to make this stream async.\n *\n * Once set, it cannot be unset, as this would potentially cause incorrect\n * behavior. Ie, a sync stream can be made async, but an async stream\n * cannot be safely made sync.\n */\n set ['async'](a: boolean) {\n this[ASYNC] = this[ASYNC] || !!a\n }\n\n // drop everything and get out of the flow completely\n [ABORT]() {\n this[ABORTED] = true\n this.emit('abort', this[SIGNAL]?.reason)\n this.destroy(this[SIGNAL]?.reason)\n }\n\n /**\n * True if the stream has been aborted.\n */\n get aborted() {\n return this[ABORTED]\n }\n /**\n * No-op setter. Stream aborted status is set via the AbortSignal provided\n * in the constructor options.\n */\n set aborted(_) {}\n\n /**\n * Write data into the stream\n *\n * If the chunk written is a string, and encoding is not specified, then\n * `utf8` will be assumed. If the stream encoding matches the encoding of\n * a written string, and the state of the string decoder allows it, then\n * the string will be passed through to either the output or the internal\n * buffer without any processing. Otherwise, it will be turned into a\n * Buffer object for processing into the desired encoding.\n *\n * If provided, `cb` function is called immediately before return for\n * sync streams, or on next tick for async streams, because for this\n * base class, a chunk is considered \"processed\" once it is accepted\n * and either emitted or buffered. That is, the callback does not indicate\n * that the chunk has been eventually emitted, though of course child\n * classes can override this function to do whatever processing is required\n * and call `super.write(...)` only once processing is completed.\n */\n write(chunk: WType, cb?: () => void): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding,\n cb?: () => void\n ): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): boolean {\n if (this[ABORTED]) return false\n if (this[EOF]) throw new Error('write after end')\n\n if (this[DESTROYED]) {\n this.emit(\n 'error',\n Object.assign(\n new Error('Cannot call write after a stream was destroyed'),\n { code: 'ERR_STREAM_DESTROYED' }\n )\n )\n return true\n }\n\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n\n if (!encoding) encoding = 'utf8'\n\n const fn = this[ASYNC] ? defer : nodefer\n\n // convert array buffers and typed array views into buffers\n // at some point in the future, we may want to do the opposite!\n // leave strings and buffers as-is\n // anything is only allowed if in object mode, so throw\n if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n if (isArrayBufferView(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(\n chunk.buffer,\n chunk.byteOffset,\n chunk.byteLength\n )\n } else if (isArrayBufferLike(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(chunk)\n } else if (typeof chunk !== 'string') {\n throw new Error(\n 'Non-contiguous data written to non-objectMode stream'\n )\n }\n }\n\n // handle object mode up front, since it's simpler\n // this yields better performance, fewer checks later.\n if (this[OBJECTMODE]) {\n // maybe impossible?\n /* c8 ignore start */\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n /* c8 ignore stop */\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n // at this point the chunk is a buffer or string\n // don't buffer it up or send it to the decoder\n if (!(chunk as Minipass.BufferOrString).length) {\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n if (cb) fn(cb)\n return this[FLOWING]\n }\n\n // fast-path writing strings of same encoding to a stream with\n // an empty buffer, skipping the buffer/decoder dance\n if (\n typeof chunk === 'string' &&\n // unless it is a string already ready for us to use\n !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n ) {\n //@ts-ignore - sinful unsafe type change\n chunk = Buffer.from(chunk, encoding)\n }\n\n if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n //@ts-ignore - sinful unsafe type change\n chunk = this[DECODER].write(chunk)\n }\n\n // Note: flushing CAN potentially switch us into not-flowing mode\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n /**\n * Low-level explicit read method.\n *\n * In objectMode, the argument is ignored, and one item is returned if\n * available.\n *\n * `n` is the number of bytes (or in the case of encoding streams,\n * characters) to consume. If `n` is not provided, then the entire buffer\n * is returned, or `null` is returned if no data is available.\n *\n * If `n` is greater that the amount of data in the internal buffer,\n * then `null` is returned.\n */\n read(n?: number | null): RType | null {\n if (this[DESTROYED]) return null\n this[DISCARDED] = false\n\n if (\n this[BUFFERLENGTH] === 0 ||\n n === 0 ||\n (n && n > this[BUFFERLENGTH])\n ) {\n this[MAYBE_EMIT_END]()\n return null\n }\n\n if (this[OBJECTMODE]) n = null\n\n if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n // not object mode, so if we have an encoding, then RType is string\n // otherwise, must be Buffer\n this[BUFFER] = [\n (this[ENCODING]\n ? this[BUFFER].join('')\n : Buffer.concat(\n this[BUFFER] as Buffer[],\n this[BUFFERLENGTH]\n )) as RType,\n ]\n }\n\n const ret = this[READ](n || null, this[BUFFER][0] as RType)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [READ](n: number | null, chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n else {\n const c = chunk as Minipass.BufferOrString\n if (n === c.length || n === null) this[BUFFERSHIFT]()\n else if (typeof c === 'string') {\n this[BUFFER][0] = c.slice(n) as RType\n chunk = c.slice(0, n) as RType\n this[BUFFERLENGTH] -= n\n } else {\n this[BUFFER][0] = c.subarray(n) as RType\n chunk = c.subarray(0, n) as RType\n this[BUFFERLENGTH] -= n\n }\n }\n\n this.emit('data', chunk)\n\n if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n return chunk\n }\n\n /**\n * End the stream, optionally providing a final write.\n *\n * See {@link Minipass#write} for argument descriptions\n */\n end(cb?: () => void): this\n end(chunk: WType, cb?: () => void): this\n end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n end(\n chunk?: WType | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): this {\n if (typeof chunk === 'function') {\n cb = chunk as () => void\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n if (chunk !== undefined) this.write(chunk, encoding)\n if (cb) this.once('end', cb)\n this[EOF] = true\n this.writable = false\n\n // if we haven't written anything, then go ahead and emit,\n // even if we're not reading.\n // we'll re-emit if a new 'end' listener is added anyway.\n // This makes MP more suitable to write-only use cases.\n if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n return this\n }\n\n // don't let the internal resume be overwritten\n [RESUME]() {\n if (this[DESTROYED]) return\n\n if (!this[DATALISTENERS] && !this[PIPES].length) {\n this[DISCARDED] = true\n }\n this[PAUSED] = false\n this[FLOWING] = true\n this.emit('resume')\n if (this[BUFFER].length) this[FLUSH]()\n else if (this[EOF]) this[MAYBE_EMIT_END]()\n else this.emit('drain')\n }\n\n /**\n * Resume the stream if it is currently in a paused state\n *\n * If called when there are no pipe destinations or `data` event listeners,\n * this will place the stream in a \"discarded\" state, where all data will\n * be thrown away. The discarded state is removed if a pipe destination or\n * data handler is added, if pause() is called, or if any synchronous or\n * asynchronous iteration is started.\n */\n resume() {\n return this[RESUME]()\n }\n\n /**\n * Pause the stream\n */\n pause() {\n this[FLOWING] = false\n this[PAUSED] = true\n this[DISCARDED] = false\n }\n\n /**\n * true if the stream has been forcibly destroyed\n */\n get destroyed() {\n return this[DESTROYED]\n }\n\n /**\n * true if the stream is currently in a flowing state, meaning that\n * any writes will be immediately emitted.\n */\n get flowing() {\n return this[FLOWING]\n }\n\n /**\n * true if the stream is currently in a paused state\n */\n get paused() {\n return this[PAUSED]\n }\n\n [BUFFERPUSH](chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n this[BUFFER].push(chunk)\n }\n\n [BUFFERSHIFT](): RType {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n else\n this[BUFFERLENGTH] -= (\n this[BUFFER][0] as Minipass.BufferOrString\n ).length\n return this[BUFFER].shift() as RType\n }\n\n [FLUSH](noDrain: boolean = false) {\n do {} while (\n this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n this[BUFFER].length\n )\n\n if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n }\n\n [FLUSHCHUNK](chunk: RType) {\n this.emit('data', chunk)\n return this[FLOWING]\n }\n\n /**\n * Pipe all data emitted by this stream into the destination provided.\n *\n * Triggers the flow of data.\n */\n pipe(dest: W, opts?: PipeOptions): W {\n if (this[DESTROYED]) return dest\n this[DISCARDED] = false\n\n const ended = this[EMITTED_END]\n opts = opts || {}\n if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n else opts.end = opts.end !== false\n opts.proxyErrors = !!opts.proxyErrors\n\n // piping an ended stream ends immediately\n if (ended) {\n if (opts.end) dest.end()\n } else {\n // \"as\" here just ignores the WType, which pipes don't care about,\n // since they're only consuming from us, and writing to the dest\n this[PIPES].push(\n !opts.proxyErrors\n ? new Pipe(this as Minipass, dest, opts)\n : new PipeProxyErrors(this as Minipass, dest, opts)\n )\n if (this[ASYNC]) defer(() => this[RESUME]())\n else this[RESUME]()\n }\n\n return dest\n }\n\n /**\n * Fully unhook a piped destination stream.\n *\n * If the destination stream was the only consumer of this stream (ie,\n * there are no other piped destinations or `'data'` event listeners)\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n unpipe(dest: W) {\n const p = this[PIPES].find(p => p.dest === dest)\n if (p) {\n if (this[PIPES].length === 1) {\n if (this[FLOWING] && this[DATALISTENERS] === 0) {\n this[FLOWING] = false\n }\n this[PIPES] = []\n } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n p.unpipe()\n }\n }\n\n /**\n * Alias for {@link Minipass#on}\n */\n addListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n return this.on(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.on`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * - Adding a 'data' event handler will trigger the flow of data\n *\n * - Adding a 'readable' event handler when there is data waiting to be read\n * will cause 'readable' to be emitted immediately.\n *\n * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n * already passed will cause the event to be emitted immediately and all\n * handlers removed.\n *\n * - Adding an 'error' event handler after an error has been emitted will\n * cause the event to be re-emitted immediately with the error previously\n * raised.\n */\n on(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n const ret = super.on(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n if (ev === 'data') {\n this[DISCARDED] = false\n this[DATALISTENERS]++\n if (!this[PIPES].length && !this[FLOWING]) {\n this[RESUME]()\n }\n } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n super.emit('readable')\n } else if (isEndish(ev) && this[EMITTED_END]) {\n super.emit(ev)\n this.removeAllListeners(ev)\n } else if (ev === 'error' && this[EMITTED_ERROR]) {\n const h = handler as (...a: Events['error']) => any\n if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n else h.call(this, this[EMITTED_ERROR])\n }\n return ret\n }\n\n /**\n * Alias for {@link Minipass#off}\n */\n removeListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n return this.off(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.off`\n *\n * If a 'data' event handler is removed, and it was the last consumer\n * (ie, there are no pipe destinations or other 'data' event listeners),\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n off(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n const ret = super.off(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n // if we previously had listeners, and now we don't, and we don't\n // have any pipes, then stop the flow, unless it's been explicitly\n // put in a discarded flowing state via stream.resume().\n if (ev === 'data') {\n this[DATALISTENERS] = this.listeners('data').length\n if (\n this[DATALISTENERS] === 0 &&\n !this[DISCARDED] &&\n !this[PIPES].length\n ) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * Mostly identical to `EventEmitter.removeAllListeners`\n *\n * If all 'data' event handlers are removed, and they were the last consumer\n * (ie, there are no pipe destinations), then the flow of data will stop\n * until there is another consumer or {@link Minipass#resume} is explicitly\n * called.\n */\n removeAllListeners(ev?: Event) {\n const ret = super.removeAllListeners(ev as string | symbol | undefined)\n if (ev === 'data' || ev === undefined) {\n this[DATALISTENERS] = 0\n if (!this[DISCARDED] && !this[PIPES].length) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * true if the 'end' event has been emitted\n */\n get emittedEnd() {\n return this[EMITTED_END]\n }\n\n [MAYBE_EMIT_END]() {\n if (\n !this[EMITTING_END] &&\n !this[EMITTED_END] &&\n !this[DESTROYED] &&\n this[BUFFER].length === 0 &&\n this[EOF]\n ) {\n this[EMITTING_END] = true\n this.emit('end')\n this.emit('prefinish')\n this.emit('finish')\n if (this[CLOSED]) this.emit('close')\n this[EMITTING_END] = false\n }\n }\n\n /**\n * Mostly identical to `EventEmitter.emit`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * If the stream has been destroyed, and the event is something other\n * than 'close' or 'error', then `false` is returned and no handlers\n * are called.\n *\n * If the event is 'end', and has already been emitted, then the event\n * is ignored. If the stream is in a paused or non-flowing state, then\n * the event will be deferred until data flow resumes. If the stream is\n * async, then handlers will be called on the next tick rather than\n * immediately.\n *\n * If the event is 'close', and 'end' has not yet been emitted, then\n * the event will be deferred until after 'end' is emitted.\n *\n * If the event is 'error', and an AbortSignal was provided for the stream,\n * and there are no listeners, then the event is ignored, matching the\n * behavior of node core streams in the presense of an AbortSignal.\n *\n * If the event is 'finish' or 'prefinish', then all listeners will be\n * removed after emitting the event, to prevent double-firing.\n */\n emit(\n ev: Event,\n ...args: Events[Event]\n ): boolean {\n const data = args[0]\n // error and close are only events allowed after calling destroy()\n if (\n ev !== 'error' &&\n ev !== 'close' &&\n ev !== DESTROYED &&\n this[DESTROYED]\n ) {\n return false\n } else if (ev === 'data') {\n return !this[OBJECTMODE] && !data\n ? false\n : this[ASYNC]\n ? (defer(() => this[EMITDATA](data as RType)), true)\n : this[EMITDATA](data as RType)\n } else if (ev === 'end') {\n return this[EMITEND]()\n } else if (ev === 'close') {\n this[CLOSED] = true\n // don't emit close before 'end' and 'finish'\n if (!this[EMITTED_END] && !this[DESTROYED]) return false\n const ret = super.emit('close')\n this.removeAllListeners('close')\n return ret\n } else if (ev === 'error') {\n this[EMITTED_ERROR] = data\n super.emit(ERROR, data)\n const ret =\n !this[SIGNAL] || this.listeners('error').length\n ? super.emit('error', data)\n : false\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'resume') {\n const ret = super.emit('resume')\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'finish' || ev === 'prefinish') {\n const ret = super.emit(ev)\n this.removeAllListeners(ev)\n return ret\n }\n\n // Some other unknown event\n const ret = super.emit(ev as string, ...args)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITDATA](data: RType) {\n for (const p of this[PIPES]) {\n if (p.dest.write(data as RType) === false) this.pause()\n }\n const ret = this[DISCARDED] ? false : super.emit('data', data)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITEND]() {\n if (this[EMITTED_END]) return false\n\n this[EMITTED_END] = true\n this.readable = false\n return this[ASYNC]\n ? (defer(() => this[EMITEND2]()), true)\n : this[EMITEND2]()\n }\n\n [EMITEND2]() {\n if (this[DECODER]) {\n const data = this[DECODER].end()\n if (data) {\n for (const p of this[PIPES]) {\n p.dest.write(data as RType)\n }\n if (!this[DISCARDED]) super.emit('data', data)\n }\n }\n\n for (const p of this[PIPES]) {\n p.end()\n }\n const ret = super.emit('end')\n this.removeAllListeners('end')\n return ret\n }\n\n /**\n * Return a Promise that resolves to an array of all emitted data once\n * the stream ends.\n */\n async collect(): Promise {\n const buf: RType[] & { dataLength: number } = Object.assign([], {\n dataLength: 0,\n })\n if (!this[OBJECTMODE]) buf.dataLength = 0\n // set the promise first, in case an error is raised\n // by triggering the flow here.\n const p = this.promise()\n this.on('data', c => {\n buf.push(c)\n if (!this[OBJECTMODE])\n buf.dataLength += (c as Minipass.BufferOrString).length\n })\n await p\n return buf\n }\n\n /**\n * Return a Promise that resolves to the concatenation of all emitted data\n * once the stream ends.\n *\n * Not allowed on objectMode streams.\n */\n async concat(): Promise {\n if (this[OBJECTMODE]) {\n throw new Error('cannot concat in objectMode')\n }\n const buf = await this.collect()\n return (\n this[ENCODING]\n ? buf.join('')\n : Buffer.concat(buf as Buffer[], buf.dataLength)\n ) as RType\n }\n\n /**\n * Return a void Promise that resolves once the stream ends.\n */\n async promise(): Promise {\n return new Promise((resolve, reject) => {\n this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n this.on('error', er => reject(er))\n this.on('end', () => resolve())\n })\n }\n\n /**\n * Asynchronous `for await of` iteration.\n *\n * This will continue emitting all chunks until the stream terminates.\n */\n [Symbol.asyncIterator](): AsyncGenerator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = async (): Promise> => {\n this.pause()\n stopped = true\n return { value: undefined, done: true }\n }\n const next = (): Promise> => {\n if (stopped) return stop()\n const res = this.read()\n if (res !== null) return Promise.resolve({ done: false, value: res })\n\n if (this[EOF]) return stop()\n\n let resolve!: (res: IteratorResult) => void\n let reject!: (er: unknown) => void\n const onerr = (er: unknown) => {\n this.off('data', ondata)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n stop()\n reject(er)\n }\n const ondata = (value: RType) => {\n this.off('error', onerr)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n this.pause()\n resolve({ value, done: !!this[EOF] })\n }\n const onend = () => {\n this.off('error', onerr)\n this.off('data', ondata)\n this.off(DESTROYED, ondestroy)\n stop()\n resolve({ done: true, value: undefined })\n }\n const ondestroy = () => onerr(new Error('stream destroyed'))\n return new Promise>((res, rej) => {\n reject = rej\n resolve = res\n this.once(DESTROYED, ondestroy)\n this.once('error', onerr)\n this.once('end', onend)\n this.once('data', ondata)\n })\n }\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.asyncIterator]() {\n return this\n },\n [Symbol.asyncDispose]: async () => {},\n }\n }\n\n /**\n * Synchronous `for of` iteration.\n *\n * The iteration will terminate when the internal buffer runs out, even\n * if the stream has not yet terminated.\n */\n [Symbol.iterator](): Generator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = (): IteratorReturnResult => {\n this.pause()\n this.off(ERROR, stop)\n this.off(DESTROYED, stop)\n this.off('end', stop)\n stopped = true\n return { done: true, value: undefined }\n }\n\n const next = (): IteratorResult => {\n if (stopped) return stop()\n const value = this.read()\n return value === null ? stop() : { done: false, value }\n }\n\n this.once('end', stop)\n this.once(ERROR, stop)\n this.once(DESTROYED, stop)\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.iterator]() {\n return this\n },\n [Symbol.dispose]: () => {},\n }\n }\n\n /**\n * Destroy a stream, preventing it from being used for any further purpose.\n *\n * If the stream has a `close()` method, then it will be called on\n * destruction.\n *\n * After destruction, any attempt to write data, read data, or emit most\n * events will be ignored.\n *\n * If an error argument is provided, then it will be emitted in an\n * 'error' event.\n */\n destroy(er?: unknown) {\n if (this[DESTROYED]) {\n if (er) this.emit('error', er)\n else this.emit(DESTROYED)\n return this\n }\n\n this[DESTROYED] = true\n this[DISCARDED] = true\n\n // throw away all buffered data, it's never coming out\n this[BUFFER].length = 0\n this[BUFFERLENGTH] = 0\n\n const wc = this as Minipass & {\n close?: () => void\n }\n if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n if (er) this.emit('error', er)\n // if no error to emit, still reject pending promises\n else this.emit(DESTROYED)\n\n return this\n }\n\n /**\n * Alias for {@link isStream}\n *\n * Former export location, maintained for backwards compatibility.\n *\n * @deprecated\n */\n static get isStream() {\n return isStream\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minipass/dist/commonjs/index.js b/node_modules/minipass/dist/commonjs/index.js new file mode 100644 index 0000000..91f3a5c --- /dev/null +++ b/node_modules/minipass/dist/commonjs/index.js @@ -0,0 +1,1038 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0; +const proc = typeof process === 'object' && process + ? process + : { + stdout: null, + stderr: null, + }; +const node_events_1 = require("node:events"); +const node_stream_1 = __importDefault(require("node:stream")); +const node_string_decoder_1 = require("node:string_decoder"); +/** + * Return true if the argument is a Minipass stream, Node stream, or something + * else that Minipass can interact with. + */ +const isStream = (s) => !!s && + typeof s === 'object' && + (s instanceof Minipass || + s instanceof node_stream_1.default || + (0, exports.isReadable)(s) || + (0, exports.isWritable)(s)) +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +; +exports.isStream = isStream; +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +const isReadable = (s) => !!s && + typeof s === 'object' && + s instanceof node_events_1.EventEmitter && + typeof s.pipe === 'function' && + // node core Writable streams have a pipe() method, but it throws + s.pipe !== node_stream_1.default.Writable.prototype.pipe +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +; +exports.isReadable = isReadable; +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +const isWritable = (s) => !!s && + typeof s === 'object' && + s instanceof node_events_1.EventEmitter && + typeof s.write === 'function' && + typeof s.end === 'function'; +exports.isWritable = isWritable; +const EOF = Symbol('EOF'); +const MAYBE_EMIT_END = Symbol('maybeEmitEnd'); +const EMITTED_END = Symbol('emittedEnd'); +const EMITTING_END = Symbol('emittingEnd'); +const EMITTED_ERROR = Symbol('emittedError'); +const CLOSED = Symbol('closed'); +const READ = Symbol('read'); +const FLUSH = Symbol('flush'); +const FLUSHCHUNK = Symbol('flushChunk'); +const ENCODING = Symbol('encoding'); +const DECODER = Symbol('decoder'); +const FLOWING = Symbol('flowing'); +const PAUSED = Symbol('paused'); +const RESUME = Symbol('resume'); +const BUFFER = Symbol('buffer'); +const PIPES = Symbol('pipes'); +const BUFFERLENGTH = Symbol('bufferLength'); +const BUFFERPUSH = Symbol('bufferPush'); +const BUFFERSHIFT = Symbol('bufferShift'); +const OBJECTMODE = Symbol('objectMode'); +// internal event when stream is destroyed +const DESTROYED = Symbol('destroyed'); +// internal event when stream has an error +const ERROR = Symbol('error'); +const EMITDATA = Symbol('emitData'); +const EMITEND = Symbol('emitEnd'); +const EMITEND2 = Symbol('emitEnd2'); +const ASYNC = Symbol('async'); +const ABORT = Symbol('abort'); +const ABORTED = Symbol('aborted'); +const SIGNAL = Symbol('signal'); +const DATALISTENERS = Symbol('dataListeners'); +const DISCARDED = Symbol('discarded'); +const defer = (fn) => Promise.resolve().then(fn); +const nodefer = (fn) => fn(); +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish'; +const isArrayBufferLike = (b) => b instanceof ArrayBuffer || + (!!b && + typeof b === 'object' && + b.constructor && + b.constructor.name === 'ArrayBuffer' && + b.byteLength >= 0); +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); +/** + * Internal class representing a pipe to a destination stream. + * + * @internal + */ +class Pipe { + src; + dest; + opts; + ondrain; + constructor(src, dest, opts) { + this.src = src; + this.dest = dest; + this.opts = opts; + this.ondrain = () => src[RESUME](); + this.dest.on('drain', this.ondrain); + } + unpipe() { + this.dest.removeListener('drain', this.ondrain); + } + // only here for the prototype + /* c8 ignore start */ + proxyErrors(_er) { } + /* c8 ignore stop */ + end() { + this.unpipe(); + if (this.opts.end) + this.dest.end(); + } +} +/** + * Internal class representing a pipe to a destination stream where + * errors are proxied. + * + * @internal + */ +class PipeProxyErrors extends Pipe { + unpipe() { + this.src.removeListener('error', this.proxyErrors); + super.unpipe(); + } + constructor(src, dest, opts) { + super(src, dest, opts); + this.proxyErrors = (er) => this.dest.emit('error', er); + src.on('error', this.proxyErrors); + } +} +const isObjectModeOptions = (o) => !!o.objectMode; +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer'; +/** + * Main export, the Minipass class + * + * `RType` is the type of data emitted, defaults to Buffer + * + * `WType` is the type of data to be written, if RType is buffer or string, + * then any {@link Minipass.ContiguousData} is allowed. + * + * `Events` is the set of event handler signatures that this object + * will emit, see {@link Minipass.Events} + */ +class Minipass extends node_events_1.EventEmitter { + [FLOWING] = false; + [PAUSED] = false; + [PIPES] = []; + [BUFFER] = []; + [OBJECTMODE]; + [ENCODING]; + [ASYNC]; + [DECODER]; + [EOF] = false; + [EMITTED_END] = false; + [EMITTING_END] = false; + [CLOSED] = false; + [EMITTED_ERROR] = null; + [BUFFERLENGTH] = 0; + [DESTROYED] = false; + [SIGNAL]; + [ABORTED] = false; + [DATALISTENERS] = 0; + [DISCARDED] = false; + /** + * true if the stream can be written + */ + writable = true; + /** + * true if the stream can be read + */ + readable = true; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args) { + const options = (args[0] || + {}); + super(); + if (options.objectMode && typeof options.encoding === 'string') { + throw new TypeError('Encoding and objectMode may not be used together'); + } + if (isObjectModeOptions(options)) { + this[OBJECTMODE] = true; + this[ENCODING] = null; + } + else if (isEncodingOptions(options)) { + this[ENCODING] = options.encoding; + this[OBJECTMODE] = false; + } + else { + this[OBJECTMODE] = false; + this[ENCODING] = null; + } + this[ASYNC] = !!options.async; + this[DECODER] = this[ENCODING] + ? new node_string_decoder_1.StringDecoder(this[ENCODING]) + : null; + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposeBuffer === true) { + Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] }); + } + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposePipes === true) { + Object.defineProperty(this, 'pipes', { get: () => this[PIPES] }); + } + const { signal } = options; + if (signal) { + this[SIGNAL] = signal; + if (signal.aborted) { + this[ABORT](); + } + else { + signal.addEventListener('abort', () => this[ABORT]()); + } + } + } + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ + get bufferLength() { + return this[BUFFERLENGTH]; + } + /** + * The `BufferEncoding` currently in use, or `null` + */ + get encoding() { + return this[ENCODING]; + } + /** + * @deprecated - This is a read only property + */ + set encoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * True if this is an objectMode stream + */ + get objectMode() { + return this[OBJECTMODE]; + } + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om) { + throw new Error('objectMode must be set at instantiation time'); + } + /** + * true if this is an async stream + */ + get ['async']() { + return this[ASYNC]; + } + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ + set ['async'](a) { + this[ASYNC] = this[ASYNC] || !!a; + } + // drop everything and get out of the flow completely + [ABORT]() { + this[ABORTED] = true; + this.emit('abort', this[SIGNAL]?.reason); + this.destroy(this[SIGNAL]?.reason); + } + /** + * True if the stream has been aborted. + */ + get aborted() { + return this[ABORTED]; + } + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_) { } + write(chunk, encoding, cb) { + if (this[ABORTED]) + return false; + if (this[EOF]) + throw new Error('write after end'); + if (this[DESTROYED]) { + this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' })); + return true; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (!encoding) + encoding = 'utf8'; + const fn = this[ASYNC] ? defer : nodefer; + // convert array buffers and typed array views into buffers + // at some point in the future, we may want to do the opposite! + // leave strings and buffers as-is + // anything is only allowed if in object mode, so throw + if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { + if (isArrayBufferView(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } + else if (isArrayBufferLike(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk); + } + else if (typeof chunk !== 'string') { + throw new Error('Non-contiguous data written to non-objectMode stream'); + } + } + // handle object mode up front, since it's simpler + // this yields better performance, fewer checks later. + if (this[OBJECTMODE]) { + // maybe impossible? + /* c8 ignore start */ + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + /* c8 ignore stop */ + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // at this point the chunk is a buffer or string + // don't buffer it up or send it to the decoder + if (!chunk.length) { + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // fast-path writing strings of same encoding to a stream with + // an empty buffer, skipping the buffer/decoder dance + if (typeof chunk === 'string' && + // unless it is a string already ready for us to use + !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) { + //@ts-ignore - sinful unsafe type change + chunk = Buffer.from(chunk, encoding); + } + if (Buffer.isBuffer(chunk) && this[ENCODING]) { + //@ts-ignore - sinful unsafe type change + chunk = this[DECODER].write(chunk); + } + // Note: flushing CAN potentially switch us into not-flowing mode + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ + read(n) { + if (this[DESTROYED]) + return null; + this[DISCARDED] = false; + if (this[BUFFERLENGTH] === 0 || + n === 0 || + (n && n > this[BUFFERLENGTH])) { + this[MAYBE_EMIT_END](); + return null; + } + if (this[OBJECTMODE]) + n = null; + if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { + // not object mode, so if we have an encoding, then RType is string + // otherwise, must be Buffer + this[BUFFER] = [ + (this[ENCODING] + ? this[BUFFER].join('') + : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])), + ]; + } + const ret = this[READ](n || null, this[BUFFER][0]); + this[MAYBE_EMIT_END](); + return ret; + } + [READ](n, chunk) { + if (this[OBJECTMODE]) + this[BUFFERSHIFT](); + else { + const c = chunk; + if (n === c.length || n === null) + this[BUFFERSHIFT](); + else if (typeof c === 'string') { + this[BUFFER][0] = c.slice(n); + chunk = c.slice(0, n); + this[BUFFERLENGTH] -= n; + } + else { + this[BUFFER][0] = c.subarray(n); + chunk = c.subarray(0, n); + this[BUFFERLENGTH] -= n; + } + } + this.emit('data', chunk); + if (!this[BUFFER].length && !this[EOF]) + this.emit('drain'); + return chunk; + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (chunk !== undefined) + this.write(chunk, encoding); + if (cb) + this.once('end', cb); + this[EOF] = true; + this.writable = false; + // if we haven't written anything, then go ahead and emit, + // even if we're not reading. + // we'll re-emit if a new 'end' listener is added anyway. + // This makes MP more suitable to write-only use cases. + if (this[FLOWING] || !this[PAUSED]) + this[MAYBE_EMIT_END](); + return this; + } + // don't let the internal resume be overwritten + [RESUME]() { + if (this[DESTROYED]) + return; + if (!this[DATALISTENERS] && !this[PIPES].length) { + this[DISCARDED] = true; + } + this[PAUSED] = false; + this[FLOWING] = true; + this.emit('resume'); + if (this[BUFFER].length) + this[FLUSH](); + else if (this[EOF]) + this[MAYBE_EMIT_END](); + else + this.emit('drain'); + } + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ + resume() { + return this[RESUME](); + } + /** + * Pause the stream + */ + pause() { + this[FLOWING] = false; + this[PAUSED] = true; + this[DISCARDED] = false; + } + /** + * true if the stream has been forcibly destroyed + */ + get destroyed() { + return this[DESTROYED]; + } + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ + get flowing() { + return this[FLOWING]; + } + /** + * true if the stream is currently in a paused state + */ + get paused() { + return this[PAUSED]; + } + [BUFFERPUSH](chunk) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] += 1; + else + this[BUFFERLENGTH] += chunk.length; + this[BUFFER].push(chunk); + } + [BUFFERSHIFT]() { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1; + else + this[BUFFERLENGTH] -= this[BUFFER][0].length; + return this[BUFFER].shift(); + } + [FLUSH](noDrain = false) { + do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && + this[BUFFER].length); + if (!noDrain && !this[BUFFER].length && !this[EOF]) + this.emit('drain'); + } + [FLUSHCHUNK](chunk) { + this.emit('data', chunk); + return this[FLOWING]; + } + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ + pipe(dest, opts) { + if (this[DESTROYED]) + return dest; + this[DISCARDED] = false; + const ended = this[EMITTED_END]; + opts = opts || {}; + if (dest === proc.stdout || dest === proc.stderr) + opts.end = false; + else + opts.end = opts.end !== false; + opts.proxyErrors = !!opts.proxyErrors; + // piping an ended stream ends immediately + if (ended) { + if (opts.end) + dest.end(); + } + else { + // "as" here just ignores the WType, which pipes don't care about, + // since they're only consuming from us, and writing to the dest + this[PIPES].push(!opts.proxyErrors + ? new Pipe(this, dest, opts) + : new PipeProxyErrors(this, dest, opts)); + if (this[ASYNC]) + defer(() => this[RESUME]()); + else + this[RESUME](); + } + return dest; + } + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + unpipe(dest) { + const p = this[PIPES].find(p => p.dest === dest); + if (p) { + if (this[PIPES].length === 1) { + if (this[FLOWING] && this[DATALISTENERS] === 0) { + this[FLOWING] = false; + } + this[PIPES] = []; + } + else + this[PIPES].splice(this[PIPES].indexOf(p), 1); + p.unpipe(); + } + } + /** + * Alias for {@link Minipass#on} + */ + addListener(ev, handler) { + return this.on(ev, handler); + } + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev, handler) { + const ret = super.on(ev, handler); + if (ev === 'data') { + this[DISCARDED] = false; + this[DATALISTENERS]++; + if (!this[PIPES].length && !this[FLOWING]) { + this[RESUME](); + } + } + else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) { + super.emit('readable'); + } + else if (isEndish(ev) && this[EMITTED_END]) { + super.emit(ev); + this.removeAllListeners(ev); + } + else if (ev === 'error' && this[EMITTED_ERROR]) { + const h = handler; + if (this[ASYNC]) + defer(() => h.call(this, this[EMITTED_ERROR])); + else + h.call(this, this[EMITTED_ERROR]); + } + return ret; + } + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev, handler) { + return this.off(ev, handler); + } + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev, handler) { + const ret = super.off(ev, handler); + // if we previously had listeners, and now we don't, and we don't + // have any pipes, then stop the flow, unless it's been explicitly + // put in a discarded flowing state via stream.resume(). + if (ev === 'data') { + this[DATALISTENERS] = this.listeners('data').length; + if (this[DATALISTENERS] === 0 && + !this[DISCARDED] && + !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev) { + const ret = super.removeAllListeners(ev); + if (ev === 'data' || ev === undefined) { + this[DATALISTENERS] = 0; + if (!this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * true if the 'end' event has been emitted + */ + get emittedEnd() { + return this[EMITTED_END]; + } + [MAYBE_EMIT_END]() { + if (!this[EMITTING_END] && + !this[EMITTED_END] && + !this[DESTROYED] && + this[BUFFER].length === 0 && + this[EOF]) { + this[EMITTING_END] = true; + this.emit('end'); + this.emit('prefinish'); + this.emit('finish'); + if (this[CLOSED]) + this.emit('close'); + this[EMITTING_END] = false; + } + } + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev, ...args) { + const data = args[0]; + // error and close are only events allowed after calling destroy() + if (ev !== 'error' && + ev !== 'close' && + ev !== DESTROYED && + this[DESTROYED]) { + return false; + } + else if (ev === 'data') { + return !this[OBJECTMODE] && !data + ? false + : this[ASYNC] + ? (defer(() => this[EMITDATA](data)), true) + : this[EMITDATA](data); + } + else if (ev === 'end') { + return this[EMITEND](); + } + else if (ev === 'close') { + this[CLOSED] = true; + // don't emit close before 'end' and 'finish' + if (!this[EMITTED_END] && !this[DESTROYED]) + return false; + const ret = super.emit('close'); + this.removeAllListeners('close'); + return ret; + } + else if (ev === 'error') { + this[EMITTED_ERROR] = data; + super.emit(ERROR, data); + const ret = !this[SIGNAL] || this.listeners('error').length + ? super.emit('error', data) + : false; + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'resume') { + const ret = super.emit('resume'); + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'finish' || ev === 'prefinish') { + const ret = super.emit(ev); + this.removeAllListeners(ev); + return ret; + } + // Some other unknown event + const ret = super.emit(ev, ...args); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITDATA](data) { + for (const p of this[PIPES]) { + if (p.dest.write(data) === false) + this.pause(); + } + const ret = this[DISCARDED] ? false : super.emit('data', data); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITEND]() { + if (this[EMITTED_END]) + return false; + this[EMITTED_END] = true; + this.readable = false; + return this[ASYNC] + ? (defer(() => this[EMITEND2]()), true) + : this[EMITEND2](); + } + [EMITEND2]() { + if (this[DECODER]) { + const data = this[DECODER].end(); + if (data) { + for (const p of this[PIPES]) { + p.dest.write(data); + } + if (!this[DISCARDED]) + super.emit('data', data); + } + } + for (const p of this[PIPES]) { + p.end(); + } + const ret = super.emit('end'); + this.removeAllListeners('end'); + return ret; + } + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + async collect() { + const buf = Object.assign([], { + dataLength: 0, + }); + if (!this[OBJECTMODE]) + buf.dataLength = 0; + // set the promise first, in case an error is raised + // by triggering the flow here. + const p = this.promise(); + this.on('data', c => { + buf.push(c); + if (!this[OBJECTMODE]) + buf.dataLength += c.length; + }); + await p; + return buf; + } + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + async concat() { + if (this[OBJECTMODE]) { + throw new Error('cannot concat in objectMode'); + } + const buf = await this.collect(); + return (this[ENCODING] + ? buf.join('') + : Buffer.concat(buf, buf.dataLength)); + } + /** + * Return a void Promise that resolves once the stream ends. + */ + async promise() { + return new Promise((resolve, reject) => { + this.on(DESTROYED, () => reject(new Error('stream destroyed'))); + this.on('error', er => reject(er)); + this.on('end', () => resolve()); + }); + } + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = async () => { + this.pause(); + stopped = true; + return { value: undefined, done: true }; + }; + const next = () => { + if (stopped) + return stop(); + const res = this.read(); + if (res !== null) + return Promise.resolve({ done: false, value: res }); + if (this[EOF]) + return stop(); + let resolve; + let reject; + const onerr = (er) => { + this.off('data', ondata); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + stop(); + reject(er); + }; + const ondata = (value) => { + this.off('error', onerr); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + this.pause(); + resolve({ value, done: !!this[EOF] }); + }; + const onend = () => { + this.off('error', onerr); + this.off('data', ondata); + this.off(DESTROYED, ondestroy); + stop(); + resolve({ done: true, value: undefined }); + }; + const ondestroy = () => onerr(new Error('stream destroyed')); + return new Promise((res, rej) => { + reject = rej; + resolve = res; + this.once(DESTROYED, ondestroy); + this.once('error', onerr); + this.once('end', onend); + this.once('data', ondata); + }); + }; + return { + next, + throw: stop, + return: stop, + [Symbol.asyncIterator]() { + return this; + }, + [Symbol.asyncDispose]: async () => { }, + }; + } + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = () => { + this.pause(); + this.off(ERROR, stop); + this.off(DESTROYED, stop); + this.off('end', stop); + stopped = true; + return { done: true, value: undefined }; + }; + const next = () => { + if (stopped) + return stop(); + const value = this.read(); + return value === null ? stop() : { done: false, value }; + }; + this.once('end', stop); + this.once(ERROR, stop); + this.once(DESTROYED, stop); + return { + next, + throw: stop, + return: stop, + [Symbol.iterator]() { + return this; + }, + [Symbol.dispose]: () => { }, + }; + } + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ + destroy(er) { + if (this[DESTROYED]) { + if (er) + this.emit('error', er); + else + this.emit(DESTROYED); + return this; + } + this[DESTROYED] = true; + this[DISCARDED] = true; + // throw away all buffered data, it's never coming out + this[BUFFER].length = 0; + this[BUFFERLENGTH] = 0; + const wc = this; + if (typeof wc.close === 'function' && !this[CLOSED]) + wc.close(); + if (er) + this.emit('error', er); + // if no error to emit, still reject pending promises + else + this.emit(DESTROYED); + return this; + } + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream() { + return exports.isStream; + } +} +exports.Minipass = Minipass; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/minipass/dist/commonjs/index.js.map b/node_modules/minipass/dist/commonjs/index.js.map new file mode 100644 index 0000000..1687b4c --- /dev/null +++ b/node_modules/minipass/dist/commonjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n typeof process === 'object' && process\n ? process\n : {\n stdout: null,\n stderr: null,\n }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n s: any\n): s is Minipass.Readable | Minipass.Writable =>\n !!s &&\n typeof s === 'object' &&\n (s instanceof Minipass ||\n s instanceof Stream ||\n isReadable(s) ||\n isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Readable).pipe === 'function' &&\n // node core Writable streams have a pipe() method, but it throws\n (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Writable).write === 'function' &&\n typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n b instanceof ArrayBuffer ||\n (!!b &&\n typeof b === 'object' &&\n b.constructor &&\n b.constructor.name === 'ArrayBuffer' &&\n b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n /**\n * end the destination stream when the source stream ends\n */\n end?: boolean\n /**\n * proxy errors from the source stream to the destination stream\n */\n proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n src: Minipass\n dest: Minipass\n opts: PipeOptions\n ondrain: () => any\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n this.src = src\n this.dest = dest as Minipass\n this.opts = opts\n this.ondrain = () => src[RESUME]()\n this.dest.on('drain', this.ondrain)\n }\n unpipe() {\n this.dest.removeListener('drain', this.ondrain)\n }\n // only here for the prototype\n /* c8 ignore start */\n proxyErrors(_er: any) {}\n /* c8 ignore stop */\n end() {\n this.unpipe()\n if (this.opts.end) this.dest.end()\n }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n unpipe() {\n this.src.removeListener('error', this.proxyErrors)\n super.unpipe()\n }\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n super(src, dest, opts)\n this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n src.on('error', this.proxyErrors)\n }\n}\n\nexport namespace Minipass {\n /**\n * Encoding used to create a stream that outputs strings rather than\n * Buffer objects.\n */\n export type Encoding = BufferEncoding | 'buffer' | null\n\n /**\n * Any stream that Minipass can pipe into\n */\n export type Writable =\n | Minipass\n | NodeJS.WriteStream\n | (NodeJS.WriteStream & { fd: number })\n | (EventEmitter & {\n end(): any\n write(chunk: any, ...args: any[]): any\n })\n\n /**\n * Any stream that can be read from\n */\n export type Readable =\n | Minipass\n | NodeJS.ReadStream\n | (NodeJS.ReadStream & { fd: number })\n | (EventEmitter & {\n pause(): any\n resume(): any\n pipe(...destArgs: any[]): any\n })\n\n /**\n * Utility type that can be iterated sync or async\n */\n export type DualIterable = Iterable & AsyncIterable\n\n type EventArguments = Record\n\n /**\n * The listing of events that a Minipass class can emit.\n * Extend this when extending the Minipass class, and pass as\n * the third template argument. The key is the name of the event,\n * and the value is the argument list.\n *\n * Any undeclared events will still be allowed, but the handler will get\n * arguments as `unknown[]`.\n */\n export interface Events\n extends EventArguments {\n readable: []\n data: [chunk: RType]\n error: [er: unknown]\n abort: [reason: unknown]\n drain: []\n resume: []\n end: []\n finish: []\n prefinish: []\n close: []\n [DESTROYED]: [er?: unknown]\n [ERROR]: [er: unknown]\n }\n\n /**\n * String or buffer-like data that can be joined and sliced\n */\n export type ContiguousData =\n | Buffer\n | ArrayBufferLike\n | ArrayBufferView\n | string\n export type BufferOrString = Buffer | string\n\n /**\n * Options passed to the Minipass constructor.\n */\n export type SharedOptions = {\n /**\n * Defer all data emission and other events until the end of the\n * current tick, similar to Node core streams\n */\n async?: boolean\n /**\n * A signal which will abort the stream\n */\n signal?: AbortSignal\n /**\n * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n * emit Buffer objects rather than strings.\n *\n * Conflicts with `objectMode`\n */\n encoding?: BufferEncoding | null | 'buffer'\n /**\n * Output data exactly as it was written, supporting non-buffer/string\n * data (such as arbitrary objects, falsey values, etc.)\n *\n * Conflicts with `encoding`\n */\n objectMode?: boolean\n }\n\n /**\n * Options for a string encoded output\n */\n export type EncodingOptions = SharedOptions & {\n encoding: BufferEncoding\n objectMode?: false\n }\n\n /**\n * Options for contiguous data buffer output\n */\n export type BufferOptions = SharedOptions & {\n encoding?: null | 'buffer'\n objectMode?: false\n }\n\n /**\n * Options for objectMode arbitrary output\n */\n export type ObjectModeOptions = SharedOptions & {\n objectMode: true\n encoding?: null\n }\n\n /**\n * Utility type to determine allowed options based on read type\n */\n export type Options =\n | ObjectModeOptions\n | (T extends string\n ? EncodingOptions\n : T extends Buffer\n ? BufferOptions\n : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n RType extends unknown = Buffer,\n WType extends unknown = RType extends Minipass.BufferOrString\n ? Minipass.ContiguousData\n : RType,\n Events extends Minipass.Events = Minipass.Events\n >\n extends EventEmitter\n implements Minipass.DualIterable\n{\n [FLOWING]: boolean = false;\n [PAUSED]: boolean = false;\n [PIPES]: Pipe[] = [];\n [BUFFER]: RType[] = [];\n [OBJECTMODE]: boolean;\n [ENCODING]: BufferEncoding | null;\n [ASYNC]: boolean;\n [DECODER]: SD | null;\n [EOF]: boolean = false;\n [EMITTED_END]: boolean = false;\n [EMITTING_END]: boolean = false;\n [CLOSED]: boolean = false;\n [EMITTED_ERROR]: unknown = null;\n [BUFFERLENGTH]: number = 0;\n [DESTROYED]: boolean = false;\n [SIGNAL]?: AbortSignal;\n [ABORTED]: boolean = false;\n [DATALISTENERS]: number = 0;\n [DISCARDED]: boolean = false\n\n /**\n * true if the stream can be written\n */\n writable: boolean = true\n /**\n * true if the stream can be read\n */\n readable: boolean = true\n\n /**\n * If `RType` is Buffer, then options do not need to be provided.\n * Otherwise, an options object must be provided to specify either\n * {@link Minipass.SharedOptions.objectMode} or\n * {@link Minipass.SharedOptions.encoding}, as appropriate.\n */\n constructor(\n ...args:\n | [Minipass.ObjectModeOptions]\n | (RType extends Buffer\n ? [] | [Minipass.Options]\n : [Minipass.Options])\n ) {\n const options: Minipass.Options = (args[0] ||\n {}) as Minipass.Options\n super()\n if (options.objectMode && typeof options.encoding === 'string') {\n throw new TypeError(\n 'Encoding and objectMode may not be used together'\n )\n }\n if (isObjectModeOptions(options)) {\n this[OBJECTMODE] = true\n this[ENCODING] = null\n } else if (isEncodingOptions(options)) {\n this[ENCODING] = options.encoding\n this[OBJECTMODE] = false\n } else {\n this[OBJECTMODE] = false\n this[ENCODING] = null\n }\n this[ASYNC] = !!options.async\n this[DECODER] = this[ENCODING]\n ? (new StringDecoder(this[ENCODING]) as SD)\n : null\n\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposeBuffer === true) {\n Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n }\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposePipes === true) {\n Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n }\n\n const { signal } = options\n if (signal) {\n this[SIGNAL] = signal\n if (signal.aborted) {\n this[ABORT]()\n } else {\n signal.addEventListener('abort', () => this[ABORT]())\n }\n }\n }\n\n /**\n * The amount of data stored in the buffer waiting to be read.\n *\n * For Buffer strings, this will be the total byte length.\n * For string encoding streams, this will be the string character length,\n * according to JavaScript's `string.length` logic.\n * For objectMode streams, this is a count of the items waiting to be\n * emitted.\n */\n get bufferLength() {\n return this[BUFFERLENGTH]\n }\n\n /**\n * The `BufferEncoding` currently in use, or `null`\n */\n get encoding() {\n return this[ENCODING]\n }\n\n /**\n * @deprecated - This is a read only property\n */\n set encoding(_enc) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * @deprecated - Encoding may only be set at instantiation time\n */\n setEncoding(_enc: Minipass.Encoding) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * True if this is an objectMode stream\n */\n get objectMode() {\n return this[OBJECTMODE]\n }\n\n /**\n * @deprecated - This is a read-only property\n */\n set objectMode(_om) {\n throw new Error('objectMode must be set at instantiation time')\n }\n\n /**\n * true if this is an async stream\n */\n get ['async'](): boolean {\n return this[ASYNC]\n }\n /**\n * Set to true to make this stream async.\n *\n * Once set, it cannot be unset, as this would potentially cause incorrect\n * behavior. Ie, a sync stream can be made async, but an async stream\n * cannot be safely made sync.\n */\n set ['async'](a: boolean) {\n this[ASYNC] = this[ASYNC] || !!a\n }\n\n // drop everything and get out of the flow completely\n [ABORT]() {\n this[ABORTED] = true\n this.emit('abort', this[SIGNAL]?.reason)\n this.destroy(this[SIGNAL]?.reason)\n }\n\n /**\n * True if the stream has been aborted.\n */\n get aborted() {\n return this[ABORTED]\n }\n /**\n * No-op setter. Stream aborted status is set via the AbortSignal provided\n * in the constructor options.\n */\n set aborted(_) {}\n\n /**\n * Write data into the stream\n *\n * If the chunk written is a string, and encoding is not specified, then\n * `utf8` will be assumed. If the stream encoding matches the encoding of\n * a written string, and the state of the string decoder allows it, then\n * the string will be passed through to either the output or the internal\n * buffer without any processing. Otherwise, it will be turned into a\n * Buffer object for processing into the desired encoding.\n *\n * If provided, `cb` function is called immediately before return for\n * sync streams, or on next tick for async streams, because for this\n * base class, a chunk is considered \"processed\" once it is accepted\n * and either emitted or buffered. That is, the callback does not indicate\n * that the chunk has been eventually emitted, though of course child\n * classes can override this function to do whatever processing is required\n * and call `super.write(...)` only once processing is completed.\n */\n write(chunk: WType, cb?: () => void): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding,\n cb?: () => void\n ): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): boolean {\n if (this[ABORTED]) return false\n if (this[EOF]) throw new Error('write after end')\n\n if (this[DESTROYED]) {\n this.emit(\n 'error',\n Object.assign(\n new Error('Cannot call write after a stream was destroyed'),\n { code: 'ERR_STREAM_DESTROYED' }\n )\n )\n return true\n }\n\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n\n if (!encoding) encoding = 'utf8'\n\n const fn = this[ASYNC] ? defer : nodefer\n\n // convert array buffers and typed array views into buffers\n // at some point in the future, we may want to do the opposite!\n // leave strings and buffers as-is\n // anything is only allowed if in object mode, so throw\n if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n if (isArrayBufferView(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(\n chunk.buffer,\n chunk.byteOffset,\n chunk.byteLength\n )\n } else if (isArrayBufferLike(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(chunk)\n } else if (typeof chunk !== 'string') {\n throw new Error(\n 'Non-contiguous data written to non-objectMode stream'\n )\n }\n }\n\n // handle object mode up front, since it's simpler\n // this yields better performance, fewer checks later.\n if (this[OBJECTMODE]) {\n // maybe impossible?\n /* c8 ignore start */\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n /* c8 ignore stop */\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n // at this point the chunk is a buffer or string\n // don't buffer it up or send it to the decoder\n if (!(chunk as Minipass.BufferOrString).length) {\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n if (cb) fn(cb)\n return this[FLOWING]\n }\n\n // fast-path writing strings of same encoding to a stream with\n // an empty buffer, skipping the buffer/decoder dance\n if (\n typeof chunk === 'string' &&\n // unless it is a string already ready for us to use\n !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n ) {\n //@ts-ignore - sinful unsafe type change\n chunk = Buffer.from(chunk, encoding)\n }\n\n if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n //@ts-ignore - sinful unsafe type change\n chunk = this[DECODER].write(chunk)\n }\n\n // Note: flushing CAN potentially switch us into not-flowing mode\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n /**\n * Low-level explicit read method.\n *\n * In objectMode, the argument is ignored, and one item is returned if\n * available.\n *\n * `n` is the number of bytes (or in the case of encoding streams,\n * characters) to consume. If `n` is not provided, then the entire buffer\n * is returned, or `null` is returned if no data is available.\n *\n * If `n` is greater that the amount of data in the internal buffer,\n * then `null` is returned.\n */\n read(n?: number | null): RType | null {\n if (this[DESTROYED]) return null\n this[DISCARDED] = false\n\n if (\n this[BUFFERLENGTH] === 0 ||\n n === 0 ||\n (n && n > this[BUFFERLENGTH])\n ) {\n this[MAYBE_EMIT_END]()\n return null\n }\n\n if (this[OBJECTMODE]) n = null\n\n if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n // not object mode, so if we have an encoding, then RType is string\n // otherwise, must be Buffer\n this[BUFFER] = [\n (this[ENCODING]\n ? this[BUFFER].join('')\n : Buffer.concat(\n this[BUFFER] as Buffer[],\n this[BUFFERLENGTH]\n )) as RType,\n ]\n }\n\n const ret = this[READ](n || null, this[BUFFER][0] as RType)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [READ](n: number | null, chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n else {\n const c = chunk as Minipass.BufferOrString\n if (n === c.length || n === null) this[BUFFERSHIFT]()\n else if (typeof c === 'string') {\n this[BUFFER][0] = c.slice(n) as RType\n chunk = c.slice(0, n) as RType\n this[BUFFERLENGTH] -= n\n } else {\n this[BUFFER][0] = c.subarray(n) as RType\n chunk = c.subarray(0, n) as RType\n this[BUFFERLENGTH] -= n\n }\n }\n\n this.emit('data', chunk)\n\n if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n return chunk\n }\n\n /**\n * End the stream, optionally providing a final write.\n *\n * See {@link Minipass#write} for argument descriptions\n */\n end(cb?: () => void): this\n end(chunk: WType, cb?: () => void): this\n end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n end(\n chunk?: WType | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): this {\n if (typeof chunk === 'function') {\n cb = chunk as () => void\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n if (chunk !== undefined) this.write(chunk, encoding)\n if (cb) this.once('end', cb)\n this[EOF] = true\n this.writable = false\n\n // if we haven't written anything, then go ahead and emit,\n // even if we're not reading.\n // we'll re-emit if a new 'end' listener is added anyway.\n // This makes MP more suitable to write-only use cases.\n if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n return this\n }\n\n // don't let the internal resume be overwritten\n [RESUME]() {\n if (this[DESTROYED]) return\n\n if (!this[DATALISTENERS] && !this[PIPES].length) {\n this[DISCARDED] = true\n }\n this[PAUSED] = false\n this[FLOWING] = true\n this.emit('resume')\n if (this[BUFFER].length) this[FLUSH]()\n else if (this[EOF]) this[MAYBE_EMIT_END]()\n else this.emit('drain')\n }\n\n /**\n * Resume the stream if it is currently in a paused state\n *\n * If called when there are no pipe destinations or `data` event listeners,\n * this will place the stream in a \"discarded\" state, where all data will\n * be thrown away. The discarded state is removed if a pipe destination or\n * data handler is added, if pause() is called, or if any synchronous or\n * asynchronous iteration is started.\n */\n resume() {\n return this[RESUME]()\n }\n\n /**\n * Pause the stream\n */\n pause() {\n this[FLOWING] = false\n this[PAUSED] = true\n this[DISCARDED] = false\n }\n\n /**\n * true if the stream has been forcibly destroyed\n */\n get destroyed() {\n return this[DESTROYED]\n }\n\n /**\n * true if the stream is currently in a flowing state, meaning that\n * any writes will be immediately emitted.\n */\n get flowing() {\n return this[FLOWING]\n }\n\n /**\n * true if the stream is currently in a paused state\n */\n get paused() {\n return this[PAUSED]\n }\n\n [BUFFERPUSH](chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n this[BUFFER].push(chunk)\n }\n\n [BUFFERSHIFT](): RType {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n else\n this[BUFFERLENGTH] -= (\n this[BUFFER][0] as Minipass.BufferOrString\n ).length\n return this[BUFFER].shift() as RType\n }\n\n [FLUSH](noDrain: boolean = false) {\n do {} while (\n this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n this[BUFFER].length\n )\n\n if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n }\n\n [FLUSHCHUNK](chunk: RType) {\n this.emit('data', chunk)\n return this[FLOWING]\n }\n\n /**\n * Pipe all data emitted by this stream into the destination provided.\n *\n * Triggers the flow of data.\n */\n pipe(dest: W, opts?: PipeOptions): W {\n if (this[DESTROYED]) return dest\n this[DISCARDED] = false\n\n const ended = this[EMITTED_END]\n opts = opts || {}\n if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n else opts.end = opts.end !== false\n opts.proxyErrors = !!opts.proxyErrors\n\n // piping an ended stream ends immediately\n if (ended) {\n if (opts.end) dest.end()\n } else {\n // \"as\" here just ignores the WType, which pipes don't care about,\n // since they're only consuming from us, and writing to the dest\n this[PIPES].push(\n !opts.proxyErrors\n ? new Pipe(this as Minipass, dest, opts)\n : new PipeProxyErrors(this as Minipass, dest, opts)\n )\n if (this[ASYNC]) defer(() => this[RESUME]())\n else this[RESUME]()\n }\n\n return dest\n }\n\n /**\n * Fully unhook a piped destination stream.\n *\n * If the destination stream was the only consumer of this stream (ie,\n * there are no other piped destinations or `'data'` event listeners)\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n unpipe(dest: W) {\n const p = this[PIPES].find(p => p.dest === dest)\n if (p) {\n if (this[PIPES].length === 1) {\n if (this[FLOWING] && this[DATALISTENERS] === 0) {\n this[FLOWING] = false\n }\n this[PIPES] = []\n } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n p.unpipe()\n }\n }\n\n /**\n * Alias for {@link Minipass#on}\n */\n addListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n return this.on(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.on`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * - Adding a 'data' event handler will trigger the flow of data\n *\n * - Adding a 'readable' event handler when there is data waiting to be read\n * will cause 'readable' to be emitted immediately.\n *\n * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n * already passed will cause the event to be emitted immediately and all\n * handlers removed.\n *\n * - Adding an 'error' event handler after an error has been emitted will\n * cause the event to be re-emitted immediately with the error previously\n * raised.\n */\n on(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n const ret = super.on(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n if (ev === 'data') {\n this[DISCARDED] = false\n this[DATALISTENERS]++\n if (!this[PIPES].length && !this[FLOWING]) {\n this[RESUME]()\n }\n } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n super.emit('readable')\n } else if (isEndish(ev) && this[EMITTED_END]) {\n super.emit(ev)\n this.removeAllListeners(ev)\n } else if (ev === 'error' && this[EMITTED_ERROR]) {\n const h = handler as (...a: Events['error']) => any\n if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n else h.call(this, this[EMITTED_ERROR])\n }\n return ret\n }\n\n /**\n * Alias for {@link Minipass#off}\n */\n removeListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n return this.off(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.off`\n *\n * If a 'data' event handler is removed, and it was the last consumer\n * (ie, there are no pipe destinations or other 'data' event listeners),\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n off(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n const ret = super.off(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n // if we previously had listeners, and now we don't, and we don't\n // have any pipes, then stop the flow, unless it's been explicitly\n // put in a discarded flowing state via stream.resume().\n if (ev === 'data') {\n this[DATALISTENERS] = this.listeners('data').length\n if (\n this[DATALISTENERS] === 0 &&\n !this[DISCARDED] &&\n !this[PIPES].length\n ) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * Mostly identical to `EventEmitter.removeAllListeners`\n *\n * If all 'data' event handlers are removed, and they were the last consumer\n * (ie, there are no pipe destinations), then the flow of data will stop\n * until there is another consumer or {@link Minipass#resume} is explicitly\n * called.\n */\n removeAllListeners(ev?: Event) {\n const ret = super.removeAllListeners(ev as string | symbol | undefined)\n if (ev === 'data' || ev === undefined) {\n this[DATALISTENERS] = 0\n if (!this[DISCARDED] && !this[PIPES].length) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * true if the 'end' event has been emitted\n */\n get emittedEnd() {\n return this[EMITTED_END]\n }\n\n [MAYBE_EMIT_END]() {\n if (\n !this[EMITTING_END] &&\n !this[EMITTED_END] &&\n !this[DESTROYED] &&\n this[BUFFER].length === 0 &&\n this[EOF]\n ) {\n this[EMITTING_END] = true\n this.emit('end')\n this.emit('prefinish')\n this.emit('finish')\n if (this[CLOSED]) this.emit('close')\n this[EMITTING_END] = false\n }\n }\n\n /**\n * Mostly identical to `EventEmitter.emit`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * If the stream has been destroyed, and the event is something other\n * than 'close' or 'error', then `false` is returned and no handlers\n * are called.\n *\n * If the event is 'end', and has already been emitted, then the event\n * is ignored. If the stream is in a paused or non-flowing state, then\n * the event will be deferred until data flow resumes. If the stream is\n * async, then handlers will be called on the next tick rather than\n * immediately.\n *\n * If the event is 'close', and 'end' has not yet been emitted, then\n * the event will be deferred until after 'end' is emitted.\n *\n * If the event is 'error', and an AbortSignal was provided for the stream,\n * and there are no listeners, then the event is ignored, matching the\n * behavior of node core streams in the presense of an AbortSignal.\n *\n * If the event is 'finish' or 'prefinish', then all listeners will be\n * removed after emitting the event, to prevent double-firing.\n */\n emit(\n ev: Event,\n ...args: Events[Event]\n ): boolean {\n const data = args[0]\n // error and close are only events allowed after calling destroy()\n if (\n ev !== 'error' &&\n ev !== 'close' &&\n ev !== DESTROYED &&\n this[DESTROYED]\n ) {\n return false\n } else if (ev === 'data') {\n return !this[OBJECTMODE] && !data\n ? false\n : this[ASYNC]\n ? (defer(() => this[EMITDATA](data as RType)), true)\n : this[EMITDATA](data as RType)\n } else if (ev === 'end') {\n return this[EMITEND]()\n } else if (ev === 'close') {\n this[CLOSED] = true\n // don't emit close before 'end' and 'finish'\n if (!this[EMITTED_END] && !this[DESTROYED]) return false\n const ret = super.emit('close')\n this.removeAllListeners('close')\n return ret\n } else if (ev === 'error') {\n this[EMITTED_ERROR] = data\n super.emit(ERROR, data)\n const ret =\n !this[SIGNAL] || this.listeners('error').length\n ? super.emit('error', data)\n : false\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'resume') {\n const ret = super.emit('resume')\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'finish' || ev === 'prefinish') {\n const ret = super.emit(ev)\n this.removeAllListeners(ev)\n return ret\n }\n\n // Some other unknown event\n const ret = super.emit(ev as string, ...args)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITDATA](data: RType) {\n for (const p of this[PIPES]) {\n if (p.dest.write(data as RType) === false) this.pause()\n }\n const ret = this[DISCARDED] ? false : super.emit('data', data)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITEND]() {\n if (this[EMITTED_END]) return false\n\n this[EMITTED_END] = true\n this.readable = false\n return this[ASYNC]\n ? (defer(() => this[EMITEND2]()), true)\n : this[EMITEND2]()\n }\n\n [EMITEND2]() {\n if (this[DECODER]) {\n const data = this[DECODER].end()\n if (data) {\n for (const p of this[PIPES]) {\n p.dest.write(data as RType)\n }\n if (!this[DISCARDED]) super.emit('data', data)\n }\n }\n\n for (const p of this[PIPES]) {\n p.end()\n }\n const ret = super.emit('end')\n this.removeAllListeners('end')\n return ret\n }\n\n /**\n * Return a Promise that resolves to an array of all emitted data once\n * the stream ends.\n */\n async collect(): Promise {\n const buf: RType[] & { dataLength: number } = Object.assign([], {\n dataLength: 0,\n })\n if (!this[OBJECTMODE]) buf.dataLength = 0\n // set the promise first, in case an error is raised\n // by triggering the flow here.\n const p = this.promise()\n this.on('data', c => {\n buf.push(c)\n if (!this[OBJECTMODE])\n buf.dataLength += (c as Minipass.BufferOrString).length\n })\n await p\n return buf\n }\n\n /**\n * Return a Promise that resolves to the concatenation of all emitted data\n * once the stream ends.\n *\n * Not allowed on objectMode streams.\n */\n async concat(): Promise {\n if (this[OBJECTMODE]) {\n throw new Error('cannot concat in objectMode')\n }\n const buf = await this.collect()\n return (\n this[ENCODING]\n ? buf.join('')\n : Buffer.concat(buf as Buffer[], buf.dataLength)\n ) as RType\n }\n\n /**\n * Return a void Promise that resolves once the stream ends.\n */\n async promise(): Promise {\n return new Promise((resolve, reject) => {\n this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n this.on('error', er => reject(er))\n this.on('end', () => resolve())\n })\n }\n\n /**\n * Asynchronous `for await of` iteration.\n *\n * This will continue emitting all chunks until the stream terminates.\n */\n [Symbol.asyncIterator](): AsyncGenerator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = async (): Promise> => {\n this.pause()\n stopped = true\n return { value: undefined, done: true }\n }\n const next = (): Promise> => {\n if (stopped) return stop()\n const res = this.read()\n if (res !== null) return Promise.resolve({ done: false, value: res })\n\n if (this[EOF]) return stop()\n\n let resolve!: (res: IteratorResult) => void\n let reject!: (er: unknown) => void\n const onerr = (er: unknown) => {\n this.off('data', ondata)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n stop()\n reject(er)\n }\n const ondata = (value: RType) => {\n this.off('error', onerr)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n this.pause()\n resolve({ value, done: !!this[EOF] })\n }\n const onend = () => {\n this.off('error', onerr)\n this.off('data', ondata)\n this.off(DESTROYED, ondestroy)\n stop()\n resolve({ done: true, value: undefined })\n }\n const ondestroy = () => onerr(new Error('stream destroyed'))\n return new Promise>((res, rej) => {\n reject = rej\n resolve = res\n this.once(DESTROYED, ondestroy)\n this.once('error', onerr)\n this.once('end', onend)\n this.once('data', ondata)\n })\n }\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.asyncIterator]() {\n return this\n },\n [Symbol.asyncDispose]: async () => {},\n }\n }\n\n /**\n * Synchronous `for of` iteration.\n *\n * The iteration will terminate when the internal buffer runs out, even\n * if the stream has not yet terminated.\n */\n [Symbol.iterator](): Generator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = (): IteratorReturnResult => {\n this.pause()\n this.off(ERROR, stop)\n this.off(DESTROYED, stop)\n this.off('end', stop)\n stopped = true\n return { done: true, value: undefined }\n }\n\n const next = (): IteratorResult => {\n if (stopped) return stop()\n const value = this.read()\n return value === null ? stop() : { done: false, value }\n }\n\n this.once('end', stop)\n this.once(ERROR, stop)\n this.once(DESTROYED, stop)\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.iterator]() {\n return this\n },\n [Symbol.dispose]: () => {},\n }\n }\n\n /**\n * Destroy a stream, preventing it from being used for any further purpose.\n *\n * If the stream has a `close()` method, then it will be called on\n * destruction.\n *\n * After destruction, any attempt to write data, read data, or emit most\n * events will be ignored.\n *\n * If an error argument is provided, then it will be emitted in an\n * 'error' event.\n */\n destroy(er?: unknown) {\n if (this[DESTROYED]) {\n if (er) this.emit('error', er)\n else this.emit(DESTROYED)\n return this\n }\n\n this[DESTROYED] = true\n this[DISCARDED] = true\n\n // throw away all buffered data, it's never coming out\n this[BUFFER].length = 0\n this[BUFFERLENGTH] = 0\n\n const wc = this as Minipass & {\n close?: () => void\n }\n if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n if (er) this.emit('error', er)\n // if no error to emit, still reject pending promises\n else this.emit(DESTROYED)\n\n return this\n }\n\n /**\n * Alias for {@link isStream}\n *\n * Former export location, maintained for backwards compatibility.\n *\n * @deprecated\n */\n static get isStream() {\n return isStream\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minipass/dist/commonjs/package.json b/node_modules/minipass/dist/commonjs/package.json new file mode 100644 index 0000000..5bbefff --- /dev/null +++ b/node_modules/minipass/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/node_modules/minipass/dist/esm/index.d.ts b/node_modules/minipass/dist/esm/index.d.ts new file mode 100644 index 0000000..3e75b57 --- /dev/null +++ b/node_modules/minipass/dist/esm/index.d.ts @@ -0,0 +1,545 @@ +import { EventEmitter } from 'node:events'; +import { StringDecoder } from 'node:string_decoder'; +/** + * Same as StringDecoder, but exposing the `lastNeed` flag on the type + */ +type SD = StringDecoder & { + lastNeed: boolean; +}; +export type { SD, Pipe, PipeProxyErrors }; +/** + * Return true if the argument is a Minipass stream, Node stream, or something + * else that Minipass can interact with. + */ +export declare const isStream: (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & { + end(): any; + write(chunk: any, ...args: any[]): any; +}) | (EventEmitter & { + pause(): any; + resume(): any; + pipe(...destArgs: any[]): any; +}) | (NodeJS.ReadStream & { + fd: number; +}) | (NodeJS.WriteStream & { + fd: number; +}); +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +export declare const isReadable: (s: any) => s is Minipass.Readable; +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +export declare const isWritable: (s: any) => s is Minipass.Readable; +declare const EOF: unique symbol; +declare const MAYBE_EMIT_END: unique symbol; +declare const EMITTED_END: unique symbol; +declare const EMITTING_END: unique symbol; +declare const EMITTED_ERROR: unique symbol; +declare const CLOSED: unique symbol; +declare const READ: unique symbol; +declare const FLUSH: unique symbol; +declare const FLUSHCHUNK: unique symbol; +declare const ENCODING: unique symbol; +declare const DECODER: unique symbol; +declare const FLOWING: unique symbol; +declare const PAUSED: unique symbol; +declare const RESUME: unique symbol; +declare const BUFFER: unique symbol; +declare const PIPES: unique symbol; +declare const BUFFERLENGTH: unique symbol; +declare const BUFFERPUSH: unique symbol; +declare const BUFFERSHIFT: unique symbol; +declare const OBJECTMODE: unique symbol; +declare const DESTROYED: unique symbol; +declare const ERROR: unique symbol; +declare const EMITDATA: unique symbol; +declare const EMITEND: unique symbol; +declare const EMITEND2: unique symbol; +declare const ASYNC: unique symbol; +declare const ABORT: unique symbol; +declare const ABORTED: unique symbol; +declare const SIGNAL: unique symbol; +declare const DATALISTENERS: unique symbol; +declare const DISCARDED: unique symbol; +/** + * Options that may be passed to stream.pipe() + */ +export interface PipeOptions { + /** + * end the destination stream when the source stream ends + */ + end?: boolean; + /** + * proxy errors from the source stream to the destination stream + */ + proxyErrors?: boolean; +} +/** + * Internal class representing a pipe to a destination stream. + * + * @internal + */ +declare class Pipe { + src: Minipass; + dest: Minipass; + opts: PipeOptions; + ondrain: () => any; + constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions); + unpipe(): void; + proxyErrors(_er: any): void; + end(): void; +} +/** + * Internal class representing a pipe to a destination stream where + * errors are proxied. + * + * @internal + */ +declare class PipeProxyErrors extends Pipe { + unpipe(): void; + constructor(src: Minipass, dest: Minipass.Writable, opts: PipeOptions); +} +export declare namespace Minipass { + /** + * Encoding used to create a stream that outputs strings rather than + * Buffer objects. + */ + export type Encoding = BufferEncoding | 'buffer' | null; + /** + * Any stream that Minipass can pipe into + */ + export type Writable = Minipass | NodeJS.WriteStream | (NodeJS.WriteStream & { + fd: number; + }) | (EventEmitter & { + end(): any; + write(chunk: any, ...args: any[]): any; + }); + /** + * Any stream that can be read from + */ + export type Readable = Minipass | NodeJS.ReadStream | (NodeJS.ReadStream & { + fd: number; + }) | (EventEmitter & { + pause(): any; + resume(): any; + pipe(...destArgs: any[]): any; + }); + /** + * Utility type that can be iterated sync or async + */ + export type DualIterable = Iterable & AsyncIterable; + type EventArguments = Record; + /** + * The listing of events that a Minipass class can emit. + * Extend this when extending the Minipass class, and pass as + * the third template argument. The key is the name of the event, + * and the value is the argument list. + * + * Any undeclared events will still be allowed, but the handler will get + * arguments as `unknown[]`. + */ + export interface Events extends EventArguments { + readable: []; + data: [chunk: RType]; + error: [er: unknown]; + abort: [reason: unknown]; + drain: []; + resume: []; + end: []; + finish: []; + prefinish: []; + close: []; + [DESTROYED]: [er?: unknown]; + [ERROR]: [er: unknown]; + } + /** + * String or buffer-like data that can be joined and sliced + */ + export type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string; + export type BufferOrString = Buffer | string; + /** + * Options passed to the Minipass constructor. + */ + export type SharedOptions = { + /** + * Defer all data emission and other events until the end of the + * current tick, similar to Node core streams + */ + async?: boolean; + /** + * A signal which will abort the stream + */ + signal?: AbortSignal; + /** + * Output string encoding. Set to `null` or `'buffer'` (or omit) to + * emit Buffer objects rather than strings. + * + * Conflicts with `objectMode` + */ + encoding?: BufferEncoding | null | 'buffer'; + /** + * Output data exactly as it was written, supporting non-buffer/string + * data (such as arbitrary objects, falsey values, etc.) + * + * Conflicts with `encoding` + */ + objectMode?: boolean; + }; + /** + * Options for a string encoded output + */ + export type EncodingOptions = SharedOptions & { + encoding: BufferEncoding; + objectMode?: false; + }; + /** + * Options for contiguous data buffer output + */ + export type BufferOptions = SharedOptions & { + encoding?: null | 'buffer'; + objectMode?: false; + }; + /** + * Options for objectMode arbitrary output + */ + export type ObjectModeOptions = SharedOptions & { + objectMode: true; + encoding?: null; + }; + /** + * Utility type to determine allowed options based on read type + */ + export type Options = ObjectModeOptions | (T extends string ? EncodingOptions : T extends Buffer ? BufferOptions : SharedOptions); + export {}; +} +/** + * Main export, the Minipass class + * + * `RType` is the type of data emitted, defaults to Buffer + * + * `WType` is the type of data to be written, if RType is buffer or string, + * then any {@link Minipass.ContiguousData} is allowed. + * + * `Events` is the set of event handler signatures that this object + * will emit, see {@link Minipass.Events} + */ +export declare class Minipass = Minipass.Events> extends EventEmitter implements Minipass.DualIterable { + [FLOWING]: boolean; + [PAUSED]: boolean; + [PIPES]: Pipe[]; + [BUFFER]: RType[]; + [OBJECTMODE]: boolean; + [ENCODING]: BufferEncoding | null; + [ASYNC]: boolean; + [DECODER]: SD | null; + [EOF]: boolean; + [EMITTED_END]: boolean; + [EMITTING_END]: boolean; + [CLOSED]: boolean; + [EMITTED_ERROR]: unknown; + [BUFFERLENGTH]: number; + [DESTROYED]: boolean; + [SIGNAL]?: AbortSignal; + [ABORTED]: boolean; + [DATALISTENERS]: number; + [DISCARDED]: boolean; + /** + * true if the stream can be written + */ + writable: boolean; + /** + * true if the stream can be read + */ + readable: boolean; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args: [Minipass.ObjectModeOptions] | (RType extends Buffer ? [] | [Minipass.Options] : [Minipass.Options])); + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ + get bufferLength(): number; + /** + * The `BufferEncoding` currently in use, or `null` + */ + get encoding(): BufferEncoding | null; + /** + * @deprecated - This is a read only property + */ + set encoding(_enc: BufferEncoding | null); + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc: Minipass.Encoding): void; + /** + * True if this is an objectMode stream + */ + get objectMode(): boolean; + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om: boolean); + /** + * true if this is an async stream + */ + get ['async'](): boolean; + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ + set ['async'](a: boolean); + [ABORT](): void; + /** + * True if the stream has been aborted. + */ + get aborted(): boolean; + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_: boolean); + /** + * Write data into the stream + * + * If the chunk written is a string, and encoding is not specified, then + * `utf8` will be assumed. If the stream encoding matches the encoding of + * a written string, and the state of the string decoder allows it, then + * the string will be passed through to either the output or the internal + * buffer without any processing. Otherwise, it will be turned into a + * Buffer object for processing into the desired encoding. + * + * If provided, `cb` function is called immediately before return for + * sync streams, or on next tick for async streams, because for this + * base class, a chunk is considered "processed" once it is accepted + * and either emitted or buffered. That is, the callback does not indicate + * that the chunk has been eventually emitted, though of course child + * classes can override this function to do whatever processing is required + * and call `super.write(...)` only once processing is completed. + */ + write(chunk: WType, cb?: () => void): boolean; + write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean; + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ + read(n?: number | null): RType | null; + [READ](n: number | null, chunk: RType): RType; + /** + * End the stream, optionally providing a final write. + * + * See {@link Minipass#write} for argument descriptions + */ + end(cb?: () => void): this; + end(chunk: WType, cb?: () => void): this; + end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this; + [RESUME](): void; + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ + resume(): void; + /** + * Pause the stream + */ + pause(): void; + /** + * true if the stream has been forcibly destroyed + */ + get destroyed(): boolean; + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ + get flowing(): boolean; + /** + * true if the stream is currently in a paused state + */ + get paused(): boolean; + [BUFFERPUSH](chunk: RType): void; + [BUFFERSHIFT](): RType; + [FLUSH](noDrain?: boolean): void; + [FLUSHCHUNK](chunk: RType): boolean; + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ + pipe(dest: W, opts?: PipeOptions): W; + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + unpipe(dest: W): void; + /** + * Alias for {@link Minipass#on} + */ + addListener(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev: Event, handler: (...args: Events[Event]) => any): this; + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev?: Event): this; + /** + * true if the 'end' event has been emitted + */ + get emittedEnd(): boolean; + [MAYBE_EMIT_END](): void; + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev: Event, ...args: Events[Event]): boolean; + [EMITDATA](data: RType): boolean; + [EMITEND](): boolean; + [EMITEND2](): boolean; + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + collect(): Promise; + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + concat(): Promise; + /** + * Return a void Promise that resolves once the stream ends. + */ + promise(): Promise; + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator](): AsyncGenerator; + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator](): Generator; + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ + destroy(er?: unknown): this; + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream(): (s: any) => s is Minipass | NodeJS.ReadStream | NodeJS.WriteStream | (EventEmitter & { + end(): any; + write(chunk: any, ...args: any[]): any; + }) | (EventEmitter & { + pause(): any; + resume(): any; + pipe(...destArgs: any[]): any; + }) | (NodeJS.ReadStream & { + fd: number; + }) | (NodeJS.WriteStream & { + fd: number; + }); +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/node_modules/minipass/dist/esm/index.d.ts.map b/node_modules/minipass/dist/esm/index.d.ts.map new file mode 100644 index 0000000..7bce611 --- /dev/null +++ b/node_modules/minipass/dist/esm/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n typeof process === 'object' && process\n ? process\n : {\n stdout: null,\n stderr: null,\n }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n s: any\n): s is Minipass.Readable | Minipass.Writable =>\n !!s &&\n typeof s === 'object' &&\n (s instanceof Minipass ||\n s instanceof Stream ||\n isReadable(s) ||\n isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Readable).pipe === 'function' &&\n // node core Writable streams have a pipe() method, but it throws\n (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Writable).write === 'function' &&\n typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n b instanceof ArrayBuffer ||\n (!!b &&\n typeof b === 'object' &&\n b.constructor &&\n b.constructor.name === 'ArrayBuffer' &&\n b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n /**\n * end the destination stream when the source stream ends\n */\n end?: boolean\n /**\n * proxy errors from the source stream to the destination stream\n */\n proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n src: Minipass\n dest: Minipass\n opts: PipeOptions\n ondrain: () => any\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n this.src = src\n this.dest = dest as Minipass\n this.opts = opts\n this.ondrain = () => src[RESUME]()\n this.dest.on('drain', this.ondrain)\n }\n unpipe() {\n this.dest.removeListener('drain', this.ondrain)\n }\n // only here for the prototype\n /* c8 ignore start */\n proxyErrors(_er: any) {}\n /* c8 ignore stop */\n end() {\n this.unpipe()\n if (this.opts.end) this.dest.end()\n }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n unpipe() {\n this.src.removeListener('error', this.proxyErrors)\n super.unpipe()\n }\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n super(src, dest, opts)\n this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n src.on('error', this.proxyErrors)\n }\n}\n\nexport namespace Minipass {\n /**\n * Encoding used to create a stream that outputs strings rather than\n * Buffer objects.\n */\n export type Encoding = BufferEncoding | 'buffer' | null\n\n /**\n * Any stream that Minipass can pipe into\n */\n export type Writable =\n | Minipass\n | NodeJS.WriteStream\n | (NodeJS.WriteStream & { fd: number })\n | (EventEmitter & {\n end(): any\n write(chunk: any, ...args: any[]): any\n })\n\n /**\n * Any stream that can be read from\n */\n export type Readable =\n | Minipass\n | NodeJS.ReadStream\n | (NodeJS.ReadStream & { fd: number })\n | (EventEmitter & {\n pause(): any\n resume(): any\n pipe(...destArgs: any[]): any\n })\n\n /**\n * Utility type that can be iterated sync or async\n */\n export type DualIterable = Iterable & AsyncIterable\n\n type EventArguments = Record\n\n /**\n * The listing of events that a Minipass class can emit.\n * Extend this when extending the Minipass class, and pass as\n * the third template argument. The key is the name of the event,\n * and the value is the argument list.\n *\n * Any undeclared events will still be allowed, but the handler will get\n * arguments as `unknown[]`.\n */\n export interface Events\n extends EventArguments {\n readable: []\n data: [chunk: RType]\n error: [er: unknown]\n abort: [reason: unknown]\n drain: []\n resume: []\n end: []\n finish: []\n prefinish: []\n close: []\n [DESTROYED]: [er?: unknown]\n [ERROR]: [er: unknown]\n }\n\n /**\n * String or buffer-like data that can be joined and sliced\n */\n export type ContiguousData =\n | Buffer\n | ArrayBufferLike\n | ArrayBufferView\n | string\n export type BufferOrString = Buffer | string\n\n /**\n * Options passed to the Minipass constructor.\n */\n export type SharedOptions = {\n /**\n * Defer all data emission and other events until the end of the\n * current tick, similar to Node core streams\n */\n async?: boolean\n /**\n * A signal which will abort the stream\n */\n signal?: AbortSignal\n /**\n * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n * emit Buffer objects rather than strings.\n *\n * Conflicts with `objectMode`\n */\n encoding?: BufferEncoding | null | 'buffer'\n /**\n * Output data exactly as it was written, supporting non-buffer/string\n * data (such as arbitrary objects, falsey values, etc.)\n *\n * Conflicts with `encoding`\n */\n objectMode?: boolean\n }\n\n /**\n * Options for a string encoded output\n */\n export type EncodingOptions = SharedOptions & {\n encoding: BufferEncoding\n objectMode?: false\n }\n\n /**\n * Options for contiguous data buffer output\n */\n export type BufferOptions = SharedOptions & {\n encoding?: null | 'buffer'\n objectMode?: false\n }\n\n /**\n * Options for objectMode arbitrary output\n */\n export type ObjectModeOptions = SharedOptions & {\n objectMode: true\n encoding?: null\n }\n\n /**\n * Utility type to determine allowed options based on read type\n */\n export type Options =\n | ObjectModeOptions\n | (T extends string\n ? EncodingOptions\n : T extends Buffer\n ? BufferOptions\n : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n RType extends unknown = Buffer,\n WType extends unknown = RType extends Minipass.BufferOrString\n ? Minipass.ContiguousData\n : RType,\n Events extends Minipass.Events = Minipass.Events\n >\n extends EventEmitter\n implements Minipass.DualIterable\n{\n [FLOWING]: boolean = false;\n [PAUSED]: boolean = false;\n [PIPES]: Pipe[] = [];\n [BUFFER]: RType[] = [];\n [OBJECTMODE]: boolean;\n [ENCODING]: BufferEncoding | null;\n [ASYNC]: boolean;\n [DECODER]: SD | null;\n [EOF]: boolean = false;\n [EMITTED_END]: boolean = false;\n [EMITTING_END]: boolean = false;\n [CLOSED]: boolean = false;\n [EMITTED_ERROR]: unknown = null;\n [BUFFERLENGTH]: number = 0;\n [DESTROYED]: boolean = false;\n [SIGNAL]?: AbortSignal;\n [ABORTED]: boolean = false;\n [DATALISTENERS]: number = 0;\n [DISCARDED]: boolean = false\n\n /**\n * true if the stream can be written\n */\n writable: boolean = true\n /**\n * true if the stream can be read\n */\n readable: boolean = true\n\n /**\n * If `RType` is Buffer, then options do not need to be provided.\n * Otherwise, an options object must be provided to specify either\n * {@link Minipass.SharedOptions.objectMode} or\n * {@link Minipass.SharedOptions.encoding}, as appropriate.\n */\n constructor(\n ...args:\n | [Minipass.ObjectModeOptions]\n | (RType extends Buffer\n ? [] | [Minipass.Options]\n : [Minipass.Options])\n ) {\n const options: Minipass.Options = (args[0] ||\n {}) as Minipass.Options\n super()\n if (options.objectMode && typeof options.encoding === 'string') {\n throw new TypeError(\n 'Encoding and objectMode may not be used together'\n )\n }\n if (isObjectModeOptions(options)) {\n this[OBJECTMODE] = true\n this[ENCODING] = null\n } else if (isEncodingOptions(options)) {\n this[ENCODING] = options.encoding\n this[OBJECTMODE] = false\n } else {\n this[OBJECTMODE] = false\n this[ENCODING] = null\n }\n this[ASYNC] = !!options.async\n this[DECODER] = this[ENCODING]\n ? (new StringDecoder(this[ENCODING]) as SD)\n : null\n\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposeBuffer === true) {\n Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n }\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposePipes === true) {\n Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n }\n\n const { signal } = options\n if (signal) {\n this[SIGNAL] = signal\n if (signal.aborted) {\n this[ABORT]()\n } else {\n signal.addEventListener('abort', () => this[ABORT]())\n }\n }\n }\n\n /**\n * The amount of data stored in the buffer waiting to be read.\n *\n * For Buffer strings, this will be the total byte length.\n * For string encoding streams, this will be the string character length,\n * according to JavaScript's `string.length` logic.\n * For objectMode streams, this is a count of the items waiting to be\n * emitted.\n */\n get bufferLength() {\n return this[BUFFERLENGTH]\n }\n\n /**\n * The `BufferEncoding` currently in use, or `null`\n */\n get encoding() {\n return this[ENCODING]\n }\n\n /**\n * @deprecated - This is a read only property\n */\n set encoding(_enc) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * @deprecated - Encoding may only be set at instantiation time\n */\n setEncoding(_enc: Minipass.Encoding) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * True if this is an objectMode stream\n */\n get objectMode() {\n return this[OBJECTMODE]\n }\n\n /**\n * @deprecated - This is a read-only property\n */\n set objectMode(_om) {\n throw new Error('objectMode must be set at instantiation time')\n }\n\n /**\n * true if this is an async stream\n */\n get ['async'](): boolean {\n return this[ASYNC]\n }\n /**\n * Set to true to make this stream async.\n *\n * Once set, it cannot be unset, as this would potentially cause incorrect\n * behavior. Ie, a sync stream can be made async, but an async stream\n * cannot be safely made sync.\n */\n set ['async'](a: boolean) {\n this[ASYNC] = this[ASYNC] || !!a\n }\n\n // drop everything and get out of the flow completely\n [ABORT]() {\n this[ABORTED] = true\n this.emit('abort', this[SIGNAL]?.reason)\n this.destroy(this[SIGNAL]?.reason)\n }\n\n /**\n * True if the stream has been aborted.\n */\n get aborted() {\n return this[ABORTED]\n }\n /**\n * No-op setter. Stream aborted status is set via the AbortSignal provided\n * in the constructor options.\n */\n set aborted(_) {}\n\n /**\n * Write data into the stream\n *\n * If the chunk written is a string, and encoding is not specified, then\n * `utf8` will be assumed. If the stream encoding matches the encoding of\n * a written string, and the state of the string decoder allows it, then\n * the string will be passed through to either the output or the internal\n * buffer without any processing. Otherwise, it will be turned into a\n * Buffer object for processing into the desired encoding.\n *\n * If provided, `cb` function is called immediately before return for\n * sync streams, or on next tick for async streams, because for this\n * base class, a chunk is considered \"processed\" once it is accepted\n * and either emitted or buffered. That is, the callback does not indicate\n * that the chunk has been eventually emitted, though of course child\n * classes can override this function to do whatever processing is required\n * and call `super.write(...)` only once processing is completed.\n */\n write(chunk: WType, cb?: () => void): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding,\n cb?: () => void\n ): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): boolean {\n if (this[ABORTED]) return false\n if (this[EOF]) throw new Error('write after end')\n\n if (this[DESTROYED]) {\n this.emit(\n 'error',\n Object.assign(\n new Error('Cannot call write after a stream was destroyed'),\n { code: 'ERR_STREAM_DESTROYED' }\n )\n )\n return true\n }\n\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n\n if (!encoding) encoding = 'utf8'\n\n const fn = this[ASYNC] ? defer : nodefer\n\n // convert array buffers and typed array views into buffers\n // at some point in the future, we may want to do the opposite!\n // leave strings and buffers as-is\n // anything is only allowed if in object mode, so throw\n if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n if (isArrayBufferView(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(\n chunk.buffer,\n chunk.byteOffset,\n chunk.byteLength\n )\n } else if (isArrayBufferLike(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(chunk)\n } else if (typeof chunk !== 'string') {\n throw new Error(\n 'Non-contiguous data written to non-objectMode stream'\n )\n }\n }\n\n // handle object mode up front, since it's simpler\n // this yields better performance, fewer checks later.\n if (this[OBJECTMODE]) {\n // maybe impossible?\n /* c8 ignore start */\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n /* c8 ignore stop */\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n // at this point the chunk is a buffer or string\n // don't buffer it up or send it to the decoder\n if (!(chunk as Minipass.BufferOrString).length) {\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n if (cb) fn(cb)\n return this[FLOWING]\n }\n\n // fast-path writing strings of same encoding to a stream with\n // an empty buffer, skipping the buffer/decoder dance\n if (\n typeof chunk === 'string' &&\n // unless it is a string already ready for us to use\n !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n ) {\n //@ts-ignore - sinful unsafe type change\n chunk = Buffer.from(chunk, encoding)\n }\n\n if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n //@ts-ignore - sinful unsafe type change\n chunk = this[DECODER].write(chunk)\n }\n\n // Note: flushing CAN potentially switch us into not-flowing mode\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n /**\n * Low-level explicit read method.\n *\n * In objectMode, the argument is ignored, and one item is returned if\n * available.\n *\n * `n` is the number of bytes (or in the case of encoding streams,\n * characters) to consume. If `n` is not provided, then the entire buffer\n * is returned, or `null` is returned if no data is available.\n *\n * If `n` is greater that the amount of data in the internal buffer,\n * then `null` is returned.\n */\n read(n?: number | null): RType | null {\n if (this[DESTROYED]) return null\n this[DISCARDED] = false\n\n if (\n this[BUFFERLENGTH] === 0 ||\n n === 0 ||\n (n && n > this[BUFFERLENGTH])\n ) {\n this[MAYBE_EMIT_END]()\n return null\n }\n\n if (this[OBJECTMODE]) n = null\n\n if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n // not object mode, so if we have an encoding, then RType is string\n // otherwise, must be Buffer\n this[BUFFER] = [\n (this[ENCODING]\n ? this[BUFFER].join('')\n : Buffer.concat(\n this[BUFFER] as Buffer[],\n this[BUFFERLENGTH]\n )) as RType,\n ]\n }\n\n const ret = this[READ](n || null, this[BUFFER][0] as RType)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [READ](n: number | null, chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n else {\n const c = chunk as Minipass.BufferOrString\n if (n === c.length || n === null) this[BUFFERSHIFT]()\n else if (typeof c === 'string') {\n this[BUFFER][0] = c.slice(n) as RType\n chunk = c.slice(0, n) as RType\n this[BUFFERLENGTH] -= n\n } else {\n this[BUFFER][0] = c.subarray(n) as RType\n chunk = c.subarray(0, n) as RType\n this[BUFFERLENGTH] -= n\n }\n }\n\n this.emit('data', chunk)\n\n if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n return chunk\n }\n\n /**\n * End the stream, optionally providing a final write.\n *\n * See {@link Minipass#write} for argument descriptions\n */\n end(cb?: () => void): this\n end(chunk: WType, cb?: () => void): this\n end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n end(\n chunk?: WType | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): this {\n if (typeof chunk === 'function') {\n cb = chunk as () => void\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n if (chunk !== undefined) this.write(chunk, encoding)\n if (cb) this.once('end', cb)\n this[EOF] = true\n this.writable = false\n\n // if we haven't written anything, then go ahead and emit,\n // even if we're not reading.\n // we'll re-emit if a new 'end' listener is added anyway.\n // This makes MP more suitable to write-only use cases.\n if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n return this\n }\n\n // don't let the internal resume be overwritten\n [RESUME]() {\n if (this[DESTROYED]) return\n\n if (!this[DATALISTENERS] && !this[PIPES].length) {\n this[DISCARDED] = true\n }\n this[PAUSED] = false\n this[FLOWING] = true\n this.emit('resume')\n if (this[BUFFER].length) this[FLUSH]()\n else if (this[EOF]) this[MAYBE_EMIT_END]()\n else this.emit('drain')\n }\n\n /**\n * Resume the stream if it is currently in a paused state\n *\n * If called when there are no pipe destinations or `data` event listeners,\n * this will place the stream in a \"discarded\" state, where all data will\n * be thrown away. The discarded state is removed if a pipe destination or\n * data handler is added, if pause() is called, or if any synchronous or\n * asynchronous iteration is started.\n */\n resume() {\n return this[RESUME]()\n }\n\n /**\n * Pause the stream\n */\n pause() {\n this[FLOWING] = false\n this[PAUSED] = true\n this[DISCARDED] = false\n }\n\n /**\n * true if the stream has been forcibly destroyed\n */\n get destroyed() {\n return this[DESTROYED]\n }\n\n /**\n * true if the stream is currently in a flowing state, meaning that\n * any writes will be immediately emitted.\n */\n get flowing() {\n return this[FLOWING]\n }\n\n /**\n * true if the stream is currently in a paused state\n */\n get paused() {\n return this[PAUSED]\n }\n\n [BUFFERPUSH](chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n this[BUFFER].push(chunk)\n }\n\n [BUFFERSHIFT](): RType {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n else\n this[BUFFERLENGTH] -= (\n this[BUFFER][0] as Minipass.BufferOrString\n ).length\n return this[BUFFER].shift() as RType\n }\n\n [FLUSH](noDrain: boolean = false) {\n do {} while (\n this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n this[BUFFER].length\n )\n\n if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n }\n\n [FLUSHCHUNK](chunk: RType) {\n this.emit('data', chunk)\n return this[FLOWING]\n }\n\n /**\n * Pipe all data emitted by this stream into the destination provided.\n *\n * Triggers the flow of data.\n */\n pipe(dest: W, opts?: PipeOptions): W {\n if (this[DESTROYED]) return dest\n this[DISCARDED] = false\n\n const ended = this[EMITTED_END]\n opts = opts || {}\n if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n else opts.end = opts.end !== false\n opts.proxyErrors = !!opts.proxyErrors\n\n // piping an ended stream ends immediately\n if (ended) {\n if (opts.end) dest.end()\n } else {\n // \"as\" here just ignores the WType, which pipes don't care about,\n // since they're only consuming from us, and writing to the dest\n this[PIPES].push(\n !opts.proxyErrors\n ? new Pipe(this as Minipass, dest, opts)\n : new PipeProxyErrors(this as Minipass, dest, opts)\n )\n if (this[ASYNC]) defer(() => this[RESUME]())\n else this[RESUME]()\n }\n\n return dest\n }\n\n /**\n * Fully unhook a piped destination stream.\n *\n * If the destination stream was the only consumer of this stream (ie,\n * there are no other piped destinations or `'data'` event listeners)\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n unpipe(dest: W) {\n const p = this[PIPES].find(p => p.dest === dest)\n if (p) {\n if (this[PIPES].length === 1) {\n if (this[FLOWING] && this[DATALISTENERS] === 0) {\n this[FLOWING] = false\n }\n this[PIPES] = []\n } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n p.unpipe()\n }\n }\n\n /**\n * Alias for {@link Minipass#on}\n */\n addListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n return this.on(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.on`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * - Adding a 'data' event handler will trigger the flow of data\n *\n * - Adding a 'readable' event handler when there is data waiting to be read\n * will cause 'readable' to be emitted immediately.\n *\n * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n * already passed will cause the event to be emitted immediately and all\n * handlers removed.\n *\n * - Adding an 'error' event handler after an error has been emitted will\n * cause the event to be re-emitted immediately with the error previously\n * raised.\n */\n on(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n const ret = super.on(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n if (ev === 'data') {\n this[DISCARDED] = false\n this[DATALISTENERS]++\n if (!this[PIPES].length && !this[FLOWING]) {\n this[RESUME]()\n }\n } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n super.emit('readable')\n } else if (isEndish(ev) && this[EMITTED_END]) {\n super.emit(ev)\n this.removeAllListeners(ev)\n } else if (ev === 'error' && this[EMITTED_ERROR]) {\n const h = handler as (...a: Events['error']) => any\n if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n else h.call(this, this[EMITTED_ERROR])\n }\n return ret\n }\n\n /**\n * Alias for {@link Minipass#off}\n */\n removeListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n return this.off(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.off`\n *\n * If a 'data' event handler is removed, and it was the last consumer\n * (ie, there are no pipe destinations or other 'data' event listeners),\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n off(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n const ret = super.off(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n // if we previously had listeners, and now we don't, and we don't\n // have any pipes, then stop the flow, unless it's been explicitly\n // put in a discarded flowing state via stream.resume().\n if (ev === 'data') {\n this[DATALISTENERS] = this.listeners('data').length\n if (\n this[DATALISTENERS] === 0 &&\n !this[DISCARDED] &&\n !this[PIPES].length\n ) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * Mostly identical to `EventEmitter.removeAllListeners`\n *\n * If all 'data' event handlers are removed, and they were the last consumer\n * (ie, there are no pipe destinations), then the flow of data will stop\n * until there is another consumer or {@link Minipass#resume} is explicitly\n * called.\n */\n removeAllListeners(ev?: Event) {\n const ret = super.removeAllListeners(ev as string | symbol | undefined)\n if (ev === 'data' || ev === undefined) {\n this[DATALISTENERS] = 0\n if (!this[DISCARDED] && !this[PIPES].length) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * true if the 'end' event has been emitted\n */\n get emittedEnd() {\n return this[EMITTED_END]\n }\n\n [MAYBE_EMIT_END]() {\n if (\n !this[EMITTING_END] &&\n !this[EMITTED_END] &&\n !this[DESTROYED] &&\n this[BUFFER].length === 0 &&\n this[EOF]\n ) {\n this[EMITTING_END] = true\n this.emit('end')\n this.emit('prefinish')\n this.emit('finish')\n if (this[CLOSED]) this.emit('close')\n this[EMITTING_END] = false\n }\n }\n\n /**\n * Mostly identical to `EventEmitter.emit`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * If the stream has been destroyed, and the event is something other\n * than 'close' or 'error', then `false` is returned and no handlers\n * are called.\n *\n * If the event is 'end', and has already been emitted, then the event\n * is ignored. If the stream is in a paused or non-flowing state, then\n * the event will be deferred until data flow resumes. If the stream is\n * async, then handlers will be called on the next tick rather than\n * immediately.\n *\n * If the event is 'close', and 'end' has not yet been emitted, then\n * the event will be deferred until after 'end' is emitted.\n *\n * If the event is 'error', and an AbortSignal was provided for the stream,\n * and there are no listeners, then the event is ignored, matching the\n * behavior of node core streams in the presense of an AbortSignal.\n *\n * If the event is 'finish' or 'prefinish', then all listeners will be\n * removed after emitting the event, to prevent double-firing.\n */\n emit(\n ev: Event,\n ...args: Events[Event]\n ): boolean {\n const data = args[0]\n // error and close are only events allowed after calling destroy()\n if (\n ev !== 'error' &&\n ev !== 'close' &&\n ev !== DESTROYED &&\n this[DESTROYED]\n ) {\n return false\n } else if (ev === 'data') {\n return !this[OBJECTMODE] && !data\n ? false\n : this[ASYNC]\n ? (defer(() => this[EMITDATA](data as RType)), true)\n : this[EMITDATA](data as RType)\n } else if (ev === 'end') {\n return this[EMITEND]()\n } else if (ev === 'close') {\n this[CLOSED] = true\n // don't emit close before 'end' and 'finish'\n if (!this[EMITTED_END] && !this[DESTROYED]) return false\n const ret = super.emit('close')\n this.removeAllListeners('close')\n return ret\n } else if (ev === 'error') {\n this[EMITTED_ERROR] = data\n super.emit(ERROR, data)\n const ret =\n !this[SIGNAL] || this.listeners('error').length\n ? super.emit('error', data)\n : false\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'resume') {\n const ret = super.emit('resume')\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'finish' || ev === 'prefinish') {\n const ret = super.emit(ev)\n this.removeAllListeners(ev)\n return ret\n }\n\n // Some other unknown event\n const ret = super.emit(ev as string, ...args)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITDATA](data: RType) {\n for (const p of this[PIPES]) {\n if (p.dest.write(data as RType) === false) this.pause()\n }\n const ret = this[DISCARDED] ? false : super.emit('data', data)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITEND]() {\n if (this[EMITTED_END]) return false\n\n this[EMITTED_END] = true\n this.readable = false\n return this[ASYNC]\n ? (defer(() => this[EMITEND2]()), true)\n : this[EMITEND2]()\n }\n\n [EMITEND2]() {\n if (this[DECODER]) {\n const data = this[DECODER].end()\n if (data) {\n for (const p of this[PIPES]) {\n p.dest.write(data as RType)\n }\n if (!this[DISCARDED]) super.emit('data', data)\n }\n }\n\n for (const p of this[PIPES]) {\n p.end()\n }\n const ret = super.emit('end')\n this.removeAllListeners('end')\n return ret\n }\n\n /**\n * Return a Promise that resolves to an array of all emitted data once\n * the stream ends.\n */\n async collect(): Promise {\n const buf: RType[] & { dataLength: number } = Object.assign([], {\n dataLength: 0,\n })\n if (!this[OBJECTMODE]) buf.dataLength = 0\n // set the promise first, in case an error is raised\n // by triggering the flow here.\n const p = this.promise()\n this.on('data', c => {\n buf.push(c)\n if (!this[OBJECTMODE])\n buf.dataLength += (c as Minipass.BufferOrString).length\n })\n await p\n return buf\n }\n\n /**\n * Return a Promise that resolves to the concatenation of all emitted data\n * once the stream ends.\n *\n * Not allowed on objectMode streams.\n */\n async concat(): Promise {\n if (this[OBJECTMODE]) {\n throw new Error('cannot concat in objectMode')\n }\n const buf = await this.collect()\n return (\n this[ENCODING]\n ? buf.join('')\n : Buffer.concat(buf as Buffer[], buf.dataLength)\n ) as RType\n }\n\n /**\n * Return a void Promise that resolves once the stream ends.\n */\n async promise(): Promise {\n return new Promise((resolve, reject) => {\n this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n this.on('error', er => reject(er))\n this.on('end', () => resolve())\n })\n }\n\n /**\n * Asynchronous `for await of` iteration.\n *\n * This will continue emitting all chunks until the stream terminates.\n */\n [Symbol.asyncIterator](): AsyncGenerator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = async (): Promise> => {\n this.pause()\n stopped = true\n return { value: undefined, done: true }\n }\n const next = (): Promise> => {\n if (stopped) return stop()\n const res = this.read()\n if (res !== null) return Promise.resolve({ done: false, value: res })\n\n if (this[EOF]) return stop()\n\n let resolve!: (res: IteratorResult) => void\n let reject!: (er: unknown) => void\n const onerr = (er: unknown) => {\n this.off('data', ondata)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n stop()\n reject(er)\n }\n const ondata = (value: RType) => {\n this.off('error', onerr)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n this.pause()\n resolve({ value, done: !!this[EOF] })\n }\n const onend = () => {\n this.off('error', onerr)\n this.off('data', ondata)\n this.off(DESTROYED, ondestroy)\n stop()\n resolve({ done: true, value: undefined })\n }\n const ondestroy = () => onerr(new Error('stream destroyed'))\n return new Promise>((res, rej) => {\n reject = rej\n resolve = res\n this.once(DESTROYED, ondestroy)\n this.once('error', onerr)\n this.once('end', onend)\n this.once('data', ondata)\n })\n }\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.asyncIterator]() {\n return this\n },\n [Symbol.asyncDispose]: async () => {},\n }\n }\n\n /**\n * Synchronous `for of` iteration.\n *\n * The iteration will terminate when the internal buffer runs out, even\n * if the stream has not yet terminated.\n */\n [Symbol.iterator](): Generator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = (): IteratorReturnResult => {\n this.pause()\n this.off(ERROR, stop)\n this.off(DESTROYED, stop)\n this.off('end', stop)\n stopped = true\n return { done: true, value: undefined }\n }\n\n const next = (): IteratorResult => {\n if (stopped) return stop()\n const value = this.read()\n return value === null ? stop() : { done: false, value }\n }\n\n this.once('end', stop)\n this.once(ERROR, stop)\n this.once(DESTROYED, stop)\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.iterator]() {\n return this\n },\n [Symbol.dispose]: () => {},\n }\n }\n\n /**\n * Destroy a stream, preventing it from being used for any further purpose.\n *\n * If the stream has a `close()` method, then it will be called on\n * destruction.\n *\n * After destruction, any attempt to write data, read data, or emit most\n * events will be ignored.\n *\n * If an error argument is provided, then it will be emitted in an\n * 'error' event.\n */\n destroy(er?: unknown) {\n if (this[DESTROYED]) {\n if (er) this.emit('error', er)\n else this.emit(DESTROYED)\n return this\n }\n\n this[DESTROYED] = true\n this[DISCARDED] = true\n\n // throw away all buffered data, it's never coming out\n this[BUFFER].length = 0\n this[BUFFERLENGTH] = 0\n\n const wc = this as Minipass & {\n close?: () => void\n }\n if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n if (er) this.emit('error', er)\n // if no error to emit, still reject pending promises\n else this.emit(DESTROYED)\n\n return this\n }\n\n /**\n * Alias for {@link isStream}\n *\n * Former export location, maintained for backwards compatibility.\n *\n * @deprecated\n */\n static get isStream() {\n return isStream\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minipass/dist/esm/index.js b/node_modules/minipass/dist/esm/index.js new file mode 100644 index 0000000..5df5546 --- /dev/null +++ b/node_modules/minipass/dist/esm/index.js @@ -0,0 +1,1020 @@ +const proc = typeof process === 'object' && process + ? process + : { + stdout: null, + stderr: null, + }; +import { EventEmitter } from 'node:events'; +import Stream from 'node:stream'; +import { StringDecoder } from 'node:string_decoder'; +/** + * Return true if the argument is a Minipass stream, Node stream, or something + * else that Minipass can interact with. + */ +export const isStream = (s) => !!s && + typeof s === 'object' && + (s instanceof Minipass || + s instanceof Stream || + isReadable(s) || + isWritable(s)); +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +export const isReadable = (s) => !!s && + typeof s === 'object' && + s instanceof EventEmitter && + typeof s.pipe === 'function' && + // node core Writable streams have a pipe() method, but it throws + s.pipe !== Stream.Writable.prototype.pipe; +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +export const isWritable = (s) => !!s && + typeof s === 'object' && + s instanceof EventEmitter && + typeof s.write === 'function' && + typeof s.end === 'function'; +const EOF = Symbol('EOF'); +const MAYBE_EMIT_END = Symbol('maybeEmitEnd'); +const EMITTED_END = Symbol('emittedEnd'); +const EMITTING_END = Symbol('emittingEnd'); +const EMITTED_ERROR = Symbol('emittedError'); +const CLOSED = Symbol('closed'); +const READ = Symbol('read'); +const FLUSH = Symbol('flush'); +const FLUSHCHUNK = Symbol('flushChunk'); +const ENCODING = Symbol('encoding'); +const DECODER = Symbol('decoder'); +const FLOWING = Symbol('flowing'); +const PAUSED = Symbol('paused'); +const RESUME = Symbol('resume'); +const BUFFER = Symbol('buffer'); +const PIPES = Symbol('pipes'); +const BUFFERLENGTH = Symbol('bufferLength'); +const BUFFERPUSH = Symbol('bufferPush'); +const BUFFERSHIFT = Symbol('bufferShift'); +const OBJECTMODE = Symbol('objectMode'); +// internal event when stream is destroyed +const DESTROYED = Symbol('destroyed'); +// internal event when stream has an error +const ERROR = Symbol('error'); +const EMITDATA = Symbol('emitData'); +const EMITEND = Symbol('emitEnd'); +const EMITEND2 = Symbol('emitEnd2'); +const ASYNC = Symbol('async'); +const ABORT = Symbol('abort'); +const ABORTED = Symbol('aborted'); +const SIGNAL = Symbol('signal'); +const DATALISTENERS = Symbol('dataListeners'); +const DISCARDED = Symbol('discarded'); +const defer = (fn) => Promise.resolve().then(fn); +const nodefer = (fn) => fn(); +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish'; +const isArrayBufferLike = (b) => b instanceof ArrayBuffer || + (!!b && + typeof b === 'object' && + b.constructor && + b.constructor.name === 'ArrayBuffer' && + b.byteLength >= 0); +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); +/** + * Internal class representing a pipe to a destination stream. + * + * @internal + */ +class Pipe { + src; + dest; + opts; + ondrain; + constructor(src, dest, opts) { + this.src = src; + this.dest = dest; + this.opts = opts; + this.ondrain = () => src[RESUME](); + this.dest.on('drain', this.ondrain); + } + unpipe() { + this.dest.removeListener('drain', this.ondrain); + } + // only here for the prototype + /* c8 ignore start */ + proxyErrors(_er) { } + /* c8 ignore stop */ + end() { + this.unpipe(); + if (this.opts.end) + this.dest.end(); + } +} +/** + * Internal class representing a pipe to a destination stream where + * errors are proxied. + * + * @internal + */ +class PipeProxyErrors extends Pipe { + unpipe() { + this.src.removeListener('error', this.proxyErrors); + super.unpipe(); + } + constructor(src, dest, opts) { + super(src, dest, opts); + this.proxyErrors = (er) => this.dest.emit('error', er); + src.on('error', this.proxyErrors); + } +} +const isObjectModeOptions = (o) => !!o.objectMode; +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer'; +/** + * Main export, the Minipass class + * + * `RType` is the type of data emitted, defaults to Buffer + * + * `WType` is the type of data to be written, if RType is buffer or string, + * then any {@link Minipass.ContiguousData} is allowed. + * + * `Events` is the set of event handler signatures that this object + * will emit, see {@link Minipass.Events} + */ +export class Minipass extends EventEmitter { + [FLOWING] = false; + [PAUSED] = false; + [PIPES] = []; + [BUFFER] = []; + [OBJECTMODE]; + [ENCODING]; + [ASYNC]; + [DECODER]; + [EOF] = false; + [EMITTED_END] = false; + [EMITTING_END] = false; + [CLOSED] = false; + [EMITTED_ERROR] = null; + [BUFFERLENGTH] = 0; + [DESTROYED] = false; + [SIGNAL]; + [ABORTED] = false; + [DATALISTENERS] = 0; + [DISCARDED] = false; + /** + * true if the stream can be written + */ + writable = true; + /** + * true if the stream can be read + */ + readable = true; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args) { + const options = (args[0] || + {}); + super(); + if (options.objectMode && typeof options.encoding === 'string') { + throw new TypeError('Encoding and objectMode may not be used together'); + } + if (isObjectModeOptions(options)) { + this[OBJECTMODE] = true; + this[ENCODING] = null; + } + else if (isEncodingOptions(options)) { + this[ENCODING] = options.encoding; + this[OBJECTMODE] = false; + } + else { + this[OBJECTMODE] = false; + this[ENCODING] = null; + } + this[ASYNC] = !!options.async; + this[DECODER] = this[ENCODING] + ? new StringDecoder(this[ENCODING]) + : null; + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposeBuffer === true) { + Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] }); + } + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposePipes === true) { + Object.defineProperty(this, 'pipes', { get: () => this[PIPES] }); + } + const { signal } = options; + if (signal) { + this[SIGNAL] = signal; + if (signal.aborted) { + this[ABORT](); + } + else { + signal.addEventListener('abort', () => this[ABORT]()); + } + } + } + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ + get bufferLength() { + return this[BUFFERLENGTH]; + } + /** + * The `BufferEncoding` currently in use, or `null` + */ + get encoding() { + return this[ENCODING]; + } + /** + * @deprecated - This is a read only property + */ + set encoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * True if this is an objectMode stream + */ + get objectMode() { + return this[OBJECTMODE]; + } + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om) { + throw new Error('objectMode must be set at instantiation time'); + } + /** + * true if this is an async stream + */ + get ['async']() { + return this[ASYNC]; + } + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ + set ['async'](a) { + this[ASYNC] = this[ASYNC] || !!a; + } + // drop everything and get out of the flow completely + [ABORT]() { + this[ABORTED] = true; + this.emit('abort', this[SIGNAL]?.reason); + this.destroy(this[SIGNAL]?.reason); + } + /** + * True if the stream has been aborted. + */ + get aborted() { + return this[ABORTED]; + } + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_) { } + write(chunk, encoding, cb) { + if (this[ABORTED]) + return false; + if (this[EOF]) + throw new Error('write after end'); + if (this[DESTROYED]) { + this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' })); + return true; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (!encoding) + encoding = 'utf8'; + const fn = this[ASYNC] ? defer : nodefer; + // convert array buffers and typed array views into buffers + // at some point in the future, we may want to do the opposite! + // leave strings and buffers as-is + // anything is only allowed if in object mode, so throw + if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { + if (isArrayBufferView(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } + else if (isArrayBufferLike(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk); + } + else if (typeof chunk !== 'string') { + throw new Error('Non-contiguous data written to non-objectMode stream'); + } + } + // handle object mode up front, since it's simpler + // this yields better performance, fewer checks later. + if (this[OBJECTMODE]) { + // maybe impossible? + /* c8 ignore start */ + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + /* c8 ignore stop */ + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // at this point the chunk is a buffer or string + // don't buffer it up or send it to the decoder + if (!chunk.length) { + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // fast-path writing strings of same encoding to a stream with + // an empty buffer, skipping the buffer/decoder dance + if (typeof chunk === 'string' && + // unless it is a string already ready for us to use + !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) { + //@ts-ignore - sinful unsafe type change + chunk = Buffer.from(chunk, encoding); + } + if (Buffer.isBuffer(chunk) && this[ENCODING]) { + //@ts-ignore - sinful unsafe type change + chunk = this[DECODER].write(chunk); + } + // Note: flushing CAN potentially switch us into not-flowing mode + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ + read(n) { + if (this[DESTROYED]) + return null; + this[DISCARDED] = false; + if (this[BUFFERLENGTH] === 0 || + n === 0 || + (n && n > this[BUFFERLENGTH])) { + this[MAYBE_EMIT_END](); + return null; + } + if (this[OBJECTMODE]) + n = null; + if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { + // not object mode, so if we have an encoding, then RType is string + // otherwise, must be Buffer + this[BUFFER] = [ + (this[ENCODING] + ? this[BUFFER].join('') + : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])), + ]; + } + const ret = this[READ](n || null, this[BUFFER][0]); + this[MAYBE_EMIT_END](); + return ret; + } + [READ](n, chunk) { + if (this[OBJECTMODE]) + this[BUFFERSHIFT](); + else { + const c = chunk; + if (n === c.length || n === null) + this[BUFFERSHIFT](); + else if (typeof c === 'string') { + this[BUFFER][0] = c.slice(n); + chunk = c.slice(0, n); + this[BUFFERLENGTH] -= n; + } + else { + this[BUFFER][0] = c.subarray(n); + chunk = c.subarray(0, n); + this[BUFFERLENGTH] -= n; + } + } + this.emit('data', chunk); + if (!this[BUFFER].length && !this[EOF]) + this.emit('drain'); + return chunk; + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (chunk !== undefined) + this.write(chunk, encoding); + if (cb) + this.once('end', cb); + this[EOF] = true; + this.writable = false; + // if we haven't written anything, then go ahead and emit, + // even if we're not reading. + // we'll re-emit if a new 'end' listener is added anyway. + // This makes MP more suitable to write-only use cases. + if (this[FLOWING] || !this[PAUSED]) + this[MAYBE_EMIT_END](); + return this; + } + // don't let the internal resume be overwritten + [RESUME]() { + if (this[DESTROYED]) + return; + if (!this[DATALISTENERS] && !this[PIPES].length) { + this[DISCARDED] = true; + } + this[PAUSED] = false; + this[FLOWING] = true; + this.emit('resume'); + if (this[BUFFER].length) + this[FLUSH](); + else if (this[EOF]) + this[MAYBE_EMIT_END](); + else + this.emit('drain'); + } + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ + resume() { + return this[RESUME](); + } + /** + * Pause the stream + */ + pause() { + this[FLOWING] = false; + this[PAUSED] = true; + this[DISCARDED] = false; + } + /** + * true if the stream has been forcibly destroyed + */ + get destroyed() { + return this[DESTROYED]; + } + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ + get flowing() { + return this[FLOWING]; + } + /** + * true if the stream is currently in a paused state + */ + get paused() { + return this[PAUSED]; + } + [BUFFERPUSH](chunk) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] += 1; + else + this[BUFFERLENGTH] += chunk.length; + this[BUFFER].push(chunk); + } + [BUFFERSHIFT]() { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1; + else + this[BUFFERLENGTH] -= this[BUFFER][0].length; + return this[BUFFER].shift(); + } + [FLUSH](noDrain = false) { + do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && + this[BUFFER].length); + if (!noDrain && !this[BUFFER].length && !this[EOF]) + this.emit('drain'); + } + [FLUSHCHUNK](chunk) { + this.emit('data', chunk); + return this[FLOWING]; + } + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ + pipe(dest, opts) { + if (this[DESTROYED]) + return dest; + this[DISCARDED] = false; + const ended = this[EMITTED_END]; + opts = opts || {}; + if (dest === proc.stdout || dest === proc.stderr) + opts.end = false; + else + opts.end = opts.end !== false; + opts.proxyErrors = !!opts.proxyErrors; + // piping an ended stream ends immediately + if (ended) { + if (opts.end) + dest.end(); + } + else { + // "as" here just ignores the WType, which pipes don't care about, + // since they're only consuming from us, and writing to the dest + this[PIPES].push(!opts.proxyErrors + ? new Pipe(this, dest, opts) + : new PipeProxyErrors(this, dest, opts)); + if (this[ASYNC]) + defer(() => this[RESUME]()); + else + this[RESUME](); + } + return dest; + } + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + unpipe(dest) { + const p = this[PIPES].find(p => p.dest === dest); + if (p) { + if (this[PIPES].length === 1) { + if (this[FLOWING] && this[DATALISTENERS] === 0) { + this[FLOWING] = false; + } + this[PIPES] = []; + } + else + this[PIPES].splice(this[PIPES].indexOf(p), 1); + p.unpipe(); + } + } + /** + * Alias for {@link Minipass#on} + */ + addListener(ev, handler) { + return this.on(ev, handler); + } + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev, handler) { + const ret = super.on(ev, handler); + if (ev === 'data') { + this[DISCARDED] = false; + this[DATALISTENERS]++; + if (!this[PIPES].length && !this[FLOWING]) { + this[RESUME](); + } + } + else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) { + super.emit('readable'); + } + else if (isEndish(ev) && this[EMITTED_END]) { + super.emit(ev); + this.removeAllListeners(ev); + } + else if (ev === 'error' && this[EMITTED_ERROR]) { + const h = handler; + if (this[ASYNC]) + defer(() => h.call(this, this[EMITTED_ERROR])); + else + h.call(this, this[EMITTED_ERROR]); + } + return ret; + } + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev, handler) { + return this.off(ev, handler); + } + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev, handler) { + const ret = super.off(ev, handler); + // if we previously had listeners, and now we don't, and we don't + // have any pipes, then stop the flow, unless it's been explicitly + // put in a discarded flowing state via stream.resume(). + if (ev === 'data') { + this[DATALISTENERS] = this.listeners('data').length; + if (this[DATALISTENERS] === 0 && + !this[DISCARDED] && + !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev) { + const ret = super.removeAllListeners(ev); + if (ev === 'data' || ev === undefined) { + this[DATALISTENERS] = 0; + if (!this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * true if the 'end' event has been emitted + */ + get emittedEnd() { + return this[EMITTED_END]; + } + [MAYBE_EMIT_END]() { + if (!this[EMITTING_END] && + !this[EMITTED_END] && + !this[DESTROYED] && + this[BUFFER].length === 0 && + this[EOF]) { + this[EMITTING_END] = true; + this.emit('end'); + this.emit('prefinish'); + this.emit('finish'); + if (this[CLOSED]) + this.emit('close'); + this[EMITTING_END] = false; + } + } + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev, ...args) { + const data = args[0]; + // error and close are only events allowed after calling destroy() + if (ev !== 'error' && + ev !== 'close' && + ev !== DESTROYED && + this[DESTROYED]) { + return false; + } + else if (ev === 'data') { + return !this[OBJECTMODE] && !data + ? false + : this[ASYNC] + ? (defer(() => this[EMITDATA](data)), true) + : this[EMITDATA](data); + } + else if (ev === 'end') { + return this[EMITEND](); + } + else if (ev === 'close') { + this[CLOSED] = true; + // don't emit close before 'end' and 'finish' + if (!this[EMITTED_END] && !this[DESTROYED]) + return false; + const ret = super.emit('close'); + this.removeAllListeners('close'); + return ret; + } + else if (ev === 'error') { + this[EMITTED_ERROR] = data; + super.emit(ERROR, data); + const ret = !this[SIGNAL] || this.listeners('error').length + ? super.emit('error', data) + : false; + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'resume') { + const ret = super.emit('resume'); + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'finish' || ev === 'prefinish') { + const ret = super.emit(ev); + this.removeAllListeners(ev); + return ret; + } + // Some other unknown event + const ret = super.emit(ev, ...args); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITDATA](data) { + for (const p of this[PIPES]) { + if (p.dest.write(data) === false) + this.pause(); + } + const ret = this[DISCARDED] ? false : super.emit('data', data); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITEND]() { + if (this[EMITTED_END]) + return false; + this[EMITTED_END] = true; + this.readable = false; + return this[ASYNC] + ? (defer(() => this[EMITEND2]()), true) + : this[EMITEND2](); + } + [EMITEND2]() { + if (this[DECODER]) { + const data = this[DECODER].end(); + if (data) { + for (const p of this[PIPES]) { + p.dest.write(data); + } + if (!this[DISCARDED]) + super.emit('data', data); + } + } + for (const p of this[PIPES]) { + p.end(); + } + const ret = super.emit('end'); + this.removeAllListeners('end'); + return ret; + } + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + async collect() { + const buf = Object.assign([], { + dataLength: 0, + }); + if (!this[OBJECTMODE]) + buf.dataLength = 0; + // set the promise first, in case an error is raised + // by triggering the flow here. + const p = this.promise(); + this.on('data', c => { + buf.push(c); + if (!this[OBJECTMODE]) + buf.dataLength += c.length; + }); + await p; + return buf; + } + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + async concat() { + if (this[OBJECTMODE]) { + throw new Error('cannot concat in objectMode'); + } + const buf = await this.collect(); + return (this[ENCODING] + ? buf.join('') + : Buffer.concat(buf, buf.dataLength)); + } + /** + * Return a void Promise that resolves once the stream ends. + */ + async promise() { + return new Promise((resolve, reject) => { + this.on(DESTROYED, () => reject(new Error('stream destroyed'))); + this.on('error', er => reject(er)); + this.on('end', () => resolve()); + }); + } + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = async () => { + this.pause(); + stopped = true; + return { value: undefined, done: true }; + }; + const next = () => { + if (stopped) + return stop(); + const res = this.read(); + if (res !== null) + return Promise.resolve({ done: false, value: res }); + if (this[EOF]) + return stop(); + let resolve; + let reject; + const onerr = (er) => { + this.off('data', ondata); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + stop(); + reject(er); + }; + const ondata = (value) => { + this.off('error', onerr); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + this.pause(); + resolve({ value, done: !!this[EOF] }); + }; + const onend = () => { + this.off('error', onerr); + this.off('data', ondata); + this.off(DESTROYED, ondestroy); + stop(); + resolve({ done: true, value: undefined }); + }; + const ondestroy = () => onerr(new Error('stream destroyed')); + return new Promise((res, rej) => { + reject = rej; + resolve = res; + this.once(DESTROYED, ondestroy); + this.once('error', onerr); + this.once('end', onend); + this.once('data', ondata); + }); + }; + return { + next, + throw: stop, + return: stop, + [Symbol.asyncIterator]() { + return this; + }, + [Symbol.asyncDispose]: async () => { }, + }; + } + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = () => { + this.pause(); + this.off(ERROR, stop); + this.off(DESTROYED, stop); + this.off('end', stop); + stopped = true; + return { done: true, value: undefined }; + }; + const next = () => { + if (stopped) + return stop(); + const value = this.read(); + return value === null ? stop() : { done: false, value }; + }; + this.once('end', stop); + this.once(ERROR, stop); + this.once(DESTROYED, stop); + return { + next, + throw: stop, + return: stop, + [Symbol.iterator]() { + return this; + }, + [Symbol.dispose]: () => { }, + }; + } + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ + destroy(er) { + if (this[DESTROYED]) { + if (er) + this.emit('error', er); + else + this.emit(DESTROYED); + return this; + } + this[DESTROYED] = true; + this[DISCARDED] = true; + // throw away all buffered data, it's never coming out + this[BUFFER].length = 0; + this[BUFFERLENGTH] = 0; + const wc = this; + if (typeof wc.close === 'function' && !this[CLOSED]) + wc.close(); + if (er) + this.emit('error', er); + // if no error to emit, still reject pending promises + else + this.emit(DESTROYED); + return this; + } + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream() { + return isStream; + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/minipass/dist/esm/index.js.map b/node_modules/minipass/dist/esm/index.js.map new file mode 100644 index 0000000..4d87920 --- /dev/null +++ b/node_modules/minipass/dist/esm/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const proc =\n typeof process === 'object' && process\n ? process\n : {\n stdout: null,\n stderr: null,\n }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n s: any\n): s is Minipass.Readable | Minipass.Writable =>\n !!s &&\n typeof s === 'object' &&\n (s instanceof Minipass ||\n s instanceof Stream ||\n isReadable(s) ||\n isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Readable).pipe === 'function' &&\n // node core Writable streams have a pipe() method, but it throws\n (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Writable).write === 'function' &&\n typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n b instanceof ArrayBuffer ||\n (!!b &&\n typeof b === 'object' &&\n b.constructor &&\n b.constructor.name === 'ArrayBuffer' &&\n b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n /**\n * end the destination stream when the source stream ends\n */\n end?: boolean\n /**\n * proxy errors from the source stream to the destination stream\n */\n proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe {\n src: Minipass\n dest: Minipass\n opts: PipeOptions\n ondrain: () => any\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n this.src = src\n this.dest = dest as Minipass\n this.opts = opts\n this.ondrain = () => src[RESUME]()\n this.dest.on('drain', this.ondrain)\n }\n unpipe() {\n this.dest.removeListener('drain', this.ondrain)\n }\n // only here for the prototype\n /* c8 ignore start */\n proxyErrors(_er: any) {}\n /* c8 ignore stop */\n end() {\n this.unpipe()\n if (this.opts.end) this.dest.end()\n }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors extends Pipe {\n unpipe() {\n this.src.removeListener('error', this.proxyErrors)\n super.unpipe()\n }\n constructor(\n src: Minipass,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n super(src, dest, opts)\n this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n src.on('error', this.proxyErrors)\n }\n}\n\nexport namespace Minipass {\n /**\n * Encoding used to create a stream that outputs strings rather than\n * Buffer objects.\n */\n export type Encoding = BufferEncoding | 'buffer' | null\n\n /**\n * Any stream that Minipass can pipe into\n */\n export type Writable =\n | Minipass\n | NodeJS.WriteStream\n | (NodeJS.WriteStream & { fd: number })\n | (EventEmitter & {\n end(): any\n write(chunk: any, ...args: any[]): any\n })\n\n /**\n * Any stream that can be read from\n */\n export type Readable =\n | Minipass\n | NodeJS.ReadStream\n | (NodeJS.ReadStream & { fd: number })\n | (EventEmitter & {\n pause(): any\n resume(): any\n pipe(...destArgs: any[]): any\n })\n\n /**\n * Utility type that can be iterated sync or async\n */\n export type DualIterable = Iterable & AsyncIterable\n\n type EventArguments = Record\n\n /**\n * The listing of events that a Minipass class can emit.\n * Extend this when extending the Minipass class, and pass as\n * the third template argument. The key is the name of the event,\n * and the value is the argument list.\n *\n * Any undeclared events will still be allowed, but the handler will get\n * arguments as `unknown[]`.\n */\n export interface Events\n extends EventArguments {\n readable: []\n data: [chunk: RType]\n error: [er: unknown]\n abort: [reason: unknown]\n drain: []\n resume: []\n end: []\n finish: []\n prefinish: []\n close: []\n [DESTROYED]: [er?: unknown]\n [ERROR]: [er: unknown]\n }\n\n /**\n * String or buffer-like data that can be joined and sliced\n */\n export type ContiguousData =\n | Buffer\n | ArrayBufferLike\n | ArrayBufferView\n | string\n export type BufferOrString = Buffer | string\n\n /**\n * Options passed to the Minipass constructor.\n */\n export type SharedOptions = {\n /**\n * Defer all data emission and other events until the end of the\n * current tick, similar to Node core streams\n */\n async?: boolean\n /**\n * A signal which will abort the stream\n */\n signal?: AbortSignal\n /**\n * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n * emit Buffer objects rather than strings.\n *\n * Conflicts with `objectMode`\n */\n encoding?: BufferEncoding | null | 'buffer'\n /**\n * Output data exactly as it was written, supporting non-buffer/string\n * data (such as arbitrary objects, falsey values, etc.)\n *\n * Conflicts with `encoding`\n */\n objectMode?: boolean\n }\n\n /**\n * Options for a string encoded output\n */\n export type EncodingOptions = SharedOptions & {\n encoding: BufferEncoding\n objectMode?: false\n }\n\n /**\n * Options for contiguous data buffer output\n */\n export type BufferOptions = SharedOptions & {\n encoding?: null | 'buffer'\n objectMode?: false\n }\n\n /**\n * Options for objectMode arbitrary output\n */\n export type ObjectModeOptions = SharedOptions & {\n objectMode: true\n encoding?: null\n }\n\n /**\n * Utility type to determine allowed options based on read type\n */\n export type Options =\n | ObjectModeOptions\n | (T extends string\n ? EncodingOptions\n : T extends Buffer\n ? BufferOptions\n : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n RType extends unknown = Buffer,\n WType extends unknown = RType extends Minipass.BufferOrString\n ? Minipass.ContiguousData\n : RType,\n Events extends Minipass.Events = Minipass.Events\n >\n extends EventEmitter\n implements Minipass.DualIterable\n{\n [FLOWING]: boolean = false;\n [PAUSED]: boolean = false;\n [PIPES]: Pipe[] = [];\n [BUFFER]: RType[] = [];\n [OBJECTMODE]: boolean;\n [ENCODING]: BufferEncoding | null;\n [ASYNC]: boolean;\n [DECODER]: SD | null;\n [EOF]: boolean = false;\n [EMITTED_END]: boolean = false;\n [EMITTING_END]: boolean = false;\n [CLOSED]: boolean = false;\n [EMITTED_ERROR]: unknown = null;\n [BUFFERLENGTH]: number = 0;\n [DESTROYED]: boolean = false;\n [SIGNAL]?: AbortSignal;\n [ABORTED]: boolean = false;\n [DATALISTENERS]: number = 0;\n [DISCARDED]: boolean = false\n\n /**\n * true if the stream can be written\n */\n writable: boolean = true\n /**\n * true if the stream can be read\n */\n readable: boolean = true\n\n /**\n * If `RType` is Buffer, then options do not need to be provided.\n * Otherwise, an options object must be provided to specify either\n * {@link Minipass.SharedOptions.objectMode} or\n * {@link Minipass.SharedOptions.encoding}, as appropriate.\n */\n constructor(\n ...args:\n | [Minipass.ObjectModeOptions]\n | (RType extends Buffer\n ? [] | [Minipass.Options]\n : [Minipass.Options])\n ) {\n const options: Minipass.Options = (args[0] ||\n {}) as Minipass.Options\n super()\n if (options.objectMode && typeof options.encoding === 'string') {\n throw new TypeError(\n 'Encoding and objectMode may not be used together'\n )\n }\n if (isObjectModeOptions(options)) {\n this[OBJECTMODE] = true\n this[ENCODING] = null\n } else if (isEncodingOptions(options)) {\n this[ENCODING] = options.encoding\n this[OBJECTMODE] = false\n } else {\n this[OBJECTMODE] = false\n this[ENCODING] = null\n }\n this[ASYNC] = !!options.async\n this[DECODER] = this[ENCODING]\n ? (new StringDecoder(this[ENCODING]) as SD)\n : null\n\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposeBuffer === true) {\n Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n }\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposePipes === true) {\n Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n }\n\n const { signal } = options\n if (signal) {\n this[SIGNAL] = signal\n if (signal.aborted) {\n this[ABORT]()\n } else {\n signal.addEventListener('abort', () => this[ABORT]())\n }\n }\n }\n\n /**\n * The amount of data stored in the buffer waiting to be read.\n *\n * For Buffer strings, this will be the total byte length.\n * For string encoding streams, this will be the string character length,\n * according to JavaScript's `string.length` logic.\n * For objectMode streams, this is a count of the items waiting to be\n * emitted.\n */\n get bufferLength() {\n return this[BUFFERLENGTH]\n }\n\n /**\n * The `BufferEncoding` currently in use, or `null`\n */\n get encoding() {\n return this[ENCODING]\n }\n\n /**\n * @deprecated - This is a read only property\n */\n set encoding(_enc) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * @deprecated - Encoding may only be set at instantiation time\n */\n setEncoding(_enc: Minipass.Encoding) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * True if this is an objectMode stream\n */\n get objectMode() {\n return this[OBJECTMODE]\n }\n\n /**\n * @deprecated - This is a read-only property\n */\n set objectMode(_om) {\n throw new Error('objectMode must be set at instantiation time')\n }\n\n /**\n * true if this is an async stream\n */\n get ['async'](): boolean {\n return this[ASYNC]\n }\n /**\n * Set to true to make this stream async.\n *\n * Once set, it cannot be unset, as this would potentially cause incorrect\n * behavior. Ie, a sync stream can be made async, but an async stream\n * cannot be safely made sync.\n */\n set ['async'](a: boolean) {\n this[ASYNC] = this[ASYNC] || !!a\n }\n\n // drop everything and get out of the flow completely\n [ABORT]() {\n this[ABORTED] = true\n this.emit('abort', this[SIGNAL]?.reason)\n this.destroy(this[SIGNAL]?.reason)\n }\n\n /**\n * True if the stream has been aborted.\n */\n get aborted() {\n return this[ABORTED]\n }\n /**\n * No-op setter. Stream aborted status is set via the AbortSignal provided\n * in the constructor options.\n */\n set aborted(_) {}\n\n /**\n * Write data into the stream\n *\n * If the chunk written is a string, and encoding is not specified, then\n * `utf8` will be assumed. If the stream encoding matches the encoding of\n * a written string, and the state of the string decoder allows it, then\n * the string will be passed through to either the output or the internal\n * buffer without any processing. Otherwise, it will be turned into a\n * Buffer object for processing into the desired encoding.\n *\n * If provided, `cb` function is called immediately before return for\n * sync streams, or on next tick for async streams, because for this\n * base class, a chunk is considered \"processed\" once it is accepted\n * and either emitted or buffered. That is, the callback does not indicate\n * that the chunk has been eventually emitted, though of course child\n * classes can override this function to do whatever processing is required\n * and call `super.write(...)` only once processing is completed.\n */\n write(chunk: WType, cb?: () => void): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding,\n cb?: () => void\n ): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): boolean {\n if (this[ABORTED]) return false\n if (this[EOF]) throw new Error('write after end')\n\n if (this[DESTROYED]) {\n this.emit(\n 'error',\n Object.assign(\n new Error('Cannot call write after a stream was destroyed'),\n { code: 'ERR_STREAM_DESTROYED' }\n )\n )\n return true\n }\n\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n\n if (!encoding) encoding = 'utf8'\n\n const fn = this[ASYNC] ? defer : nodefer\n\n // convert array buffers and typed array views into buffers\n // at some point in the future, we may want to do the opposite!\n // leave strings and buffers as-is\n // anything is only allowed if in object mode, so throw\n if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n if (isArrayBufferView(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(\n chunk.buffer,\n chunk.byteOffset,\n chunk.byteLength\n )\n } else if (isArrayBufferLike(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(chunk)\n } else if (typeof chunk !== 'string') {\n throw new Error(\n 'Non-contiguous data written to non-objectMode stream'\n )\n }\n }\n\n // handle object mode up front, since it's simpler\n // this yields better performance, fewer checks later.\n if (this[OBJECTMODE]) {\n // maybe impossible?\n /* c8 ignore start */\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n /* c8 ignore stop */\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n // at this point the chunk is a buffer or string\n // don't buffer it up or send it to the decoder\n if (!(chunk as Minipass.BufferOrString).length) {\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n if (cb) fn(cb)\n return this[FLOWING]\n }\n\n // fast-path writing strings of same encoding to a stream with\n // an empty buffer, skipping the buffer/decoder dance\n if (\n typeof chunk === 'string' &&\n // unless it is a string already ready for us to use\n !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n ) {\n //@ts-ignore - sinful unsafe type change\n chunk = Buffer.from(chunk, encoding)\n }\n\n if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n //@ts-ignore - sinful unsafe type change\n chunk = this[DECODER].write(chunk)\n }\n\n // Note: flushing CAN potentially switch us into not-flowing mode\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n /**\n * Low-level explicit read method.\n *\n * In objectMode, the argument is ignored, and one item is returned if\n * available.\n *\n * `n` is the number of bytes (or in the case of encoding streams,\n * characters) to consume. If `n` is not provided, then the entire buffer\n * is returned, or `null` is returned if no data is available.\n *\n * If `n` is greater that the amount of data in the internal buffer,\n * then `null` is returned.\n */\n read(n?: number | null): RType | null {\n if (this[DESTROYED]) return null\n this[DISCARDED] = false\n\n if (\n this[BUFFERLENGTH] === 0 ||\n n === 0 ||\n (n && n > this[BUFFERLENGTH])\n ) {\n this[MAYBE_EMIT_END]()\n return null\n }\n\n if (this[OBJECTMODE]) n = null\n\n if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n // not object mode, so if we have an encoding, then RType is string\n // otherwise, must be Buffer\n this[BUFFER] = [\n (this[ENCODING]\n ? this[BUFFER].join('')\n : Buffer.concat(\n this[BUFFER] as Buffer[],\n this[BUFFERLENGTH]\n )) as RType,\n ]\n }\n\n const ret = this[READ](n || null, this[BUFFER][0] as RType)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [READ](n: number | null, chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n else {\n const c = chunk as Minipass.BufferOrString\n if (n === c.length || n === null) this[BUFFERSHIFT]()\n else if (typeof c === 'string') {\n this[BUFFER][0] = c.slice(n) as RType\n chunk = c.slice(0, n) as RType\n this[BUFFERLENGTH] -= n\n } else {\n this[BUFFER][0] = c.subarray(n) as RType\n chunk = c.subarray(0, n) as RType\n this[BUFFERLENGTH] -= n\n }\n }\n\n this.emit('data', chunk)\n\n if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n return chunk\n }\n\n /**\n * End the stream, optionally providing a final write.\n *\n * See {@link Minipass#write} for argument descriptions\n */\n end(cb?: () => void): this\n end(chunk: WType, cb?: () => void): this\n end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n end(\n chunk?: WType | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): this {\n if (typeof chunk === 'function') {\n cb = chunk as () => void\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n if (chunk !== undefined) this.write(chunk, encoding)\n if (cb) this.once('end', cb)\n this[EOF] = true\n this.writable = false\n\n // if we haven't written anything, then go ahead and emit,\n // even if we're not reading.\n // we'll re-emit if a new 'end' listener is added anyway.\n // This makes MP more suitable to write-only use cases.\n if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n return this\n }\n\n // don't let the internal resume be overwritten\n [RESUME]() {\n if (this[DESTROYED]) return\n\n if (!this[DATALISTENERS] && !this[PIPES].length) {\n this[DISCARDED] = true\n }\n this[PAUSED] = false\n this[FLOWING] = true\n this.emit('resume')\n if (this[BUFFER].length) this[FLUSH]()\n else if (this[EOF]) this[MAYBE_EMIT_END]()\n else this.emit('drain')\n }\n\n /**\n * Resume the stream if it is currently in a paused state\n *\n * If called when there are no pipe destinations or `data` event listeners,\n * this will place the stream in a \"discarded\" state, where all data will\n * be thrown away. The discarded state is removed if a pipe destination or\n * data handler is added, if pause() is called, or if any synchronous or\n * asynchronous iteration is started.\n */\n resume() {\n return this[RESUME]()\n }\n\n /**\n * Pause the stream\n */\n pause() {\n this[FLOWING] = false\n this[PAUSED] = true\n this[DISCARDED] = false\n }\n\n /**\n * true if the stream has been forcibly destroyed\n */\n get destroyed() {\n return this[DESTROYED]\n }\n\n /**\n * true if the stream is currently in a flowing state, meaning that\n * any writes will be immediately emitted.\n */\n get flowing() {\n return this[FLOWING]\n }\n\n /**\n * true if the stream is currently in a paused state\n */\n get paused() {\n return this[PAUSED]\n }\n\n [BUFFERPUSH](chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n this[BUFFER].push(chunk)\n }\n\n [BUFFERSHIFT](): RType {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n else\n this[BUFFERLENGTH] -= (\n this[BUFFER][0] as Minipass.BufferOrString\n ).length\n return this[BUFFER].shift() as RType\n }\n\n [FLUSH](noDrain: boolean = false) {\n do {} while (\n this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n this[BUFFER].length\n )\n\n if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n }\n\n [FLUSHCHUNK](chunk: RType) {\n this.emit('data', chunk)\n return this[FLOWING]\n }\n\n /**\n * Pipe all data emitted by this stream into the destination provided.\n *\n * Triggers the flow of data.\n */\n pipe(dest: W, opts?: PipeOptions): W {\n if (this[DESTROYED]) return dest\n this[DISCARDED] = false\n\n const ended = this[EMITTED_END]\n opts = opts || {}\n if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n else opts.end = opts.end !== false\n opts.proxyErrors = !!opts.proxyErrors\n\n // piping an ended stream ends immediately\n if (ended) {\n if (opts.end) dest.end()\n } else {\n // \"as\" here just ignores the WType, which pipes don't care about,\n // since they're only consuming from us, and writing to the dest\n this[PIPES].push(\n !opts.proxyErrors\n ? new Pipe(this as Minipass, dest, opts)\n : new PipeProxyErrors(this as Minipass, dest, opts)\n )\n if (this[ASYNC]) defer(() => this[RESUME]())\n else this[RESUME]()\n }\n\n return dest\n }\n\n /**\n * Fully unhook a piped destination stream.\n *\n * If the destination stream was the only consumer of this stream (ie,\n * there are no other piped destinations or `'data'` event listeners)\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n unpipe(dest: W) {\n const p = this[PIPES].find(p => p.dest === dest)\n if (p) {\n if (this[PIPES].length === 1) {\n if (this[FLOWING] && this[DATALISTENERS] === 0) {\n this[FLOWING] = false\n }\n this[PIPES] = []\n } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n p.unpipe()\n }\n }\n\n /**\n * Alias for {@link Minipass#on}\n */\n addListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n return this.on(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.on`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * - Adding a 'data' event handler will trigger the flow of data\n *\n * - Adding a 'readable' event handler when there is data waiting to be read\n * will cause 'readable' to be emitted immediately.\n *\n * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n * already passed will cause the event to be emitted immediately and all\n * handlers removed.\n *\n * - Adding an 'error' event handler after an error has been emitted will\n * cause the event to be re-emitted immediately with the error previously\n * raised.\n */\n on(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n const ret = super.on(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n if (ev === 'data') {\n this[DISCARDED] = false\n this[DATALISTENERS]++\n if (!this[PIPES].length && !this[FLOWING]) {\n this[RESUME]()\n }\n } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n super.emit('readable')\n } else if (isEndish(ev) && this[EMITTED_END]) {\n super.emit(ev)\n this.removeAllListeners(ev)\n } else if (ev === 'error' && this[EMITTED_ERROR]) {\n const h = handler as (...a: Events['error']) => any\n if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n else h.call(this, this[EMITTED_ERROR])\n }\n return ret\n }\n\n /**\n * Alias for {@link Minipass#off}\n */\n removeListener(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n return this.off(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.off`\n *\n * If a 'data' event handler is removed, and it was the last consumer\n * (ie, there are no pipe destinations or other 'data' event listeners),\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n off(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n const ret = super.off(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n // if we previously had listeners, and now we don't, and we don't\n // have any pipes, then stop the flow, unless it's been explicitly\n // put in a discarded flowing state via stream.resume().\n if (ev === 'data') {\n this[DATALISTENERS] = this.listeners('data').length\n if (\n this[DATALISTENERS] === 0 &&\n !this[DISCARDED] &&\n !this[PIPES].length\n ) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * Mostly identical to `EventEmitter.removeAllListeners`\n *\n * If all 'data' event handlers are removed, and they were the last consumer\n * (ie, there are no pipe destinations), then the flow of data will stop\n * until there is another consumer or {@link Minipass#resume} is explicitly\n * called.\n */\n removeAllListeners(ev?: Event) {\n const ret = super.removeAllListeners(ev as string | symbol | undefined)\n if (ev === 'data' || ev === undefined) {\n this[DATALISTENERS] = 0\n if (!this[DISCARDED] && !this[PIPES].length) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * true if the 'end' event has been emitted\n */\n get emittedEnd() {\n return this[EMITTED_END]\n }\n\n [MAYBE_EMIT_END]() {\n if (\n !this[EMITTING_END] &&\n !this[EMITTED_END] &&\n !this[DESTROYED] &&\n this[BUFFER].length === 0 &&\n this[EOF]\n ) {\n this[EMITTING_END] = true\n this.emit('end')\n this.emit('prefinish')\n this.emit('finish')\n if (this[CLOSED]) this.emit('close')\n this[EMITTING_END] = false\n }\n }\n\n /**\n * Mostly identical to `EventEmitter.emit`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * If the stream has been destroyed, and the event is something other\n * than 'close' or 'error', then `false` is returned and no handlers\n * are called.\n *\n * If the event is 'end', and has already been emitted, then the event\n * is ignored. If the stream is in a paused or non-flowing state, then\n * the event will be deferred until data flow resumes. If the stream is\n * async, then handlers will be called on the next tick rather than\n * immediately.\n *\n * If the event is 'close', and 'end' has not yet been emitted, then\n * the event will be deferred until after 'end' is emitted.\n *\n * If the event is 'error', and an AbortSignal was provided for the stream,\n * and there are no listeners, then the event is ignored, matching the\n * behavior of node core streams in the presense of an AbortSignal.\n *\n * If the event is 'finish' or 'prefinish', then all listeners will be\n * removed after emitting the event, to prevent double-firing.\n */\n emit(\n ev: Event,\n ...args: Events[Event]\n ): boolean {\n const data = args[0]\n // error and close are only events allowed after calling destroy()\n if (\n ev !== 'error' &&\n ev !== 'close' &&\n ev !== DESTROYED &&\n this[DESTROYED]\n ) {\n return false\n } else if (ev === 'data') {\n return !this[OBJECTMODE] && !data\n ? false\n : this[ASYNC]\n ? (defer(() => this[EMITDATA](data as RType)), true)\n : this[EMITDATA](data as RType)\n } else if (ev === 'end') {\n return this[EMITEND]()\n } else if (ev === 'close') {\n this[CLOSED] = true\n // don't emit close before 'end' and 'finish'\n if (!this[EMITTED_END] && !this[DESTROYED]) return false\n const ret = super.emit('close')\n this.removeAllListeners('close')\n return ret\n } else if (ev === 'error') {\n this[EMITTED_ERROR] = data\n super.emit(ERROR, data)\n const ret =\n !this[SIGNAL] || this.listeners('error').length\n ? super.emit('error', data)\n : false\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'resume') {\n const ret = super.emit('resume')\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'finish' || ev === 'prefinish') {\n const ret = super.emit(ev)\n this.removeAllListeners(ev)\n return ret\n }\n\n // Some other unknown event\n const ret = super.emit(ev as string, ...args)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITDATA](data: RType) {\n for (const p of this[PIPES]) {\n if (p.dest.write(data as RType) === false) this.pause()\n }\n const ret = this[DISCARDED] ? false : super.emit('data', data)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITEND]() {\n if (this[EMITTED_END]) return false\n\n this[EMITTED_END] = true\n this.readable = false\n return this[ASYNC]\n ? (defer(() => this[EMITEND2]()), true)\n : this[EMITEND2]()\n }\n\n [EMITEND2]() {\n if (this[DECODER]) {\n const data = this[DECODER].end()\n if (data) {\n for (const p of this[PIPES]) {\n p.dest.write(data as RType)\n }\n if (!this[DISCARDED]) super.emit('data', data)\n }\n }\n\n for (const p of this[PIPES]) {\n p.end()\n }\n const ret = super.emit('end')\n this.removeAllListeners('end')\n return ret\n }\n\n /**\n * Return a Promise that resolves to an array of all emitted data once\n * the stream ends.\n */\n async collect(): Promise {\n const buf: RType[] & { dataLength: number } = Object.assign([], {\n dataLength: 0,\n })\n if (!this[OBJECTMODE]) buf.dataLength = 0\n // set the promise first, in case an error is raised\n // by triggering the flow here.\n const p = this.promise()\n this.on('data', c => {\n buf.push(c)\n if (!this[OBJECTMODE])\n buf.dataLength += (c as Minipass.BufferOrString).length\n })\n await p\n return buf\n }\n\n /**\n * Return a Promise that resolves to the concatenation of all emitted data\n * once the stream ends.\n *\n * Not allowed on objectMode streams.\n */\n async concat(): Promise {\n if (this[OBJECTMODE]) {\n throw new Error('cannot concat in objectMode')\n }\n const buf = await this.collect()\n return (\n this[ENCODING]\n ? buf.join('')\n : Buffer.concat(buf as Buffer[], buf.dataLength)\n ) as RType\n }\n\n /**\n * Return a void Promise that resolves once the stream ends.\n */\n async promise(): Promise {\n return new Promise((resolve, reject) => {\n this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n this.on('error', er => reject(er))\n this.on('end', () => resolve())\n })\n }\n\n /**\n * Asynchronous `for await of` iteration.\n *\n * This will continue emitting all chunks until the stream terminates.\n */\n [Symbol.asyncIterator](): AsyncGenerator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = async (): Promise> => {\n this.pause()\n stopped = true\n return { value: undefined, done: true }\n }\n const next = (): Promise> => {\n if (stopped) return stop()\n const res = this.read()\n if (res !== null) return Promise.resolve({ done: false, value: res })\n\n if (this[EOF]) return stop()\n\n let resolve!: (res: IteratorResult) => void\n let reject!: (er: unknown) => void\n const onerr = (er: unknown) => {\n this.off('data', ondata)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n stop()\n reject(er)\n }\n const ondata = (value: RType) => {\n this.off('error', onerr)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n this.pause()\n resolve({ value, done: !!this[EOF] })\n }\n const onend = () => {\n this.off('error', onerr)\n this.off('data', ondata)\n this.off(DESTROYED, ondestroy)\n stop()\n resolve({ done: true, value: undefined })\n }\n const ondestroy = () => onerr(new Error('stream destroyed'))\n return new Promise>((res, rej) => {\n reject = rej\n resolve = res\n this.once(DESTROYED, ondestroy)\n this.once('error', onerr)\n this.once('end', onend)\n this.once('data', ondata)\n })\n }\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.asyncIterator]() {\n return this\n },\n [Symbol.asyncDispose]: async () => {},\n }\n }\n\n /**\n * Synchronous `for of` iteration.\n *\n * The iteration will terminate when the internal buffer runs out, even\n * if the stream has not yet terminated.\n */\n [Symbol.iterator](): Generator {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = (): IteratorReturnResult => {\n this.pause()\n this.off(ERROR, stop)\n this.off(DESTROYED, stop)\n this.off('end', stop)\n stopped = true\n return { done: true, value: undefined }\n }\n\n const next = (): IteratorResult => {\n if (stopped) return stop()\n const value = this.read()\n return value === null ? stop() : { done: false, value }\n }\n\n this.once('end', stop)\n this.once(ERROR, stop)\n this.once(DESTROYED, stop)\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.iterator]() {\n return this\n },\n [Symbol.dispose]: () => {},\n }\n }\n\n /**\n * Destroy a stream, preventing it from being used for any further purpose.\n *\n * If the stream has a `close()` method, then it will be called on\n * destruction.\n *\n * After destruction, any attempt to write data, read data, or emit most\n * events will be ignored.\n *\n * If an error argument is provided, then it will be emitted in an\n * 'error' event.\n */\n destroy(er?: unknown) {\n if (this[DESTROYED]) {\n if (er) this.emit('error', er)\n else this.emit(DESTROYED)\n return this\n }\n\n this[DESTROYED] = true\n this[DISCARDED] = true\n\n // throw away all buffered data, it's never coming out\n this[BUFFER].length = 0\n this[BUFFERLENGTH] = 0\n\n const wc = this as Minipass & {\n close?: () => void\n }\n if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n if (er) this.emit('error', er)\n // if no error to emit, still reject pending promises\n else this.emit(DESTROYED)\n\n return this\n }\n\n /**\n * Alias for {@link isStream}\n *\n * Former export location, maintained for backwards compatibility.\n *\n * @deprecated\n */\n static get isStream() {\n return isStream\n }\n}\n"]} \ No newline at end of file diff --git a/node_modules/minipass/dist/esm/package.json b/node_modules/minipass/dist/esm/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/node_modules/minipass/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/minipass/package.json b/node_modules/minipass/package.json new file mode 100644 index 0000000..800f215 --- /dev/null +++ b/node_modules/minipass/package.json @@ -0,0 +1,77 @@ +{ + "name": "minipass", + "version": "7.1.3", + "description": "minimal implementation of a PassThrough stream", + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "module": "./dist/esm/index.js", + "type": "module", + "tshy": { + "selfLink": false, + "compiler": "tsgo", + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "prepare": "tshy", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "tap", + "snap": "tap", + "format": "prettier --write . --loglevel warn", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "prettier": { + "semi": false, + "printWidth": 75, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "devDependencies": { + "@types/end-of-stream": "^1.4.2", + "@types/node": "^25.2.3", + "end-of-stream": "^1.4.0", + "node-abort-controller": "^3.1.1", + "prettier": "^3.8.1", + "tap": "^21.6.1", + "through2": "^2.0.3", + "tshy": "^3.3.2", + "typedoc": "^0.28.17" + }, + "repository": "https://github.com/isaacs/minipass", + "keywords": [ + "passthrough", + "stream" + ], + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } +} diff --git a/node_modules/moo/LICENSE b/node_modules/moo/LICENSE new file mode 100644 index 0000000..3810d82 --- /dev/null +++ b/node_modules/moo/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2017, Tim Radvan (tjvr) +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. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE 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 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/moo/README.md b/node_modules/moo/README.md new file mode 100644 index 0000000..52b985e --- /dev/null +++ b/node_modules/moo/README.md @@ -0,0 +1,383 @@ +![](cow.png) + +Moo! +==== + +Moo is a highly-optimised tokenizer/lexer generator. Use it to tokenize your strings, before parsing 'em with a parser like [nearley](https://github.com/hardmath123/nearley) or whatever else you're into. + +* [Fast](#is-it-fast) +* [Convenient](#usage) +* uses [Regular Expressions](#on-regular-expressions) +* tracks [Line Numbers](#line-numbers) +* handles [Keywords](#keywords) +* supports [States](#states) +* custom [Errors](#errors) +* is even [Iterable](#iteration) +* has no dependencies +* 4KB minified + gzipped +* Moo! + +Is it fast? +----------- + +Yup! Flying-cows-and-singed-steak fast. + +Moo is the fastest JS tokenizer around. It's **~2–10x** faster than most other tokenizers; it's a **couple orders of magnitude** faster than some of the slower ones. + +Define your tokens **using regular expressions**. Moo will compile 'em down to a **single RegExp for performance**. It uses the new ES6 **sticky flag** where possible to make things faster; otherwise it falls back to an almost-as-efficient workaround. (For more than you ever wanted to know about this, read [adventures in the land of substrings and RegExps](http://mrale.ph/blog/2016/11/23/making-less-dart-faster.html).) + +You _might_ be able to go faster still by writing your lexer by hand rather than using RegExps, but that's icky. + +Oh, and it [avoids parsing RegExps by itself](https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983#.2l8qu3l76). Because that would be horrible. + + +Usage +----- + +First, you need to do the needful: `$ npm install moo`, or whatever will ship this code to your computer. Alternatively, grab the `moo.js` file by itself and slap it into your web page via a ` + + + + +
    {{ "%+010d"|sprintf:-123 }}
    +
    {{ "%+010d"|vsprintf:[-123] }}
    +
    {{ "%+010d"|fmt:-123 }}
    +
    {{ "%+010d"|vfmt:[-123] }}
    +
    {{ "I've got %2$d apples and %1$d oranges."|fmt:4:2 }}
    +
    {{ "I've got %(apples)d apples and %(oranges)d oranges."|fmt:{apples: 2, oranges: 4} }}
    + + + + diff --git a/node_modules/sprintf-js/dist/angular-sprintf.min.js b/node_modules/sprintf-js/dist/angular-sprintf.min.js new file mode 100644 index 0000000..dbaf744 --- /dev/null +++ b/node_modules/sprintf-js/dist/angular-sprintf.min.js @@ -0,0 +1,4 @@ +/*! sprintf-js | Alexandru Marasteanu (http://alexei.ro/) | BSD-3-Clause */ + +angular.module("sprintf",[]).filter("sprintf",function(){return function(){return sprintf.apply(null,arguments)}}).filter("fmt",["$filter",function(a){return a("sprintf")}]).filter("vsprintf",function(){return function(a,b){return vsprintf(a,b)}}).filter("vfmt",["$filter",function(a){return a("vsprintf")}]); +//# sourceMappingURL=angular-sprintf.min.map \ No newline at end of file diff --git a/node_modules/sprintf-js/dist/angular-sprintf.min.js.map b/node_modules/sprintf-js/dist/angular-sprintf.min.js.map new file mode 100644 index 0000000..055964c --- /dev/null +++ b/node_modules/sprintf-js/dist/angular-sprintf.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"angular-sprintf.min.js","sources":["../src/angular-sprintf.js"],"names":["angular","module","filter","sprintf","apply","arguments","$filter","format","argv","vsprintf"],"mappings":";;AAAAA,QACIC,OAAO,cACPC,OAAO,UAAW,WACd,MAAO,YACH,MAAOC,SAAQC,MAAM,KAAMC,cAGnCH,OAAO,OAAQ,UAAW,SAASI,GAC/B,MAAOA,GAAQ,cAEnBJ,OAAO,WAAY,WACf,MAAO,UAASK,EAAQC,GACpB,MAAOC,UAASF,EAAQC,MAGhCN,OAAO,QAAS,UAAW,SAASI,GAChC,MAAOA,GAAQ"} \ No newline at end of file diff --git a/node_modules/sprintf-js/dist/angular-sprintf.min.map b/node_modules/sprintf-js/dist/angular-sprintf.min.map new file mode 100644 index 0000000..055964c --- /dev/null +++ b/node_modules/sprintf-js/dist/angular-sprintf.min.map @@ -0,0 +1 @@ +{"version":3,"file":"angular-sprintf.min.js","sources":["../src/angular-sprintf.js"],"names":["angular","module","filter","sprintf","apply","arguments","$filter","format","argv","vsprintf"],"mappings":";;AAAAA,QACIC,OAAO,cACPC,OAAO,UAAW,WACd,MAAO,YACH,MAAOC,SAAQC,MAAM,KAAMC,cAGnCH,OAAO,OAAQ,UAAW,SAASI,GAC/B,MAAOA,GAAQ,cAEnBJ,OAAO,WAAY,WACf,MAAO,UAASK,EAAQC,GACpB,MAAOC,UAASF,EAAQC,MAGhCN,OAAO,QAAS,UAAW,SAASI,GAChC,MAAOA,GAAQ"} \ No newline at end of file diff --git a/node_modules/sprintf-js/dist/sprintf.min.js b/node_modules/sprintf-js/dist/sprintf.min.js new file mode 100644 index 0000000..dc61e51 --- /dev/null +++ b/node_modules/sprintf-js/dist/sprintf.min.js @@ -0,0 +1,4 @@ +/*! sprintf-js | Alexandru Marasteanu (http://alexei.ro/) | BSD-3-Clause */ + +!function(a){function b(){var a=arguments[0],c=b.cache;return c[a]&&c.hasOwnProperty(a)||(c[a]=b.parse(a)),b.format.call(null,c[a],arguments)}function c(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function d(a,b){return Array(b+1).join(a)}var e={not_string:/[^s]/,number:/[diefg]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[\+\-]/};b.format=function(a,f){var g,h,i,j,k,l,m,n=1,o=a.length,p="",q=[],r=!0,s="";for(h=0;o>h;h++)if(p=c(a[h]),"string"===p)q[q.length]=a[h];else if("array"===p){if(j=a[h],j[2])for(g=f[n],i=0;i=0),j[8]){case"b":g=g.toString(2);break;case"c":g=String.fromCharCode(g);break;case"d":case"i":g=parseInt(g,10);break;case"j":g=JSON.stringify(g,null,j[6]?parseInt(j[6]):0);break;case"e":g=j[7]?g.toExponential(j[7]):g.toExponential();break;case"f":g=j[7]?parseFloat(g).toFixed(j[7]):parseFloat(g);break;case"g":g=j[7]?parseFloat(g).toPrecision(j[7]):parseFloat(g);break;case"o":g=g.toString(8);break;case"s":g=(g=String(g))&&j[7]?g.substring(0,j[7]):g;break;case"u":g>>>=0;break;case"x":g=g.toString(16);break;case"X":g=g.toString(16).toUpperCase()}e.json.test(j[8])?q[q.length]=g:(!e.number.test(j[8])||r&&!j[3]?s="":(s=r?"+":"-",g=g.toString().replace(e.sign,"")),l=j[4]?"0"===j[4]?"0":j[4].charAt(1):" ",m=j[6]-(s+g).length,k=j[6]&&m>0?d(l,m):"",q[q.length]=j[5]?s+g+k:"0"===l?s+k+g:k+s+g)}return q.join("")},b.cache={},b.parse=function(a){for(var b=a,c=[],d=[],f=0;b;){if(null!==(c=e.text.exec(b)))d[d.length]=c[0];else if(null!==(c=e.modulo.exec(b)))d[d.length]="%";else{if(null===(c=e.placeholder.exec(b)))throw new SyntaxError("[sprintf] unexpected placeholder");if(c[2]){f|=1;var g=[],h=c[2],i=[];if(null===(i=e.key.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(g[g.length]=i[1];""!==(h=h.substring(i[0].length));)if(null!==(i=e.key_access.exec(h)))g[g.length]=i[1];else{if(null===(i=e.index_access.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");g[g.length]=i[1]}c[2]=g}else f|=2;if(3===f)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");d[d.length]=c}b=b.substring(c[0].length)}return d};var f=function(a,c,d){return d=(c||[]).slice(0),d.splice(0,0,a),b.apply(null,d)};"undefined"!=typeof exports?(exports.sprintf=b,exports.vsprintf=f):(a.sprintf=b,a.vsprintf=f,"function"==typeof define&&define.amd&&define(function(){return{sprintf:b,vsprintf:f}}))}("undefined"==typeof window?this:window); +//# sourceMappingURL=sprintf.min.map \ No newline at end of file diff --git a/node_modules/sprintf-js/dist/sprintf.min.js.map b/node_modules/sprintf-js/dist/sprintf.min.js.map new file mode 100644 index 0000000..369dbaf --- /dev/null +++ b/node_modules/sprintf-js/dist/sprintf.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/sprintf-js/dist/sprintf.min.map b/node_modules/sprintf-js/dist/sprintf.min.map new file mode 100644 index 0000000..ee011aa --- /dev/null +++ b/node_modules/sprintf-js/dist/sprintf.min.map @@ -0,0 +1 @@ +{"version":3,"file":"sprintf.min.js","sources":["../src/sprintf.js"],"names":["window","sprintf","key","arguments","cache","hasOwnProperty","parse","format","call","get_type","variable","Object","prototype","toString","slice","toLowerCase","str_repeat","input","multiplier","Array","join","re","not_string","number","json","not_json","text","modulo","placeholder","key_access","index_access","sign","parse_tree","argv","arg","i","k","match","pad","pad_character","pad_length","cursor","tree_length","length","node_type","output","is_positive","Error","test","isNaN","TypeError","String","fromCharCode","parseInt","JSON","stringify","toExponential","parseFloat","toFixed","toPrecision","substring","toUpperCase","replace","charAt","fmt","_fmt","arg_names","exec","SyntaxError","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","exports","define","amd","this"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/sprintf-js/gruntfile.js b/node_modules/sprintf-js/gruntfile.js new file mode 100644 index 0000000..246e1c3 --- /dev/null +++ b/node_modules/sprintf-js/gruntfile.js @@ -0,0 +1,36 @@ +module.exports = function(grunt) { + grunt.initConfig({ + pkg: grunt.file.readJSON("package.json"), + + uglify: { + options: { + banner: "/*! <%= pkg.name %> | <%= pkg.author %> | <%= pkg.license %> */\n", + sourceMap: true + }, + build: { + files: [ + { + src: "src/sprintf.js", + dest: "dist/sprintf.min.js" + }, + { + src: "src/angular-sprintf.js", + dest: "dist/angular-sprintf.min.js" + } + ] + } + }, + + watch: { + js: { + files: "src/*.js", + tasks: ["uglify"] + } + } + }) + + grunt.loadNpmTasks("grunt-contrib-uglify") + grunt.loadNpmTasks("grunt-contrib-watch") + + grunt.registerTask("default", ["uglify", "watch"]) +} diff --git a/node_modules/sprintf-js/package.json b/node_modules/sprintf-js/package.json new file mode 100644 index 0000000..75f7eca --- /dev/null +++ b/node_modules/sprintf-js/package.json @@ -0,0 +1,22 @@ +{ + "name": "sprintf-js", + "version": "1.0.3", + "description": "JavaScript sprintf implementation", + "author": "Alexandru Marasteanu (http://alexei.ro/)", + "main": "src/sprintf.js", + "scripts": { + "test": "mocha test/test.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/alexei/sprintf.js.git" + }, + "license": "BSD-3-Clause", + "readmeFilename": "README.md", + "devDependencies": { + "mocha": "*", + "grunt": "*", + "grunt-contrib-watch": "*", + "grunt-contrib-uglify": "*" + } +} diff --git a/node_modules/sprintf-js/src/angular-sprintf.js b/node_modules/sprintf-js/src/angular-sprintf.js new file mode 100644 index 0000000..9c69123 --- /dev/null +++ b/node_modules/sprintf-js/src/angular-sprintf.js @@ -0,0 +1,18 @@ +angular. + module("sprintf", []). + filter("sprintf", function() { + return function() { + return sprintf.apply(null, arguments) + } + }). + filter("fmt", ["$filter", function($filter) { + return $filter("sprintf") + }]). + filter("vsprintf", function() { + return function(format, argv) { + return vsprintf(format, argv) + } + }). + filter("vfmt", ["$filter", function($filter) { + return $filter("vsprintf") + }]) diff --git a/node_modules/sprintf-js/src/sprintf.js b/node_modules/sprintf-js/src/sprintf.js new file mode 100644 index 0000000..c0fc7c0 --- /dev/null +++ b/node_modules/sprintf-js/src/sprintf.js @@ -0,0 +1,208 @@ +(function(window) { + var re = { + not_string: /[^s]/, + number: /[diefg]/, + json: /[j]/, + not_json: /[^j]/, + text: /^[^\x25]+/, + modulo: /^\x25{2}/, + placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/, + key: /^([a-z_][a-z_\d]*)/i, + key_access: /^\.([a-z_][a-z_\d]*)/i, + index_access: /^\[(\d+)\]/, + sign: /^[\+\-]/ + } + + function sprintf() { + var key = arguments[0], cache = sprintf.cache + if (!(cache[key] && cache.hasOwnProperty(key))) { + cache[key] = sprintf.parse(key) + } + return sprintf.format.call(null, cache[key], arguments) + } + + sprintf.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = "" + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]) + if (node_type === "string") { + output[output.length] = parse_tree[i] + } + else if (node_type === "array") { + match = parse_tree[i] // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor] + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k])) + } + arg = arg[match[2][k]] + } + } + else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]] + } + else { // positional argument (implicit) + arg = argv[cursor++] + } + + if (get_type(arg) == "function") { + arg = arg() + } + + if (re.not_string.test(match[8]) && re.not_json.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) { + throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg))) + } + + if (re.number.test(match[8])) { + is_positive = arg >= 0 + } + + switch (match[8]) { + case "b": + arg = arg.toString(2) + break + case "c": + arg = String.fromCharCode(arg) + break + case "d": + case "i": + arg = parseInt(arg, 10) + break + case "j": + arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0) + break + case "e": + arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential() + break + case "f": + arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg) + break + case "g": + arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg) + break + case "o": + arg = arg.toString(8) + break + case "s": + arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg) + break + case "u": + arg = arg >>> 0 + break + case "x": + arg = arg.toString(16) + break + case "X": + arg = arg.toString(16).toUpperCase() + break + } + if (re.json.test(match[8])) { + output[output.length] = arg + } + else { + if (re.number.test(match[8]) && (!is_positive || match[3])) { + sign = is_positive ? "+" : "-" + arg = arg.toString().replace(re.sign, "") + } + else { + sign = "" + } + pad_character = match[4] ? match[4] === "0" ? "0" : match[4].charAt(1) : " " + pad_length = match[6] - (sign + arg).length + pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : "") : "" + output[output.length] = match[5] ? sign + arg + pad : (pad_character === "0" ? sign + pad + arg : pad + sign + arg) + } + } + } + return output.join("") + } + + sprintf.cache = {} + + sprintf.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0 + while (_fmt) { + if ((match = re.text.exec(_fmt)) !== null) { + parse_tree[parse_tree.length] = match[0] + } + else if ((match = re.modulo.exec(_fmt)) !== null) { + parse_tree[parse_tree.length] = "%" + } + else if ((match = re.placeholder.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1 + var field_list = [], replacement_field = match[2], field_match = [] + if ((field_match = re.key.exec(replacement_field)) !== null) { + field_list[field_list.length] = field_match[1] + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") { + if ((field_match = re.key_access.exec(replacement_field)) !== null) { + field_list[field_list.length] = field_match[1] + } + else if ((field_match = re.index_access.exec(replacement_field)) !== null) { + field_list[field_list.length] = field_match[1] + } + else { + throw new SyntaxError("[sprintf] failed to parse named argument key") + } + } + } + else { + throw new SyntaxError("[sprintf] failed to parse named argument key") + } + match[2] = field_list + } + else { + arg_names |= 2 + } + if (arg_names === 3) { + throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported") + } + parse_tree[parse_tree.length] = match + } + else { + throw new SyntaxError("[sprintf] unexpected placeholder") + } + _fmt = _fmt.substring(match[0].length) + } + return parse_tree + } + + var vsprintf = function(fmt, argv, _argv) { + _argv = (argv || []).slice(0) + _argv.splice(0, 0, fmt) + return sprintf.apply(null, _argv) + } + + /** + * helpers + */ + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase() + } + + function str_repeat(input, multiplier) { + return Array(multiplier + 1).join(input) + } + + /** + * export to either browser or node.js + */ + if (typeof exports !== "undefined") { + exports.sprintf = sprintf + exports.vsprintf = vsprintf + } + else { + window.sprintf = sprintf + window.vsprintf = vsprintf + + if (typeof define === "function" && define.amd) { + define(function() { + return { + sprintf: sprintf, + vsprintf: vsprintf + } + }) + } + } +})(typeof window === "undefined" ? this : window); diff --git a/node_modules/sprintf-js/test/test.js b/node_modules/sprintf-js/test/test.js new file mode 100644 index 0000000..6f57b25 --- /dev/null +++ b/node_modules/sprintf-js/test/test.js @@ -0,0 +1,82 @@ +var assert = require("assert"), + sprintfjs = require("../src/sprintf.js"), + sprintf = sprintfjs.sprintf, + vsprintf = sprintfjs.vsprintf + +describe("sprintfjs", function() { + var pi = 3.141592653589793 + + it("should return formated strings for simple placeholders", function() { + assert.equal("%", sprintf("%%")) + assert.equal("10", sprintf("%b", 2)) + assert.equal("A", sprintf("%c", 65)) + assert.equal("2", sprintf("%d", 2)) + assert.equal("2", sprintf("%i", 2)) + assert.equal("2", sprintf("%d", "2")) + assert.equal("2", sprintf("%i", "2")) + assert.equal('{"foo":"bar"}', sprintf("%j", {foo: "bar"})) + assert.equal('["foo","bar"]', sprintf("%j", ["foo", "bar"])) + assert.equal("2e+0", sprintf("%e", 2)) + assert.equal("2", sprintf("%u", 2)) + assert.equal("4294967294", sprintf("%u", -2)) + assert.equal("2.2", sprintf("%f", 2.2)) + assert.equal("3.141592653589793", sprintf("%g", pi)) + assert.equal("10", sprintf("%o", 8)) + assert.equal("%s", sprintf("%s", "%s")) + assert.equal("ff", sprintf("%x", 255)) + assert.equal("FF", sprintf("%X", 255)) + assert.equal("Polly wants a cracker", sprintf("%2$s %3$s a %1$s", "cracker", "Polly", "wants")) + assert.equal("Hello world!", sprintf("Hello %(who)s!", {"who": "world"})) + }) + + it("should return formated strings for complex placeholders", function() { + // sign + assert.equal("2", sprintf("%d", 2)) + assert.equal("-2", sprintf("%d", -2)) + assert.equal("+2", sprintf("%+d", 2)) + assert.equal("-2", sprintf("%+d", -2)) + assert.equal("2", sprintf("%i", 2)) + assert.equal("-2", sprintf("%i", -2)) + assert.equal("+2", sprintf("%+i", 2)) + assert.equal("-2", sprintf("%+i", -2)) + assert.equal("2.2", sprintf("%f", 2.2)) + assert.equal("-2.2", sprintf("%f", -2.2)) + assert.equal("+2.2", sprintf("%+f", 2.2)) + assert.equal("-2.2", sprintf("%+f", -2.2)) + assert.equal("-2.3", sprintf("%+.1f", -2.34)) + assert.equal("-0.0", sprintf("%+.1f", -0.01)) + assert.equal("3.14159", sprintf("%.6g", pi)) + assert.equal("3.14", sprintf("%.3g", pi)) + assert.equal("3", sprintf("%.1g", pi)) + assert.equal("-000000123", sprintf("%+010d", -123)) + assert.equal("______-123", sprintf("%+'_10d", -123)) + assert.equal("-234.34 123.2", sprintf("%f %f", -234.34, 123.2)) + + // padding + assert.equal("-0002", sprintf("%05d", -2)) + assert.equal("-0002", sprintf("%05i", -2)) + assert.equal(" <", sprintf("%5s", "<")) + assert.equal("0000<", sprintf("%05s", "<")) + assert.equal("____<", sprintf("%'_5s", "<")) + assert.equal("> ", sprintf("%-5s", ">")) + assert.equal(">0000", sprintf("%0-5s", ">")) + assert.equal(">____", sprintf("%'_-5s", ">")) + assert.equal("xxxxxx", sprintf("%5s", "xxxxxx")) + assert.equal("1234", sprintf("%02u", 1234)) + assert.equal(" -10.235", sprintf("%8.3f", -10.23456)) + assert.equal("-12.34 xxx", sprintf("%f %s", -12.34, "xxx")) + assert.equal('{\n "foo": "bar"\n}', sprintf("%2j", {foo: "bar"})) + assert.equal('[\n "foo",\n "bar"\n]', sprintf("%2j", ["foo", "bar"])) + + // precision + assert.equal("2.3", sprintf("%.1f", 2.345)) + assert.equal("xxxxx", sprintf("%5.5s", "xxxxxx")) + assert.equal(" x", sprintf("%5.1s", "xxxxxx")) + + }) + + it("should return formated strings for callbacks", function() { + assert.equal("foobar", sprintf("%s", function() { return "foobar" })) + assert.equal(Date.now(), sprintf("%s", Date.now)) // should pass... + }) +}) diff --git a/node_modules/ssri/LICENSE.md b/node_modules/ssri/LICENSE.md new file mode 100644 index 0000000..e335388 --- /dev/null +++ b/node_modules/ssri/LICENSE.md @@ -0,0 +1,16 @@ +ISC License + +Copyright 2021 (c) npm, Inc. + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted, provided that the +above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS +ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, 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/ssri/README.md b/node_modules/ssri/README.md new file mode 100644 index 0000000..6f46aa5 --- /dev/null +++ b/node_modules/ssri/README.md @@ -0,0 +1,528 @@ +# ssri [![npm version](https://img.shields.io/npm/v/ssri.svg)](https://npm.im/ssri) [![license](https://img.shields.io/npm/l/ssri.svg)](https://npm.im/ssri) [![Travis](https://img.shields.io/travis/npm/ssri.svg)](https://travis-ci.org/npm/ssri) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/npm/ssri?svg=true)](https://ci.appveyor.com/project/npm/ssri) [![Coverage Status](https://coveralls.io/repos/github/npm/ssri/badge.svg?branch=latest)](https://coveralls.io/github/npm/ssri?branch=latest) + +[`ssri`](https://github.com/npm/ssri), short for Standard Subresource +Integrity, is a Node.js utility for parsing, manipulating, serializing, +generating, and verifying [Subresource +Integrity](https://w3c.github.io/webappsec/specs/subresourceintegrity/) hashes. + +## Install + +`$ npm install --save ssri` + +## Table of Contents + +* [Example](#example) +* [Features](#features) +* [Contributing](#contributing) +* [API](#api) + * Parsing & Serializing + * [`parse`](#parse) + * [`stringify`](#stringify) + * [`Integrity#concat`](#integrity-concat) + * [`Integrity#merge`](#integrity-merge) + * [`Integrity#toString`](#integrity-to-string) + * [`Integrity#toJSON`](#integrity-to-json) + * [`Integrity#match`](#integrity-match) + * [`Integrity#pickAlgorithm`](#integrity-pick-algorithm) + * [`Integrity#hexDigest`](#integrity-hex-digest) + * Integrity Generation + * [`fromHex`](#from-hex) + * [`fromData`](#from-data) + * [`fromStream`](#from-stream) + * [`create`](#create) + * Integrity Verification + * [`checkData`](#check-data) + * [`checkStream`](#check-stream) + * [`integrityStream`](#integrity-stream) + +### Example + +```javascript +const ssri = require('ssri') + +const integrity = 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo' + +// Parsing and serializing +const parsed = ssri.parse(integrity) +ssri.stringify(parsed) // === integrity (works on non-Integrity objects) +parsed.toString() // === integrity + +// Async stream functions +ssri.checkStream(fs.createReadStream('./my-file'), integrity).then(...) +ssri.fromStream(fs.createReadStream('./my-file')).then(sri => { + sri.toString() === integrity +}) +fs.createReadStream('./my-file').pipe(ssri.createCheckerStream(sri)) + +// Sync data functions +ssri.fromData(fs.readFileSync('./my-file')) // === parsed +ssri.checkData(fs.readFileSync('./my-file'), integrity) // => 'sha512' +``` + +### Features + +* Parses and stringifies SRI strings. +* Generates SRI strings from raw data or Streams. +* Strict standard compliance. +* `?foo` metadata option support. +* Multiple entries for the same algorithm. +* Object-based integrity hash manipulation. +* Small footprint: no dependencies, concise implementation. +* Full test coverage. +* Customizable algorithm picker. + +### Contributing + +The ssri team enthusiastically welcomes contributions and project participation! +There's a bunch of things you can do if you want to contribute! The [Contributor +Guide](CONTRIBUTING.md) has all the information you need for everything from +reporting bugs to contributing entire new features. Please don't hesitate to +jump in if you'd like to, or even ask us questions if something isn't clear. + +### API + +#### `> ssri.parse(sri, [opts]) -> Integrity` + +Parses `sri` into an `Integrity` data structure. `sri` can be an integrity +string, an `Hash`-like with `digest` and `algorithm` fields and an optional +`options` field, or an `Integrity`-like object. The resulting object will be an +`Integrity` instance that has this shape: + +```javascript +{ + 'sha1': [{algorithm: 'sha1', digest: 'deadbeef', options: []}], + 'sha512': [ + {algorithm: 'sha512', digest: 'c0ffee', options: []}, + {algorithm: 'sha512', digest: 'bad1dea', options: ['foo']} + ], +} +``` + +If `opts.single` is truthy, a single `Hash` object will be returned. That is, a +single object that looks like `{algorithm, digest, options}`, as opposed to a +larger object with multiple of these. + +If `opts.strict` is truthy, the resulting object will be filtered such that +it strictly follows the Subresource Integrity spec, throwing away any entries +with any invalid components. This also means a restricted set of algorithms +will be used -- the spec limits them to `sha256`, `sha384`, and `sha512`. + +Strict mode is recommended if the integrity strings are intended for use in +browsers, or in other situations where strict adherence to the spec is needed. + +##### Example + +```javascript +ssri.parse('sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo') // -> Integrity object +``` + +#### `> ssri.stringify(sri, [opts]) -> String` + +This function is identical to [`Integrity#toString()`](#integrity-to-string), +except it can be used on _any_ object that [`parse`](#parse) can handle -- that +is, a string, an `Hash`-like, or an `Integrity`-like. + +The `opts.sep` option defines the string to use when joining multiple entries +together. To be spec-compliant, this _must_ be whitespace. The default is a +single space (`' '`). + +If `opts.strict` is true, the integrity string will be created using strict +parsing rules. See [`ssri.parse`](#parse). + +##### Example + +```javascript +// Useful for cleaning up input SRI strings: +ssri.stringify('\n\rsha512-foo\n\t\tsha384-bar') +// -> 'sha512-foo sha384-bar' + +// Hash-like: only a single entry. +ssri.stringify({ + algorithm: 'sha512', + digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==', + options: ['foo'] +}) +// -> +// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo' + +// Integrity-like: full multi-entry syntax. Similar to output of `ssri.parse` +ssri.stringify({ + 'sha512': [ + { + algorithm: 'sha512', + digest:'9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==', + options: ['foo'] + } + ] +}) +// -> +// 'sha512-9KhgCRIx/AmzC8xqYJTZRrnO8OW2Pxyl2DIMZSBOr0oDvtEFyht3xpp71j/r/pAe1DM+JI/A+line3jUBgzQ7A==?foo' +``` + +#### `> Integrity#concat(otherIntegrity, [opts]) -> Integrity` + +Concatenates an `Integrity` object with another IntegrityLike, or an integrity +string. + +This is functionally equivalent to concatenating the string format of both +integrity arguments, and calling [`ssri.parse`](#ssri-parse) on the new string. + +If `opts.strict` is true, the new `Integrity` will be created using strict +parsing rules. See [`ssri.parse`](#parse). + +##### Example + +```javascript +// This will combine the integrity checks for two different versions of +// your index.js file so you can use a single integrity string and serve +// either of these to clients, from a single `